|
.Dd February 15, 2008 |
|
.Dt ffi_call 3 |
|
.Sh NAME |
|
.Nm ffi_call |
|
.Nd Invoke a foreign function. |
|
.Sh SYNOPSIS |
|
.In ffi.h |
|
.Ft void |
|
.Fo ffi_call |
|
.Fa "ffi_cif *cif" |
|
.Fa "void (*fn)(void)" |
|
.Fa "void *rvalue" |
|
.Fa "void **avalue" |
|
.Fc |
|
.Sh DESCRIPTION |
|
The |
|
.Nm ffi_call |
|
function provides a simple mechanism for invoking a function without |
|
requiring knowledge of the function's interface at compile time. |
|
.Fa fn |
|
is called with the values retrieved from the pointers in the |
|
.Fa avalue |
|
array. The return value from |
|
.Fa fn |
|
is placed in storage pointed to by |
|
.Fa rvalue . |
|
.Fa cif |
|
contains information describing the data types, sizes and alignments of the |
|
arguments to and return value from |
|
.Fa fn , |
|
and must be initialized with |
|
.Nm ffi_prep_cif |
|
before it is used with |
|
.Nm ffi_call . |
|
.Pp |
|
.Fa rvalue |
|
must point to storage that is sizeof(ffi_arg) or larger for non-floating point |
|
types. For smaller-sized return value types, the |
|
.Nm ffi_arg |
|
or |
|
.Nm ffi_sarg |
|
integral type must be used to hold |
|
the return value. |
|
.Sh EXAMPLES |
|
.Bd -literal |
|
|
|
|
|
|
|
unsigned char |
|
foo(unsigned int, float); |
|
|
|
int |
|
main(int argc, const char **argv) |
|
{ |
|
ffi_cif cif; |
|
ffi_type *arg_types[2]; |
|
void *arg_values[2]; |
|
ffi_status status; |
|
|
|
// Because the return value from foo() is smaller than sizeof(long), it |
|
// must be passed as ffi_arg or ffi_sarg. |
|
ffi_arg result; |
|
|
|
// Specify the data type of each argument. Available types are defined |
|
// in <ffi/ffi.h>. |
|
arg_types[0] = &ffi_type_uint; |
|
arg_types[1] = &ffi_type_float; |
|
|
|
// Prepare the ffi_cif structure. |
|
if ((status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, |
|
2, &ffi_type_uint8, arg_types)) != FFI_OK) |
|
{ |
|
// Handle the ffi_status error. |
|
} |
|
|
|
// Specify the values of each argument. |
|
unsigned int arg1 = 42; |
|
float arg2 = 5.1; |
|
|
|
arg_values[0] = &arg1; |
|
arg_values[1] = &arg2; |
|
|
|
// Invoke the function. |
|
ffi_call(&cif, FFI_FN(foo), &result, arg_values); |
|
|
|
// The ffi_arg 'result' now contains the unsigned char returned from foo(), |
|
// which can be accessed by a typecast. |
|
printf("result is %hhu", (unsigned char)result); |
|
|
|
return 0; |
|
} |
|
|
|
// The target function. |
|
unsigned char |
|
foo(unsigned int x, float y) |
|
{ |
|
unsigned char result = x - y; |
|
return result; |
|
} |
|
.Ed |
|
.Sh SEE ALSO |
|
.Xr ffi 3 , |
|
.Xr ffi_prep_cif 3 |
|
|