Mercurial > pub > dyncall > dyncall
comparison test/call_suite/main.c @ 429:2b708397bba1
- simplified and decluttered test/call_suite
author | Tassilo Philipp |
---|---|
date | Mon, 17 Jan 2022 11:36:09 +0100 |
parents | 7608e34098b0 |
children | 23b12c7ad462 |
comparison
equal
deleted
inserted
replaced
428:72024b0957c2 | 429:2b708397bba1 |
---|---|
28 #include <string.h> | 28 #include <string.h> |
29 #include "../common/platformInit.h" | 29 #include "../common/platformInit.h" |
30 #include "../common/platformInit.c" /* Impl. for functions only used in this translation unit */ | 30 #include "../common/platformInit.c" /* Impl. for functions only used in this translation unit */ |
31 | 31 |
32 | 32 |
33 char linebuf[1024]; | |
34 void* G_callvm; | 33 void* G_callvm; |
34 | |
35 | |
36 int invoke(char const* signature, void* t) | |
37 { | |
38 DCCallVM * p = (DCCallVM*) G_callvm; | |
39 char const * sig = signature; | |
40 char rtype; | |
41 char atype; | |
42 int pos = 0; | |
43 int s = 0; | |
44 | |
45 clear_V(); | |
35 | 46 |
36 int run_test(int i) { | 47 rtype = *sig++; |
48 dcReset(p); | |
49 | |
50 while ( (atype = *sig++) != '\0') { | |
51 pos++; | |
52 switch(atype) { | |
53 case 'c': dcArgChar (p,K_c[pos]); break; | |
54 case 's': dcArgShort (p,K_s[pos]); break; | |
55 case 'i': dcArgInt (p,K_i[pos]); break; | |
56 case 'j': dcArgLong (p,K_j[pos]); break; | |
57 case 'l': dcArgLongLong(p,K_l[pos]); break; | |
58 case 'p': dcArgPointer (p,K_p[pos]); break; | |
59 case 'f': dcArgFloat (p,K_f[pos]); break; | |
60 case 'd': dcArgDouble (p,K_d[pos]); break; | |
61 default: printf("unknown atype '%c' (1) ;", atype); return 0; | |
62 } | |
63 } | |
64 | |
65 switch(rtype) | |
66 { | |
67 case 'v': dcCallVoid(p,t); s=1; /*TODO:check that no return-arg was touched.*/ break; | |
68 case 'c': s = (dcCallChar (p,t) == K_c[pos]) ; break; | |
69 case 's': s = (dcCallShort (p,t) == K_s[pos]) ; break; | |
70 case 'i': s = (dcCallInt (p,t) == K_i[pos]) ; break; | |
71 case 'j': s = (dcCallLong (p,t) == K_j[pos]) ; break; | |
72 case 'l': s = (dcCallLongLong(p,t) == K_l[pos]) ; break; | |
73 case 'p': s = (dcCallPointer (p,t) == K_p[pos]) ; break; | |
74 case 'f': s = (dcCallFloat (p,t) == K_f[pos]) ; break; | |
75 case 'd': s = (dcCallDouble (p,t) == K_d[pos]) ; break; | |
76 default: printf("unknown rtype '%c'", rtype); return 0; | |
77 } | |
78 | |
79 if (!s) { printf("rval wrong;"); return 0; } | |
80 /* test: */ | |
81 sig = signature+1; | |
82 pos = 1; | |
83 while ( (atype = *sig++) != '\0') { | |
84 switch(atype) { | |
85 case 'c': s = ( V_c[pos] == K_c[pos] ); if (!s) printf("'c':%d: %d != %d ; ", pos, V_c[pos], K_c[pos]); break; | |
86 case 's': s = ( V_s[pos] == K_s[pos] ); if (!s) printf("'s':%d: %d != %d ; ", pos, V_s[pos], K_s[pos]); break; | |
87 case 'i': s = ( V_i[pos] == K_i[pos] ); if (!s) printf("'i':%d: %d != %d ; ", pos, V_i[pos], K_i[pos]); break; | |
88 case 'j': s = ( V_j[pos] == K_j[pos] ); if (!s) printf("'j':%d: %ld != %ld ; ", pos, V_j[pos], K_j[pos]); break; | |
89 case 'l': s = ( V_l[pos] == K_l[pos] ); if (!s) printf("'l':%d: %lld != %lld ; ", pos, V_l[pos], K_l[pos]); break; | |
90 case 'p': s = ( V_p[pos] == K_p[pos] ); if (!s) printf("'p':%d: %lld != %lld ; ", pos, (long long) V_p[pos], (long long) K_p[pos]); break; | |
91 case 'f': s = ( V_f[pos] == K_f[pos] ); if (!s) printf("'f':%d: %f != %f ; ", pos, V_f[pos], K_f[pos]); break; | |
92 case 'd': s = ( V_d[pos] == K_d[pos] ); if (!s) printf("'d':%d: %f != %f ; ", pos, V_d[pos], K_d[pos]); break; | |
93 default: printf("unknown atype '%c' ; ", atype); return 0; | |
94 } | |
95 if (!s) { | |
96 printf("arg mismatch at %d ; ", pos); | |
97 return 0; | |
98 } | |
99 pos++; | |
100 } | |
101 return 1; | |
102 } | |
103 | |
104 int run_test(int i) | |
105 { | |
37 char const * sig; | 106 char const * sig; |
38 void * target; | 107 void * target; |
39 int success; | 108 int success; |
40 sig = G_sigtab[i]; | 109 sig = G_sigtab[i]; |
41 target = (void*) G_funtab[i]; | 110 target = (void*) G_funtab[i]; |
43 success = invoke(sig,target); | 112 success = invoke(sig,target); |
44 printf("%d\n",success); | 113 printf("%d\n",success); |
45 return success; | 114 return success; |
46 } | 115 } |
47 | 116 |
48 int run_all() { | 117 int run_all() |
118 { | |
49 int i; | 119 int i; |
50 int failure = 0; | 120 int failure = 0; |
51 for(i=0;i<G_ncases;++i) { | 121 for(i=0;i<G_ncases;++i) |
52 failure |= !( run_test(i) ); | 122 failure |= !( run_test(i) ); |
53 } | 123 |
54 return !failure; | 124 return !failure; |
55 } | 125 } |
56 | 126 |
57 int main(int argc, char* argv[]) | 127 int main(int argc, char* argv[]) |
58 { | 128 { |