annotate dyncallback/dyncallback.3 @ 0:3e629dc19168

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:24:28 +0100
parents
children c40e9fcccc41
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 .\" Copyright (c) 2007-2014 Daniel Adler <dadler AT uni-goettingen DOT de>,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2 .\" Tassilo Philipp <tphilipp AT potion-studios DOT com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 .\"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 .\" Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 .\" purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 .\" copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 .\"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8 .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 .\"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 .Dd $Mdocdate$
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 .Dt dyncallback 3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 .Os
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 .Sh NAME
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 .Nm dyncallback
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 .Nd callback interface of dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 .Sh SYNOPSIS
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23 .In dyncall_callback.h
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 .Ft DCCallback *
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25 .Fn dcbNewCallback "const char * signature" "DCCallbackHandler * funcptr" "void * userdata"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26 .Ft void
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27 .Fn dcbInitCallback "DCCallback * pcb" "const char * signature" "DCCallbackHandler * funcptr" "void * userdata"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 .Ft void
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 .Fn dcbFreeCallback "DCCallback * pcb"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 .Ft void
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 .Fn dcbGetUserData "DCCallback * pcb"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 .Sh DESCRIPTION
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 The
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 .Nm
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 dyncall library has an interface to create callback objects, that can be passed
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 to functions as callback arguments. In other words, a pointer to the callback
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 object can be "called", directly. The callback handler then allows iterating
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 dynamically over the arguments once called back.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 .Pp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 .Fn dcbNewCallback
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 creates a new callback object, where
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 .Ar signature
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 is a signature string describing the function to be called back (see manual for
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 format). This is needed for
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 .Nm
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 dyncallback to correctly prepare the arguments passed in by the function that
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 calls the callback handler. Note that the handler doesn't return the value
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 specified in the signature, directly, but simply 'i' or 'f' depending on whether
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 it is a integral or floating point type. The return value itself is stored
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 where the handler's 3rd parameter points to (see example).
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 .Ar funcptr
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 is a pointer to the
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 .Nm
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 dyncallback callback handler (see below), and
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 .Ar userdata
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 a pointer to arbitrary user data you want to use in the callback handler.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 Use the returned pointer as callback argument in functions requiring a callback
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 function pointer.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 .Pp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 .Fn dcbInitCallback
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 (re)initialize the callback object.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 .Pp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 .Fn dcbFreeCallback
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 destroys and frees the callback handler.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 .Pp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 .Fn dcbGetUserData
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 returns a pointer to the userdata passed to the callback object on creation or
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 initialization.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 .Pp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 Declaration of a dyncallback handler (following function pointer definition in
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 dyncallback/dyncall_callback.h):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 .Bd -literal -offset indent
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 char cbHandler(DCCallback* cb,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 DCArgs* args,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 DCValue* result,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 void* userdata);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 .Ed
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 .Pp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 .Ar cb is a pointer to the DCCallback object in use
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 .Nm
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 result is a pointer to a DCValue object in order to store the callback's
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 return value (output, to be set by handler). Finally,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 .Ar userdata is a pointer to some user defined data that can be
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 set when creating the callback object.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 The handler itself returns a signature character (see manual for format)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 specifying the data type used for
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 .Ar result .
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 .Sh EXAMPLE
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 Let's say, we want to create a callback object and call it. For simplicity, this
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 example will omit passing it as a function pointer to a function (e.g. compar
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 in qsort(), etc.) and demonstrate calling it, directly. First, we need to define
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 our callback handler - the following handler illustrates how to access the passed-
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 in arguments:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 .Bd -literal -offset indent
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 char cbHandler(DCCallback* cb,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 DCArgs* args,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 DCValue* result,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 void* userdata)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 int* ud = (int*)userdata;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 int arg1 = dcbArgInt (args);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 float arg2 = dcbArgFloat (args);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 short arg3 = dcbArgShort (args);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 double arg4 = dcbArgDouble (args);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 long long arg5 = dcbArgLongLong(args);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 // .. do something ..
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 result->s = 1244;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 return 'i';
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 .Ed
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 .Pp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 Note that the return value of the handler is a signature character, not the
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 actual return value, itself, and note that the actual return value is of type
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 short.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 Now, let's call it through a DCCallback object:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118 .Bd -literal -offset indent
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 DCCallback* cb;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 short result = 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 int userdata = 1337;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 cb = dcbNewCallback("ifsdl)s", &cbHandler, &userdata);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 result = ((short(*)(int, float, short, double, long long))cb)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 (123, 23.f, 3, 1.82, 9909ll);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 dcbFreeCallback(cb);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 .Ed
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 .Sh SEE ALSO
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 .Xr dyncall 3 ,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 .Xr dynload 3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 and the dyncall manual (available in PDF format) for a way more detailed documentation of this
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 library.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 .Sh AUTHORS
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 .An "Daniel Adler" Aq dadler@uni-goettingen.de
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 .An "Tassilo Philipp" Aq tphilipp@potion-studios.com