comparison test/suite2/main.cc @ 0:3e629dc19168

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:24:28 +0100
parents
children f5577f6bf97a
comparison
equal deleted inserted replaced
-1:000000000000 0:3e629dc19168
1 /*
2
3 Package: dyncall
4 Library: test
5 File: test/suite2/main.cc
6 Description:
7 License:
8
9 Copyright (c) 2007-2015 Daniel Adler <dadler@uni-goettingen.de>,
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
27
28 #include "../../dyncall/dyncall.h"
29 #include "config.h"
30 #include "../../dyncall/dyncall_value.h"
31 #include "funcinfo.h"
32 #include <stdlib.h>
33 #include "../common/platformInit.h"
34 #include "../common/platformInit.c" /* Impl. for functions only used in this translation unit */
35
36 int getId();
37 DCpointer getFunc(int x);
38 DCValue* getArg(int pos);
39
40
41 typedef double precise;
42
43
44 DCbool valueBool [MAXARGS];
45 DCchar valueChar [MAXARGS];
46 DCshort valueShort [MAXARGS];
47 DCint valueInt [MAXARGS];
48 DClonglong valueLongLong[MAXARGS];
49 DCdouble valueDouble [MAXARGS];
50 DCpointer valuePointer [MAXARGS];
51 DCfloat valueFloat [MAXARGS];
52
53
54 void clearValues();
55
56 void error(const char* message)
57 {
58 fprintf(stderr, "error: %s\n", message);
59 exit(-1);
60 }
61
62 void init()
63 {
64 for (int i = 0 ; i < MAXARGS ; ++i ) {
65
66 valueBool[i] = DCbool( (i % 1) ? DC_TRUE : DC_FALSE );
67 valueChar[i] = DCchar(i);
68 valueShort[i] = DCshort(i);
69 valueInt[i] = DCint(i);
70 valueLongLong[i] = DClonglong(i);
71 valueDouble[i] = DCdouble(i);
72 valuePointer[i] = DCpointer( (ptrdiff_t) i);
73 valueFloat[i] = DCfloat(i);
74 }
75 }
76
77
78 bool test(int x)
79 {
80 bool r = true;
81 clearValues();
82
83 DCCallVM* pCall;
84
85 funcinfo* fi = &gFuncInfos[x];
86
87 const DCsigchar* sig = &fi->sig[2];
88 const DCsigchar* ptr = sig;
89 DCsigchar ch;
90 int pos;
91
92 pos = 0;
93
94 pCall = dcNewCallVM(4096);
95 dcReset(pCall);
96
97 while ( (ch=*ptr++) != '\0' ) {
98 switch(ch) {
99 case DC_SIGCHAR_BOOL: dcArgBool ( pCall, valueBool [pos] ); break;
100 case DC_SIGCHAR_CHAR: dcArgChar ( pCall, valueChar [pos] ); break;
101 case DC_SIGCHAR_SHORT: dcArgShort ( pCall, valueShort [pos] ); break;
102 case DC_SIGCHAR_INT: dcArgInt ( pCall, valueInt [pos] ); break;
103 case DC_SIGCHAR_LONGLONG: dcArgLongLong( pCall, valueLongLong[pos] ); break;
104 case DC_SIGCHAR_FLOAT: dcArgFloat ( pCall, valueFloat [pos] ); break;
105 case DC_SIGCHAR_DOUBLE: dcArgDouble ( pCall, valueDouble [pos] ); break;
106 case DC_SIGCHAR_POINTER: dcArgPointer ( pCall, valuePointer [pos] ); break;
107 default: error("unsupported signature character"); break;
108 }
109 ++pos;
110 }
111
112 dcCallVoid( pCall, fi->funcptr );
113
114
115 if ( getId() == x ) {
116
117 ptr = sig;
118 pos = 0;
119 while( ( ch=*ptr++ ) != '\0' ) {
120
121 switch(ch) {
122 case DC_SIGCHAR_BOOL: if ( getArg(pos)->B != valueBool [pos] ) r = false; break;
123 case DC_SIGCHAR_CHAR: if ( getArg(pos)->c != valueChar [pos] ) r = false; break;
124 case DC_SIGCHAR_SHORT: if ( getArg(pos)->s != valueShort [pos] ) r = false; break;
125 case DC_SIGCHAR_INT: if ( getArg(pos)->i != valueInt [pos] ) r = false; break;
126 case DC_SIGCHAR_LONGLONG: if ( getArg(pos)->L != valueLongLong [pos] ) r = false; break;
127 case DC_SIGCHAR_FLOAT: if ( getArg(pos)->f != valueFloat [pos] ) r = false; break;
128 case DC_SIGCHAR_DOUBLE: if ( getArg(pos)->d != valueDouble[pos] ) r = false; break;
129 case DC_SIGCHAR_POINTER: if ( getArg(pos)->p != valuePointer [pos] ) r = false; break;
130 default: error("unsupported signature character"); break;
131 }
132 ++pos;
133 }
134
135 } else {
136 r = false;
137 }
138
139 printf("%d-%s:%d\n", x, sig, r);
140
141 dcFree(pCall);
142
143 return r;
144 }
145
146
147 bool run_range(int from, int to)
148 {
149 bool r = true;
150 for (int i = from ; i < to ; ++i )
151 r &= test(i);
152 return r;
153 }
154
155 extern "C" {
156
157 int main(int argc, char* argv[])
158 {
159 dcTest_initPlatform();
160
161 bool success = false;
162 init();
163 if (argc == 2) {
164 int index = atoi(argv[1]);
165 success = run_range( index, index+1 );
166 } else if (argc == 3) {
167 int from = atoi(argv[1]);
168 int to = atoi(argv[2])+1;
169 success = run_range(from,to);
170 } else {
171 success = run_range(0,NCASES);
172 }
173
174 printf("result: suite2: %s\n", success ? "1" : "0");
175
176 dcTest_deInitPlatform();
177
178 return (success) ? 0 : -1;
179 }
180
181 } // extern "C"
182