function, namely
c A signed char value.
C An unsigned char value.
s A signed short value.
S An unsigned short value.
i A signed integer value.
I An unsigned integer value.
l A signed long value.
L An unsigned long value.
f A single-precision float.
d A double-precision float.
p A pointer.
v No value (only valid as a return type).
Note that all of the above codes refer to "native" format values.
The C code as an argument type simply passes the address of the Perl
value's memory to the foreign function. It is the caller's responsibility to
be sure that the called function does not overwrite memory outside that
allocated by Perl.
The C
code as a return type treats the returned value as a null-terminated
string, and passes it back to Perl as such. There is currently no support for
functions which return pointers to structures, or to other blocks of memory
which do not contain strings, nor for functions which return memory which the
caller must free.
To pass pointers to strings, use the C
code. Perl ensures that strings are
null-terminated for you. To pass pointers to structures, use L. To pass
an arbitrary block of memory, use something like the following:
$buf = ' ' x 100;
# Use $buf via a 'p' parameter as a 100-byte memory block
At the present time, there is no direct support for passing pointers to
'native' types (like int). To work around this, use C<$buf = pack('i', 12);>
to put an integer into a block of memory, then use the C pointer type, and
obtain any returned value using C<$n = unpack('i', $buf);> In the future,
better support may be added (but remember that this is intended as a low-level
interface!)
=head1 EXAMPLES
It is somewhat difficult to provide examples of using this module in
isolation, as it is necessary to (somehow) obtain the address of a function to
call. In general, this task is delegated to higher-level wrapper modules.
However, the standard C module returns symbol references via the
C function. While these references are not
documented as being addresses, in practice, they seem to be. Code to obtain
the address of various C library functions can be built around this
$clib_file = ($^O eq "MSWin32") ? "MSVCRT40.DLL" : "-lc";
$clib = DynaLoader::dl_findfile($clib_file);
$strlen = DynaLoader::dl_find_symbol($clib, "strlen");
$n = FFI::call($strlen, "cIp", $my_string);
DynaLoader::dl_free_file($clib);
Clearly, code like this needs to be encapsulated in a module of some form...
NOTE: In fact, the DynaLoader interface has problems in ActiveState Perl, and
probably in other binary distributions of Perl. (The issue is related to the
way in which the DynaLoader module is built, and may be addressed in future
versions of Perl). In the interim, the higher-level wrapper module
FFI::Library does not use DynaLoader on Win32 - it uses the (deprecated, but
still available) Win32::LoadLibrary and related calls.
=head1 TODO
=over 4
=item *
Improve support for returning pointers to things other than null-terminated
strings.
=item *
Possibly, improve support for passing pointers to "native" types.
=back
=head1 LICENSE
The underlying library for this module is licensed under the GNU General Public
License. At the moment, some of that code is still distributed with this module,
so under the terms of that license, my understanding is that this module
has to be distrubuted under that same license. However, the code from the
original library is now distributed under L, so it is likely
that the remaining code that is licensed under the GPL will be removed and
future releases of this module will have a more relaxed license.
=head1 STATUS
This is a maintenance release. The future of this module is not entirely
certain at the moment, but you can see the latest development at
L and/or
L.
=head1 AUTHOR
Paul Moore, C<< >> is the original author
of L.
Mitchell Charity C<< >> and
Reini Urban C<< >> contributed fixes.
David Mertens C<< >> created L and
updated this module to use it.
David Mertens C<< >>, Anatoly Vorobey
C<< >> and Gaal Yahas C<< >> are the
current maintainers.
=head1 SEE ALSO
L
Bruno Haible's CLisp Common Lisp implementation, from which the underlying
foreign function interface code was taken.
=cut