X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=doc%2Fmanual%2Fffi.texinfo;h=73871eb6e07c21772fabc4cbeebacf389ab0a5e4;hb=31481ad7a664585715d60fbdeee153c5c5343400;hp=c8bc8d5ffc7fa836f72dc4c9f42ed366fe41fb94;hpb=1cae060fd9735f9c1f63538969e68c99b48f46e6;p=sbcl.git diff --git a/doc/manual/ffi.texinfo b/doc/manual/ffi.texinfo index c8bc8d5..73871eb 100644 --- a/doc/manual/ffi.texinfo +++ b/doc/manual/ffi.texinfo @@ -3,7 +3,7 @@ @chapter Foreign Function Interface This chapter describes SBCL's interface to C programs and -libraries (and, since C interfaces are a sort of @emph{ingua +libraries (and, since C interfaces are a sort of @emph{lingua franca} of the Unix world, to other programs and libraries in general.) @@ -196,8 +196,10 @@ variables. Dynamic arrays can only be allocated using The foreign type specifier @code{(sb-alien:struct @var{name} &rest @var{fields})} describes a structure type with the specified @var{name} and @var{fields}. Fields are allocated at the same offsets -used by the implementation's C compiler. If @var{name} is @code{nil} -then the structure is anonymous. +used by the implementation's C compiler, as guessed by the SBCL +internals. An optional @code{:alignment} keyword argument can be +specified for each field to explicitly control the alignment of a +field. If @var{name} is @code{nil} then the structure is anonymous. If a named foreign @code{struct} specifier is passed to @code{define-alien-type} or @code{with-alien}, then this defines, @@ -282,12 +284,14 @@ return zero values. @item The foreign type specifier @code{sb-alien:c-string} is similar to -@code{(* char)}, but is interpreted as a null-terminated string, and -is automatically converted into a Lisp string when accessed; or if the +@code{(* char)}, but is interpreted as a null-terminated string, and is +automatically converted into a Lisp string when accessed; or if the pointer is C @code{NULL} or @code{0}, then accessing it gives Lisp -@code{nil}. Lisp strings are stored with a trailing NUL -termination, so no copying (either by the user or the implementation) -is necessary when passing them to foreign code. +@code{nil}. Lisp strings of type @code{base-string} are stored with a +trailing NUL termination, so no copying (either by the user or the +implementation) is necessary when passing them to foreign code; strings +of type @code{(simple-array character (*))} are copied by the +implementation as required. Assigning a Lisp string to a @code{c-string} structure field or variable stores the contents of the string to the memory already @@ -1182,8 +1186,8 @@ routine, e.g.: @samp{cc -c test.c && ld -shared -o test.so test.o} (In order to enable incremental loading with some linkers, you may need to say @samp{cc -G 0 -c test.c}) -Once the C code has been compiled, you can start up Lisp and load it -in: @samp{sbcl} Lisp should start up with its normal prompt. +Once the C code has been compiled, you can start up Lisp and load it in: +@samp{sbcl}. Lisp should start up with its normal prompt. Within Lisp, compile the Lisp file. (This step can be done separately. You don't have to recompile every time.)