I have a sophisticated library written in optimized c (library.c):
#include <stdio.h>
#include "library.h"
void make_fullname(char* fullname, char* name, int version) {
sprintf(fullname, "%s-%d", name, version);
printf("lib-name: %s\n", name);
printf("lib-fullname: %s\n", fullname);
}
where library.h contains
void make_fullname(char* fullname, char* name, int version);
The library is compiled as follows:
gcc library.c -o library.so -shared
I am trying to make use of it from SBCL, here is my final take (the one on which I give up and turn to stackoverflow):
(load-shared-object "library.so")
(define-alien-routine make_fullname void
(fullname (c-string :external-format :ascii))
(name (c-string :external-format :ascii))
(x int))
(defun print-name-version (name version)
(with-alien ((fullname (c-string :external-format :ascii)))
(setf fullname (make-alien char 100))
(setf fullname "dummy-string")
(make_fullname fullname name version)
(format t "~a~%" fullname)))
Upon running, e.g., (print-name-version "Program" 1) I get this
lib-name: Program
lib-fullname: Program-1
dummy-string
NIL
So, everything works except for passing the string back into lisp. What is amiss in this example? Thanks, Andrei.
Update I have got my lisp code to work, but I still don't really get why the original snippet fails. Here is a working one:
(defun print-name-version (name version)
(let ((fullname (make-alien char 100)))
(make_fullname fullname name version)
(with-alien ((fn-str-repr (c-string :external-format :ascii) fullname))
(format t "~a~%" fn-str-repr))
(free-alien fullname)))