1 #include <Python.h>
2
3 /*
4 Backwards compatibility, no longer strictly required:
5 Python2.2 used LONG_LONG instead of PY_LONG_LONG
6 */
7 #if defined(HAVE_LONG_LONG) && !defined(PY_LONG_LONG)
8 #define PY_LONG_LONG LONG_LONG
9 #endif
10
11 #ifdef MS_WIN32
12 #include <windows.h>
13 #endif
14
15 #if defined(MS_WIN32) || defined(__CYGWIN__)
16 #define EXPORT(x) __declspec(dllexport) x
17 #else
18 #define EXPORT(x) x
19 #endif
20
21 /* some functions handy for testing */
22
23 EXPORT(int)
_testfunc_cbk_reg_int(int a,int b,int c,int d,int e,int (* func)(int,int,int,int,int))24 _testfunc_cbk_reg_int(int a, int b, int c, int d, int e,
25 int (*func)(int, int, int, int, int))
26 {
27 return func(a*a, b*b, c*c, d*d, e*e);
28 }
29
30 EXPORT(double)
_testfunc_cbk_reg_double(double a,double b,double c,double d,double e,double (* func)(double,double,double,double,double))31 _testfunc_cbk_reg_double(double a, double b, double c, double d, double e,
32 double (*func)(double, double, double, double, double))
33 {
34 return func(a*a, b*b, c*c, d*d, e*e);
35 }
36
37 /*
38 * This structure should be the same as in test_callbacks.py and the
39 * method test_callback_large_struct. See issues 17310 and 20160: the
40 * structure must be larger than 8 bytes long.
41 */
42
43 typedef struct {
44 unsigned long first;
45 unsigned long second;
46 unsigned long third;
47 } Test;
48
49 EXPORT(void)
_testfunc_cbk_large_struct(Test in,void (* func)(Test))50 _testfunc_cbk_large_struct(Test in, void (*func)(Test))
51 {
52 func(in);
53 }
54
testfunc_array(int values[4])55 EXPORT(void)testfunc_array(int values[4])
56 {
57 printf("testfunc_array %d %d %d %d\n",
58 values[0],
59 values[1],
60 values[2],
61 values[3]);
62 }
63
testfunc_Ddd(double a,double b)64 EXPORT(long double)testfunc_Ddd(double a, double b)
65 {
66 long double result = (long double)(a * b);
67 printf("testfunc_Ddd(%p, %p)\n", &a, &b);
68 printf("testfunc_Ddd(%g, %g)\n", a, b);
69 return result;
70 }
71
testfunc_DDD(long double a,long double b)72 EXPORT(long double)testfunc_DDD(long double a, long double b)
73 {
74 long double result = a * b;
75 printf("testfunc_DDD(%p, %p)\n", &a, &b);
76 printf("testfunc_DDD(%Lg, %Lg)\n", a, b);
77 return result;
78 }
79
testfunc_iii(int a,int b)80 EXPORT(int)testfunc_iii(int a, int b)
81 {
82 int result = a * b;
83 printf("testfunc_iii(%p, %p)\n", &a, &b);
84 return result;
85 }
86
myprintf(char * fmt,...)87 EXPORT(int)myprintf(char *fmt, ...)
88 {
89 int result;
90 va_list argptr;
91 va_start(argptr, fmt);
92 result = vprintf(fmt, argptr);
93 va_end(argptr);
94 return result;
95 }
96
my_strtok(char * token,const char * delim)97 EXPORT(char *)my_strtok(char *token, const char *delim)
98 {
99 return strtok(token, delim);
100 }
101
my_strchr(const char * s,int c)102 EXPORT(char *)my_strchr(const char *s, int c)
103 {
104 return strchr(s, c);
105 }
106
107
my_sqrt(double a)108 EXPORT(double) my_sqrt(double a)
109 {
110 return sqrt(a);
111 }
112
my_qsort(void * base,size_t num,size_t width,int (* compare)(const void *,const void *))113 EXPORT(void) my_qsort(void *base, size_t num, size_t width, int(*compare)(const void*, const void*))
114 {
115 qsort(base, num, width, compare);
116 }
117
_testfunc_ai8(int a[8])118 EXPORT(int *) _testfunc_ai8(int a[8])
119 {
120 return a;
121 }
122
_testfunc_v(int a,int b,int * presult)123 EXPORT(void) _testfunc_v(int a, int b, int *presult)
124 {
125 *presult = a + b;
126 }
127
_testfunc_i_bhilfd(signed char b,short h,int i,long l,float f,double d)128 EXPORT(int) _testfunc_i_bhilfd(signed char b, short h, int i, long l, float f, double d)
129 {
130 /* printf("_testfunc_i_bhilfd got %d %d %d %ld %f %f\n",
131 b, h, i, l, f, d);
132 */
133 return (int)(b + h + i + l + f + d);
134 }
135
_testfunc_f_bhilfd(signed char b,short h,int i,long l,float f,double d)136 EXPORT(float) _testfunc_f_bhilfd(signed char b, short h, int i, long l, float f, double d)
137 {
138 /* printf("_testfunc_f_bhilfd got %d %d %d %ld %f %f\n",
139 b, h, i, l, f, d);
140 */
141 return (float)(b + h + i + l + f + d);
142 }
143
_testfunc_d_bhilfd(signed char b,short h,int i,long l,float f,double d)144 EXPORT(double) _testfunc_d_bhilfd(signed char b, short h, int i, long l, float f, double d)
145 {
146 /* printf("_testfunc_d_bhilfd got %d %d %d %ld %f %f\n",
147 b, h, i, l, f, d);
148 */
149 return (double)(b + h + i + l + f + d);
150 }
151
_testfunc_D_bhilfD(signed char b,short h,int i,long l,float f,long double d)152 EXPORT(long double) _testfunc_D_bhilfD(signed char b, short h, int i, long l, float f, long double d)
153 {
154 /* printf("_testfunc_d_bhilfd got %d %d %d %ld %f %f\n",
155 b, h, i, l, f, d);
156 */
157 return (long double)(b + h + i + l + f + d);
158 }
159
_testfunc_p_p(void * s)160 EXPORT(char *) _testfunc_p_p(void *s)
161 {
162 return (char *)s;
163 }
164
_testfunc_c_p_p(int * argcp,char ** argv)165 EXPORT(void *) _testfunc_c_p_p(int *argcp, char **argv)
166 {
167 return argv[(*argcp)-1];
168 }
169
get_strchr(void)170 EXPORT(void *) get_strchr(void)
171 {
172 return (void *)strchr;
173 }
174
my_strdup(char * src)175 EXPORT(char *) my_strdup(char *src)
176 {
177 char *dst = (char *)malloc(strlen(src)+1);
178 if (!dst)
179 return NULL;
180 strcpy(dst, src);
181 return dst;
182 }
183
my_free(void * ptr)184 EXPORT(void)my_free(void *ptr)
185 {
186 free(ptr);
187 }
188
189 #ifdef HAVE_WCHAR_H
my_wcsdup(wchar_t * src)190 EXPORT(wchar_t *) my_wcsdup(wchar_t *src)
191 {
192 size_t len = wcslen(src);
193 wchar_t *ptr = (wchar_t *)malloc((len + 1) * sizeof(wchar_t));
194 if (ptr == NULL)
195 return NULL;
196 memcpy(ptr, src, (len+1) * sizeof(wchar_t));
197 return ptr;
198 }
199
my_wcslen(wchar_t * src)200 EXPORT(size_t) my_wcslen(wchar_t *src)
201 {
202 return wcslen(src);
203 }
204 #endif
205
206 #ifndef MS_WIN32
207 # ifndef __stdcall
208 # define __stdcall /* */
209 # endif
210 #endif
211
212 typedef struct {
213 int (*c)(int, int);
214 int (__stdcall *s)(int, int);
215 } FUNCS;
216
_testfunc_callfuncp(FUNCS * fp)217 EXPORT(int) _testfunc_callfuncp(FUNCS *fp)
218 {
219 fp->c(1, 2);
220 fp->s(3, 4);
221 return 0;
222 }
223
_testfunc_deref_pointer(int * pi)224 EXPORT(int) _testfunc_deref_pointer(int *pi)
225 {
226 return *pi;
227 }
228
229 #ifdef MS_WIN32
_testfunc_piunk(IUnknown FAR * piunk)230 EXPORT(int) _testfunc_piunk(IUnknown FAR *piunk)
231 {
232 piunk->lpVtbl->AddRef(piunk);
233 return piunk->lpVtbl->Release(piunk);
234 }
235 #endif
236
_testfunc_callback_with_pointer(int (* func)(int *))237 EXPORT(int) _testfunc_callback_with_pointer(int (*func)(int *))
238 {
239 int table[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
240
241 return (*func)(table);
242 }
243
244 #ifdef HAVE_LONG_LONG
_testfunc_q_bhilfdq(signed char b,short h,int i,long l,float f,double d,PY_LONG_LONG q)245 EXPORT(PY_LONG_LONG) _testfunc_q_bhilfdq(signed char b, short h, int i, long l, float f,
246 double d, PY_LONG_LONG q)
247 {
248 return (PY_LONG_LONG)(b + h + i + l + f + d + q);
249 }
250
_testfunc_q_bhilfd(signed char b,short h,int i,long l,float f,double d)251 EXPORT(PY_LONG_LONG) _testfunc_q_bhilfd(signed char b, short h, int i, long l, float f, double d)
252 {
253 return (PY_LONG_LONG)(b + h + i + l + f + d);
254 }
255
_testfunc_callback_i_if(int value,int (* func)(int))256 EXPORT(int) _testfunc_callback_i_if(int value, int (*func)(int))
257 {
258 int sum = 0;
259 while (value != 0) {
260 sum += func(value);
261 value /= 2;
262 }
263 return sum;
264 }
265
_testfunc_callback_q_qf(PY_LONG_LONG value,PY_LONG_LONG (* func)(PY_LONG_LONG))266 EXPORT(PY_LONG_LONG) _testfunc_callback_q_qf(PY_LONG_LONG value,
267 PY_LONG_LONG (*func)(PY_LONG_LONG))
268 {
269 PY_LONG_LONG sum = 0;
270
271 while (value != 0) {
272 sum += func(value);
273 value /= 2;
274 }
275 return sum;
276 }
277
278 #endif
279
280 typedef struct {
281 char *name;
282 char *value;
283 } SPAM;
284
285 typedef struct {
286 char *name;
287 int num_spams;
288 SPAM *spams;
289 } EGG;
290
291 SPAM my_spams[2] = {
292 { "name1", "value1" },
293 { "name2", "value2" },
294 };
295
296 EGG my_eggs[1] = {
297 { "first egg", 1, my_spams }
298 };
299
getSPAMANDEGGS(EGG ** eggs)300 EXPORT(int) getSPAMANDEGGS(EGG **eggs)
301 {
302 *eggs = my_eggs;
303 return 1;
304 }
305
306 typedef struct tagpoint {
307 int x;
308 int y;
309 } point;
310
_testfunc_byval(point in,point * pout)311 EXPORT(int) _testfunc_byval(point in, point *pout)
312 {
313 if (pout) {
314 pout->x = in.x;
315 pout->y = in.y;
316 }
317 return in.x + in.y;
318 }
319
320 EXPORT (int) an_integer = 42;
321
get_an_integer(void)322 EXPORT(int) get_an_integer(void)
323 {
324 return an_integer;
325 }
326
327 EXPORT(double)
integrate(double a,double b,double (* f)(double),long nstep)328 integrate(double a, double b, double (*f)(double), long nstep)
329 {
330 double x, sum=0.0, dx=(b-a)/(double)nstep;
331 for(x=a+0.5*dx; (b-x)*(x-a)>0.0; x+=dx)
332 sum += f(x);
333 return sum/(double)nstep;
334 }
335
336 typedef struct {
337 void (*initialize)(void *(*)(int), void(*)(void *));
338 } xxx_library;
339
_xxx_init(void * (* Xalloc)(int),void (* Xfree)(void *))340 static void _xxx_init(void *(*Xalloc)(int), void (*Xfree)(void *))
341 {
342 void *ptr;
343
344 printf("_xxx_init got %p %p\n", Xalloc, Xfree);
345 printf("calling\n");
346 ptr = Xalloc(32);
347 Xfree(ptr);
348 printf("calls done, ptr was %p\n", ptr);
349 }
350
351 xxx_library _xxx_lib = {
352 _xxx_init
353 };
354
EXPORT(xxx_library)355 EXPORT(xxx_library) *library_get(void)
356 {
357 return &_xxx_lib;
358 }
359
360 #ifdef MS_WIN32
361 /* See Don Box (german), pp 79ff. */
GetString(BSTR * pbstr)362 EXPORT(void) GetString(BSTR *pbstr)
363 {
364 *pbstr = SysAllocString(L"Goodbye!");
365 }
366 #endif
367
368 /*
369 * Some do-nothing functions, for speed tests
370 */
py_func_si(PyObject * self,PyObject * args)371 PyObject *py_func_si(PyObject *self, PyObject *args)
372 {
373 char *name;
374 int i;
375 if (!PyArg_ParseTuple(args, "si", &name, &i))
376 return NULL;
377 Py_INCREF(Py_None);
378 return Py_None;
379 }
380
_py_func_si(char * s,int i)381 EXPORT(void) _py_func_si(char *s, int i)
382 {
383 }
384
py_func(PyObject * self,PyObject * args)385 PyObject *py_func(PyObject *self, PyObject *args)
386 {
387 Py_INCREF(Py_None);
388 return Py_None;
389 }
390
_py_func(void)391 EXPORT(void) _py_func(void)
392 {
393 }
394
395 EXPORT(PY_LONG_LONG) last_tf_arg_s;
396 EXPORT(unsigned PY_LONG_LONG) last_tf_arg_u;
397
398 struct BITS {
399 int A: 1, B:2, C:3, D:4, E: 5, F: 6, G: 7, H: 8, I: 9;
400 short M: 1, N: 2, O: 3, P: 4, Q: 5, R: 6, S: 7;
401 };
402
set_bitfields(struct BITS * bits,char name,int value)403 DL_EXPORT(void) set_bitfields(struct BITS *bits, char name, int value)
404 {
405 switch (name) {
406 case 'A': bits->A = value; break;
407 case 'B': bits->B = value; break;
408 case 'C': bits->C = value; break;
409 case 'D': bits->D = value; break;
410 case 'E': bits->E = value; break;
411 case 'F': bits->F = value; break;
412 case 'G': bits->G = value; break;
413 case 'H': bits->H = value; break;
414 case 'I': bits->I = value; break;
415
416 case 'M': bits->M = value; break;
417 case 'N': bits->N = value; break;
418 case 'O': bits->O = value; break;
419 case 'P': bits->P = value; break;
420 case 'Q': bits->Q = value; break;
421 case 'R': bits->R = value; break;
422 case 'S': bits->S = value; break;
423 }
424 }
425
unpack_bitfields(struct BITS * bits,char name)426 DL_EXPORT(int) unpack_bitfields(struct BITS *bits, char name)
427 {
428 switch (name) {
429 case 'A': return bits->A;
430 case 'B': return bits->B;
431 case 'C': return bits->C;
432 case 'D': return bits->D;
433 case 'E': return bits->E;
434 case 'F': return bits->F;
435 case 'G': return bits->G;
436 case 'H': return bits->H;
437 case 'I': return bits->I;
438
439 case 'M': return bits->M;
440 case 'N': return bits->N;
441 case 'O': return bits->O;
442 case 'P': return bits->P;
443 case 'Q': return bits->Q;
444 case 'R': return bits->R;
445 case 'S': return bits->S;
446 }
447 return 0;
448 }
449
450 static PyMethodDef module_methods[] = {
451 /* {"get_last_tf_arg_s", get_last_tf_arg_s, METH_NOARGS},
452 {"get_last_tf_arg_u", get_last_tf_arg_u, METH_NOARGS},
453 */
454 {"func_si", py_func_si, METH_VARARGS},
455 {"func", py_func, METH_NOARGS},
456 { NULL, NULL, 0, NULL},
457 };
458
459 #define S last_tf_arg_s = (PY_LONG_LONG)c
460 #define U last_tf_arg_u = (unsigned PY_LONG_LONG)c
461
tf_b(signed char c)462 EXPORT(signed char) tf_b(signed char c) { S; return c/3; }
tf_B(unsigned char c)463 EXPORT(unsigned char) tf_B(unsigned char c) { U; return c/3; }
tf_h(short c)464 EXPORT(short) tf_h(short c) { S; return c/3; }
tf_H(unsigned short c)465 EXPORT(unsigned short) tf_H(unsigned short c) { U; return c/3; }
tf_i(int c)466 EXPORT(int) tf_i(int c) { S; return c/3; }
tf_I(unsigned int c)467 EXPORT(unsigned int) tf_I(unsigned int c) { U; return c/3; }
tf_l(long c)468 EXPORT(long) tf_l(long c) { S; return c/3; }
tf_L(unsigned long c)469 EXPORT(unsigned long) tf_L(unsigned long c) { U; return c/3; }
tf_q(PY_LONG_LONG c)470 EXPORT(PY_LONG_LONG) tf_q(PY_LONG_LONG c) { S; return c/3; }
tf_Q(unsigned PY_LONG_LONG c)471 EXPORT(unsigned PY_LONG_LONG) tf_Q(unsigned PY_LONG_LONG c) { U; return c/3; }
tf_f(float c)472 EXPORT(float) tf_f(float c) { S; return c/3; }
tf_d(double c)473 EXPORT(double) tf_d(double c) { S; return c/3; }
tf_D(long double c)474 EXPORT(long double) tf_D(long double c) { S; return c/3; }
475
476 #ifdef MS_WIN32
EXPORT(signed char)477 EXPORT(signed char) __stdcall s_tf_b(signed char c) { S; return c/3; }
EXPORT(unsigned char)478 EXPORT(unsigned char) __stdcall s_tf_B(unsigned char c) { U; return c/3; }
EXPORT(short)479 EXPORT(short) __stdcall s_tf_h(short c) { S; return c/3; }
EXPORT(unsigned short)480 EXPORT(unsigned short) __stdcall s_tf_H(unsigned short c) { U; return c/3; }
EXPORT(int)481 EXPORT(int) __stdcall s_tf_i(int c) { S; return c/3; }
EXPORT(unsigned int)482 EXPORT(unsigned int) __stdcall s_tf_I(unsigned int c) { U; return c/3; }
EXPORT(long)483 EXPORT(long) __stdcall s_tf_l(long c) { S; return c/3; }
EXPORT(unsigned long)484 EXPORT(unsigned long) __stdcall s_tf_L(unsigned long c) { U; return c/3; }
EXPORT(PY_LONG_LONG)485 EXPORT(PY_LONG_LONG) __stdcall s_tf_q(PY_LONG_LONG c) { S; return c/3; }
EXPORT(unsigned PY_LONG_LONG)486 EXPORT(unsigned PY_LONG_LONG) __stdcall s_tf_Q(unsigned PY_LONG_LONG c) { U; return c/3; }
EXPORT(float)487 EXPORT(float) __stdcall s_tf_f(float c) { S; return c/3; }
EXPORT(double)488 EXPORT(double) __stdcall s_tf_d(double c) { S; return c/3; }
EXPORT(long double)489 EXPORT(long double) __stdcall s_tf_D(long double c) { S; return c/3; }
490 #endif
491 /*******/
492
tf_bb(signed char x,signed char c)493 EXPORT(signed char) tf_bb(signed char x, signed char c) { S; return c/3; }
tf_bB(signed char x,unsigned char c)494 EXPORT(unsigned char) tf_bB(signed char x, unsigned char c) { U; return c/3; }
tf_bh(signed char x,short c)495 EXPORT(short) tf_bh(signed char x, short c) { S; return c/3; }
tf_bH(signed char x,unsigned short c)496 EXPORT(unsigned short) tf_bH(signed char x, unsigned short c) { U; return c/3; }
tf_bi(signed char x,int c)497 EXPORT(int) tf_bi(signed char x, int c) { S; return c/3; }
tf_bI(signed char x,unsigned int c)498 EXPORT(unsigned int) tf_bI(signed char x, unsigned int c) { U; return c/3; }
tf_bl(signed char x,long c)499 EXPORT(long) tf_bl(signed char x, long c) { S; return c/3; }
tf_bL(signed char x,unsigned long c)500 EXPORT(unsigned long) tf_bL(signed char x, unsigned long c) { U; return c/3; }
tf_bq(signed char x,PY_LONG_LONG c)501 EXPORT(PY_LONG_LONG) tf_bq(signed char x, PY_LONG_LONG c) { S; return c/3; }
tf_bQ(signed char x,unsigned PY_LONG_LONG c)502 EXPORT(unsigned PY_LONG_LONG) tf_bQ(signed char x, unsigned PY_LONG_LONG c) { U; return c/3; }
tf_bf(signed char x,float c)503 EXPORT(float) tf_bf(signed char x, float c) { S; return c/3; }
tf_bd(signed char x,double c)504 EXPORT(double) tf_bd(signed char x, double c) { S; return c/3; }
tf_bD(signed char x,long double c)505 EXPORT(long double) tf_bD(signed char x, long double c) { S; return c/3; }
tv_i(int c)506 EXPORT(void) tv_i(int c) { S; return; }
507
508 #ifdef MS_WIN32
EXPORT(signed char)509 EXPORT(signed char) __stdcall s_tf_bb(signed char x, signed char c) { S; return c/3; }
EXPORT(unsigned char)510 EXPORT(unsigned char) __stdcall s_tf_bB(signed char x, unsigned char c) { U; return c/3; }
EXPORT(short)511 EXPORT(short) __stdcall s_tf_bh(signed char x, short c) { S; return c/3; }
EXPORT(unsigned short)512 EXPORT(unsigned short) __stdcall s_tf_bH(signed char x, unsigned short c) { U; return c/3; }
EXPORT(int)513 EXPORT(int) __stdcall s_tf_bi(signed char x, int c) { S; return c/3; }
EXPORT(unsigned int)514 EXPORT(unsigned int) __stdcall s_tf_bI(signed char x, unsigned int c) { U; return c/3; }
EXPORT(long)515 EXPORT(long) __stdcall s_tf_bl(signed char x, long c) { S; return c/3; }
EXPORT(unsigned long)516 EXPORT(unsigned long) __stdcall s_tf_bL(signed char x, unsigned long c) { U; return c/3; }
EXPORT(PY_LONG_LONG)517 EXPORT(PY_LONG_LONG) __stdcall s_tf_bq(signed char x, PY_LONG_LONG c) { S; return c/3; }
EXPORT(unsigned PY_LONG_LONG)518 EXPORT(unsigned PY_LONG_LONG) __stdcall s_tf_bQ(signed char x, unsigned PY_LONG_LONG c) { U; return c/3; }
EXPORT(float)519 EXPORT(float) __stdcall s_tf_bf(signed char x, float c) { S; return c/3; }
EXPORT(double)520 EXPORT(double) __stdcall s_tf_bd(signed char x, double c) { S; return c/3; }
EXPORT(long double)521 EXPORT(long double) __stdcall s_tf_bD(signed char x, long double c) { S; return c/3; }
EXPORT(void)522 EXPORT(void) __stdcall s_tv_i(int c) { S; return; }
523 #endif
524
525 /********/
526
527 #ifndef MS_WIN32
528
529 typedef struct {
530 long x;
531 long y;
532 } POINT;
533
534 typedef struct {
535 long left;
536 long top;
537 long right;
538 long bottom;
539 } RECT;
540
541 #endif
542
PointInRect(RECT * prc,POINT pt)543 EXPORT(int) PointInRect(RECT *prc, POINT pt)
544 {
545 if (pt.x < prc->left)
546 return 0;
547 if (pt.x > prc->right)
548 return 0;
549 if (pt.y < prc->top)
550 return 0;
551 if (pt.y > prc->bottom)
552 return 0;
553 return 1;
554 }
555
556 EXPORT(long left = 10);
557 EXPORT(long top = 20);
558 EXPORT(long right = 30);
559 EXPORT(long bottom = 40);
560
ReturnRect(int i,RECT ar,RECT * br,POINT cp,RECT dr,RECT * er,POINT fp,RECT gr)561 EXPORT(RECT) ReturnRect(int i, RECT ar, RECT* br, POINT cp, RECT dr,
562 RECT *er, POINT fp, RECT gr)
563 {
564 /*Check input */
565 if (ar.left + br->left + dr.left + er->left + gr.left != left * 5)
566 {
567 ar.left = 100;
568 return ar;
569 }
570 if (ar.right + br->right + dr.right + er->right + gr.right != right * 5)
571 {
572 ar.right = 100;
573 return ar;
574 }
575 if (cp.x != fp.x)
576 {
577 ar.left = -100;
578 }
579 if (cp.y != fp.y)
580 {
581 ar.left = -200;
582 }
583 switch(i)
584 {
585 case 0:
586 return ar;
587 break;
588 case 1:
589 return dr;
590 break;
591 case 2:
592 return gr;
593 break;
594
595 }
596 return ar;
597 }
598
599 typedef struct {
600 short x;
601 short y;
602 } S2H;
603
ret_2h_func(S2H inp)604 EXPORT(S2H) ret_2h_func(S2H inp)
605 {
606 inp.x *= 2;
607 inp.y *= 3;
608 return inp;
609 }
610
611 typedef struct {
612 int a, b, c, d, e, f, g, h;
613 } S8I;
614
ret_8i_func(S8I inp)615 EXPORT(S8I) ret_8i_func(S8I inp)
616 {
617 inp.a *= 2;
618 inp.b *= 3;
619 inp.c *= 4;
620 inp.d *= 5;
621 inp.e *= 6;
622 inp.f *= 7;
623 inp.g *= 8;
624 inp.h *= 9;
625 return inp;
626 }
627
GetRectangle(int flag,RECT * prect)628 EXPORT(int) GetRectangle(int flag, RECT *prect)
629 {
630 if (flag == 0)
631 return 0;
632 prect->left = (int)flag;
633 prect->top = (int)flag + 1;
634 prect->right = (int)flag + 2;
635 prect->bottom = (int)flag + 3;
636 return 1;
637 }
638
TwoOutArgs(int a,int * pi,int b,int * pj)639 EXPORT(void) TwoOutArgs(int a, int *pi, int b, int *pj)
640 {
641 *pi += a;
642 *pj += b;
643 }
644
645 #ifdef MS_WIN32
EXPORT(S2H)646 EXPORT(S2H) __stdcall s_ret_2h_func(S2H inp) { return ret_2h_func(inp); }
EXPORT(S8I)647 EXPORT(S8I) __stdcall s_ret_8i_func(S8I inp) { return ret_8i_func(inp); }
648 #endif
649
650 #ifdef MS_WIN32
651 /* Should port this */
652 #include <stdlib.h>
653 #include <search.h>
654
KeepObject(IUnknown * punk)655 EXPORT (HRESULT) KeepObject(IUnknown *punk)
656 {
657 static IUnknown *pobj;
658 if (punk)
659 punk->lpVtbl->AddRef(punk);
660 if (pobj)
661 pobj->lpVtbl->Release(pobj);
662 pobj = punk;
663 return S_OK;
664 }
665
666 #endif
667
668 DL_EXPORT(void)
init_ctypes_test(void)669 init_ctypes_test(void)
670 {
671 Py_InitModule("_ctypes_test", module_methods);
672 }
673