123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- .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
- #include <ffi.h>
- #include <stdio.h>
- 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
|