Mercurial > pub > dyncall > dyncall
annotate test/callback_suite/do_test.c @ 487:d8f0e6cecdab
- simplified test/callback_suite
author | Tassilo Philipp |
---|---|
date | Fri, 18 Mar 2022 09:47:18 +0100 |
parents | 7608e34098b0 |
children |
rev | line source |
---|---|
0 | 1 /* |
2 | |
3 Package: dyncall | |
4 Library: test | |
5 File: test/callback_suite/do_test.c | |
6 Description: | |
7 License: | |
8 | |
281 | 9 Copyright (c) 2011-2018 Daniel Adler <dadler@uni-goettingen.de>, |
0 | 10 Tassilo Philipp <tphilipp@potion-studios.com> |
11 | |
12 Permission to use, copy, modify, and distribute this software for any | |
13 purpose with or without fee is hereby granted, provided that the above | |
14 copyright notice and this permission notice appear in all copies. | |
15 | |
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
23 | |
24 */ | |
25 | |
26 #include <assert.h> | |
487 | 27 #include <stdio.h> |
0 | 28 #include "dyncall_callback.h" |
29 #include "env.h" | |
487 | 30 |
0 | 31 |
487 | 32 /* arguments filled-in by callback handlers, and return value */ |
33 DCValue Args[CONFIG_MAXARGS]; | |
34 DCValue Result; | |
35 | |
36 | |
37 static int CompareValues(char type, DCValue* a, DCValue* b) | |
0 | 38 { |
39 switch(type) | |
40 { | |
487 | 41 case DC_SIGCHAR_BOOL: return (a->B == b->B); |
42 case DC_SIGCHAR_CHAR: return (a->c == b->c); | |
43 case DC_SIGCHAR_UCHAR: return (a->C == b->C); | |
44 case DC_SIGCHAR_SHORT: return (a->s == b->s); | |
45 case DC_SIGCHAR_USHORT: return (a->S == b->S); | |
46 case DC_SIGCHAR_INT: return (a->i == b->i); | |
47 case DC_SIGCHAR_UINT: return (a->I == b->I); | |
48 case DC_SIGCHAR_LONG: return (a->j == b->j); | |
49 case DC_SIGCHAR_ULONG: return (a->J == b->J); | |
50 case DC_SIGCHAR_LONGLONG: return (a->l == b->l); | |
51 case DC_SIGCHAR_ULONGLONG: return (a->L == b->L); | |
52 case DC_SIGCHAR_FLOAT: return (a->f == b->f); | |
53 case DC_SIGCHAR_DOUBLE: return (a->d == b->d); | |
54 case DC_SIGCHAR_POINTER: return (a->p == b->p); | |
0 | 55 default: assert(0); |
56 } | |
487 | 57 return 0; |
0 | 58 } |
59 | |
487 | 60 |
61 static int Compare(const char* signature) | |
0 | 62 { |
63 DCValue ref; | |
64 int total = 1; | |
65 int pos; | |
66 int isequal; | |
67 char ch; | |
68 | |
69 /* check arguments */ | |
70 pos = 0; | |
487 | 71 for(;;) |
72 { | |
73 ch = *signature++; | |
74 | |
75 if(ch == DC_SIGCHAR_CC_PREFIX) { | |
76 ++signature; /* skip cconv prefix */ | |
77 continue; | |
78 } | |
0 | 79 |
487 | 80 if (!ch || ch == DC_SIGCHAR_ENDARG) break; |
0 | 81 GetReferenceArg(&ref, ch, pos); |
82 isequal = CompareValues( ch, &ref, &Args[pos] ); | |
83 if ( !isequal ) { | |
84 if (OptionVerbose) { total = 0; fprintf(stdout, " @%d[%c] ", pos, ch); } | |
85 else return 0; | |
86 } | |
487 | 87 ++pos; |
0 | 88 } |
89 | |
487 | 90 if(ch == DC_SIGCHAR_ENDARG) |
91 ch = *signature; | |
0 | 92 |
93 /* check result */ | |
94 | |
95 GetReferenceResult(&ref, ch); | |
96 | |
97 isequal = CompareValues(ch, &ref, &Result); | |
98 if (!isequal) { | |
99 if (OptionVerbose) { total = 0; fprintf(stdout, " @-1 "); } | |
100 else return 0; | |
101 } | |
102 | |
103 return total; | |
104 } | |
105 | |
106 | |
487 | 107 static char handler(DCCallback* that, DCArgs* input, DCValue* output, void* userdata) |
108 { | |
109 const char* signature = (const char*) userdata; | |
110 int pos = 0; | |
111 char ch; | |
112 | |
113 for(;;) { | |
114 ch = *signature++; | |
115 if (!ch || ch == DC_SIGCHAR_ENDARG) break; | |
116 Args[pos].L = 0xDEADC0DECAFEBABELL; | |
117 switch(ch) { | |
118 case DC_SIGCHAR_BOOL: Args[pos].B = dcbArgBool (input); break; | |
119 case DC_SIGCHAR_CHAR: Args[pos].c = dcbArgChar (input); break; | |
120 case DC_SIGCHAR_UCHAR: Args[pos].C = dcbArgUChar (input); break; | |
121 case DC_SIGCHAR_SHORT: Args[pos].s = dcbArgShort (input); break; | |
122 case DC_SIGCHAR_USHORT: Args[pos].S = dcbArgUShort (input); break; | |
123 case DC_SIGCHAR_INT: Args[pos].i = dcbArgInt (input); break; | |
124 case DC_SIGCHAR_UINT: Args[pos].I = dcbArgUInt (input); break; | |
125 case DC_SIGCHAR_LONG: Args[pos].j = dcbArgLong (input); break; | |
126 case DC_SIGCHAR_ULONG: Args[pos].J = dcbArgULong (input); break; | |
127 case DC_SIGCHAR_LONGLONG: Args[pos].l = dcbArgLongLong (input); break; | |
128 case DC_SIGCHAR_ULONGLONG:Args[pos].L = dcbArgULongLong(input); break; | |
129 case DC_SIGCHAR_FLOAT: Args[pos].f = dcbArgFloat (input); break; | |
130 case DC_SIGCHAR_DOUBLE: Args[pos].d = dcbArgDouble (input); break; | |
131 case DC_SIGCHAR_STRING: | |
132 case DC_SIGCHAR_POINTER: Args[pos].p = dcbArgPointer (input); break; | |
133 case DC_SIGCHAR_CC_PREFIX: ++signature; /* skip cconv prefix */ continue; | |
134 } | |
135 ++pos; | |
136 } | |
137 | |
138 if(ch == DC_SIGCHAR_ENDARG) | |
139 ch = *signature; | |
140 | |
141 /* @@@ unsupported result types or missing retval sig char */ | |
142 switch(ch) { | |
143 case DC_SIGCHAR_BOOL: | |
144 case DC_SIGCHAR_CHAR: | |
145 case DC_SIGCHAR_UCHAR: | |
146 case DC_SIGCHAR_SHORT: | |
147 case DC_SIGCHAR_USHORT: | |
148 case DC_SIGCHAR_INT: | |
149 case DC_SIGCHAR_UINT: | |
150 case DC_SIGCHAR_LONG: | |
151 case DC_SIGCHAR_ULONG: | |
152 case DC_SIGCHAR_LONGLONG: | |
153 case DC_SIGCHAR_ULONGLONG: | |
154 case DC_SIGCHAR_FLOAT: | |
155 case DC_SIGCHAR_DOUBLE: | |
156 case DC_SIGCHAR_STRING: | |
157 case DC_SIGCHAR_POINTER: | |
158 break; | |
159 case DC_SIGCHAR_VOID: | |
160 case DC_SIGCHAR_AGGREGATE: | |
161 default: | |
162 assert(0); return 'v'; | |
163 } | |
164 | |
165 GetReferenceResult(output, ch); | |
166 | |
167 return ch; | |
168 } | |
169 | |
170 | |
171 /* index range: [0,CONFIG_NSIGS[ */ | |
172 static const char* GetSignature(int index) | |
173 { | |
174 static const char* sigstrings[CONFIG_NSIGS] = { | |
175 #include "_auto_sigstrings.h" | |
176 }; | |
177 | |
178 return sigstrings[index]; | |
179 } | |
180 | |
181 | |
182 #define X(CH,T) typedef T CH; | |
183 DEF_TYPES | |
184 #undef X | |
185 | |
186 #define M ValueMatrix | |
187 #include "_auto_invoke_macros.h" | |
188 #include "_auto_invokers.h" | |
189 #undef M | |
190 | |
191 void (*invokers[CONFIG_NSIGS])(void*) = { | |
192 #include "_auto_invoke_table.h" | |
193 }; | |
194 | |
195 | |
0 | 196 |
197 int DoTest(int id) | |
198 { | |
199 const char* signature; | |
200 DCCallback* pcb; | |
487 | 201 int result, index = id - 1; |
0 | 202 |
203 signature = GetSignature(index); | |
410
7608e34098b0
- cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents:
281
diff
changeset
|
204 printf("f%d(\t%s", id, signature); |
0 | 205 |
487 | 206 pcb = dcbNewCallback(signature, handler, (void*)signature, NULL); |
0 | 207 assert(pcb != NULL); |
487 | 208 |
209 /* invoke call */ | |
210 invokers[index]((void*)pcb); | |
211 | |
0 | 212 result = Compare(signature); |
410
7608e34098b0
- cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents:
281
diff
changeset
|
213 printf(" :%d\n", result); |
0 | 214 dcbFreeCallback(pcb); |
487 | 215 |
0 | 216 return result; |
217 } | |
218 |