annotate libffi/man/ffi_call.3 @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 .Dd February 15, 2008
kono
parents:
diff changeset
2 .Dt ffi_call 3
kono
parents:
diff changeset
3 .Sh NAME
kono
parents:
diff changeset
4 .Nm ffi_call
kono
parents:
diff changeset
5 .Nd Invoke a foreign function.
kono
parents:
diff changeset
6 .Sh SYNOPSIS
kono
parents:
diff changeset
7 .In ffi.h
kono
parents:
diff changeset
8 .Ft void
kono
parents:
diff changeset
9 .Fo ffi_call
kono
parents:
diff changeset
10 .Fa "ffi_cif *cif"
kono
parents:
diff changeset
11 .Fa "void (*fn)(void)"
kono
parents:
diff changeset
12 .Fa "void *rvalue"
kono
parents:
diff changeset
13 .Fa "void **avalue"
kono
parents:
diff changeset
14 .Fc
kono
parents:
diff changeset
15 .Sh DESCRIPTION
kono
parents:
diff changeset
16 The
kono
parents:
diff changeset
17 .Nm ffi_call
kono
parents:
diff changeset
18 function provides a simple mechanism for invoking a function without
kono
parents:
diff changeset
19 requiring knowledge of the function's interface at compile time.
kono
parents:
diff changeset
20 .Fa fn
kono
parents:
diff changeset
21 is called with the values retrieved from the pointers in the
kono
parents:
diff changeset
22 .Fa avalue
kono
parents:
diff changeset
23 array. The return value from
kono
parents:
diff changeset
24 .Fa fn
kono
parents:
diff changeset
25 is placed in storage pointed to by
kono
parents:
diff changeset
26 .Fa rvalue .
kono
parents:
diff changeset
27 .Fa cif
kono
parents:
diff changeset
28 contains information describing the data types, sizes and alignments of the
kono
parents:
diff changeset
29 arguments to and return value from
kono
parents:
diff changeset
30 .Fa fn ,
kono
parents:
diff changeset
31 and must be initialized with
kono
parents:
diff changeset
32 .Nm ffi_prep_cif
kono
parents:
diff changeset
33 before it is used with
kono
parents:
diff changeset
34 .Nm ffi_call .
kono
parents:
diff changeset
35 .Pp
kono
parents:
diff changeset
36 .Fa rvalue
kono
parents:
diff changeset
37 must point to storage that is sizeof(ffi_arg) or larger for non-floating point
kono
parents:
diff changeset
38 types. For smaller-sized return value types, the
kono
parents:
diff changeset
39 .Nm ffi_arg
kono
parents:
diff changeset
40 or
kono
parents:
diff changeset
41 .Nm ffi_sarg
kono
parents:
diff changeset
42 integral type must be used to hold
kono
parents:
diff changeset
43 the return value.
kono
parents:
diff changeset
44 .Sh EXAMPLES
kono
parents:
diff changeset
45 .Bd -literal
kono
parents:
diff changeset
46 #include <ffi.h>
kono
parents:
diff changeset
47 #include <stdio.h>
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 unsigned char
kono
parents:
diff changeset
50 foo(unsigned int, float);
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 int
kono
parents:
diff changeset
53 main(int argc, const char **argv)
kono
parents:
diff changeset
54 {
kono
parents:
diff changeset
55 ffi_cif cif;
kono
parents:
diff changeset
56 ffi_type *arg_types[2];
kono
parents:
diff changeset
57 void *arg_values[2];
kono
parents:
diff changeset
58 ffi_status status;
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 // Because the return value from foo() is smaller than sizeof(long), it
kono
parents:
diff changeset
61 // must be passed as ffi_arg or ffi_sarg.
kono
parents:
diff changeset
62 ffi_arg result;
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 // Specify the data type of each argument. Available types are defined
kono
parents:
diff changeset
65 // in <ffi/ffi.h>.
kono
parents:
diff changeset
66 arg_types[0] = &ffi_type_uint;
kono
parents:
diff changeset
67 arg_types[1] = &ffi_type_float;
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 // Prepare the ffi_cif structure.
kono
parents:
diff changeset
70 if ((status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI,
kono
parents:
diff changeset
71 2, &ffi_type_uint8, arg_types)) != FFI_OK)
kono
parents:
diff changeset
72 {
kono
parents:
diff changeset
73 // Handle the ffi_status error.
kono
parents:
diff changeset
74 }
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 // Specify the values of each argument.
kono
parents:
diff changeset
77 unsigned int arg1 = 42;
kono
parents:
diff changeset
78 float arg2 = 5.1;
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 arg_values[0] = &arg1;
kono
parents:
diff changeset
81 arg_values[1] = &arg2;
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 // Invoke the function.
kono
parents:
diff changeset
84 ffi_call(&cif, FFI_FN(foo), &result, arg_values);
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 // The ffi_arg 'result' now contains the unsigned char returned from foo(),
kono
parents:
diff changeset
87 // which can be accessed by a typecast.
kono
parents:
diff changeset
88 printf("result is %hhu", (unsigned char)result);
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 return 0;
kono
parents:
diff changeset
91 }
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 // The target function.
kono
parents:
diff changeset
94 unsigned char
kono
parents:
diff changeset
95 foo(unsigned int x, float y)
kono
parents:
diff changeset
96 {
kono
parents:
diff changeset
97 unsigned char result = x - y;
kono
parents:
diff changeset
98 return result;
kono
parents:
diff changeset
99 }
kono
parents:
diff changeset
100 .Ed
kono
parents:
diff changeset
101 .Sh SEE ALSO
kono
parents:
diff changeset
102 .Xr ffi 3 ,
kono
parents:
diff changeset
103 .Xr ffi_prep_cif 3