• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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