annotate dyncall/dyncall_callf.c @ 0:3e629dc19168

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:24:28 +0100
parents
children f2a8dfd795e8
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 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 Library: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: dyncall/dyncall_callf.c
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: formatted call C interface (extension module)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 Copyright (c) 2007-2015 Daniel Adler <dadler@uni-goettingen.de>,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 #include "dyncall_callf.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 // Shareable implementation for argument binding used in ArgF and CallF below.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 static void dcArgF_impl(DCCallVM* vm, const DCsigchar** sigptr, va_list args)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 DCsigchar ch;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 dcReset(vm);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 while((ch=*(*sigptr)++) != '\0' && ch != DC_SIGCHAR_ENDARG) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 switch(ch) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 case DC_SIGCHAR_BOOL: dcArgBool (vm, (DCbool) va_arg(args, DCint )); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 case DC_SIGCHAR_CHAR: dcArgChar (vm, (DCchar) va_arg(args, DCint )); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 case DC_SIGCHAR_UCHAR: dcArgChar (vm, (DCchar)(DCuchar) va_arg(args, DCint )); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 case DC_SIGCHAR_SHORT: dcArgShort (vm, (DCshort) va_arg(args, DCint )); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 case DC_SIGCHAR_USHORT: dcArgShort (vm, (DCshort)(DCushort)va_arg(args, DCint )); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 case DC_SIGCHAR_INT: dcArgInt (vm, (DCint) va_arg(args, DCint )); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 case DC_SIGCHAR_UINT: dcArgInt (vm, (DCint)(DCuint) va_arg(args, DCint )); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 case DC_SIGCHAR_LONG: dcArgLong (vm, (DClong) va_arg(args, DClong )); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 case DC_SIGCHAR_ULONG: dcArgLong (vm, (DCulong) va_arg(args, DClong )); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 case DC_SIGCHAR_LONGLONG: dcArgLongLong(vm, (DClonglong) va_arg(args, DClonglong)); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 case DC_SIGCHAR_ULONGLONG: dcArgLongLong(vm, (DCulonglong) va_arg(args, DClonglong)); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 case DC_SIGCHAR_FLOAT: dcArgFloat (vm, (DCfloat) va_arg(args, DCdouble )); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 case DC_SIGCHAR_DOUBLE: dcArgDouble (vm, (DCdouble) va_arg(args, DCdouble )); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 case DC_SIGCHAR_POINTER: dcArgPointer (vm, (DCpointer) va_arg(args, DCpointer )); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 case DC_SIGCHAR_STRING: dcArgPointer (vm, (DCpointer) va_arg(args, DCpointer )); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 void dcVArgF(DCCallVM* vm, const DCsigchar* signature, va_list args)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 dcArgF_impl(vm, &signature, args);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 void dcArgF(DCCallVM* vm, const DCsigchar* signature, ...)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 va_list va;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 va_start(va, signature);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 dcVArgF(vm,signature,va);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 va_end(va);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 void dcVCallF(DCCallVM* vm, DCValue* result, DCpointer funcptr, const DCsigchar* signature, va_list args)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 const DCsigchar* ptr = signature;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 dcArgF_impl(vm, &ptr, args);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 switch(*ptr) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 case DC_SIGCHAR_VOID: dcCallVoid (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 case DC_SIGCHAR_BOOL: result->B = dcCallBool (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 case DC_SIGCHAR_CHAR: result->c = dcCallChar (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 case DC_SIGCHAR_UCHAR: result->C = (DCuchar)dcCallChar(vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 case DC_SIGCHAR_SHORT: result->s = dcCallShort (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 case DC_SIGCHAR_USHORT: result->S = dcCallShort (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 case DC_SIGCHAR_INT: result->i = dcCallInt (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 case DC_SIGCHAR_UINT: result->I = dcCallInt (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 case DC_SIGCHAR_LONG: result->j = dcCallLong (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 case DC_SIGCHAR_ULONG: result->J = dcCallLong (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 case DC_SIGCHAR_LONGLONG: result->l = dcCallLongLong (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 case DC_SIGCHAR_ULONGLONG: result->L = dcCallLongLong (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 case DC_SIGCHAR_FLOAT: result->f = dcCallFloat (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 case DC_SIGCHAR_DOUBLE: result->d = dcCallDouble (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 case DC_SIGCHAR_POINTER: result->p = dcCallPointer (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 case DC_SIGCHAR_STRING: result->Z = dcCallPointer (vm,funcptr); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 void dcCallF(DCCallVM* vm, DCValue* result, DCpointer funcptr, const DCsigchar* signature, ...)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 va_list va;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 va_start(va, signature);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 dcVCallF(vm,result,funcptr,signature,va);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 va_end(va);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102