blob: 59d56d0d218732bd850a8cc47a227ae36e247637 [file] [log] [blame]
Thomas Hellerd4c93202006-03-08 19:35:11 +00001#include <Python.h>
2
Thomas Hellerd4c93202006-03-08 19:35:11 +00003#ifdef MS_WIN32
4#include <windows.h>
5#endif
6
7#if defined(MS_WIN32) || defined(__CYGWIN__)
8#define EXPORT(x) __declspec(dllexport) x
9#else
10#define EXPORT(x) x
11#endif
12
13/* some functions handy for testing */
14
Antoine Pitrou0ea622a2011-01-31 21:08:57 +000015EXPORT(int)
16_testfunc_cbk_reg_int(int a, int b, int c, int d, int e,
17 int (*func)(int, int, int, int, int))
18{
19 return func(a*a, b*b, c*c, d*d, e*e);
20}
21
22EXPORT(double)
23_testfunc_cbk_reg_double(double a, double b, double c, double d, double e,
24 double (*func)(double, double, double, double, double))
25{
26 return func(a*a, b*b, c*c, d*d, e*e);
27}
28
Vinay Sajip6f250032016-08-05 21:24:27 +010029/*
30 * This structure should be the same as in test_callbacks.py and the
31 * method test_callback_large_struct. See issues 17310 and 20160: the
32 * structure must be larger than 8 bytes long.
33 */
34
35typedef struct {
36 unsigned long first;
37 unsigned long second;
38 unsigned long third;
39} Test;
40
41EXPORT(void)
42_testfunc_cbk_large_struct(Test in, void (*func)(Test))
43{
44 func(in);
45}
46
Vinay Sajip3cc58172017-02-22 06:21:17 +000047/*
48 * See issue 29565. Update a structure passed by value;
49 * the caller should not see any change.
50 */
51
52EXPORT(void)
53_testfunc_large_struct_update_value(Test in)
54{
55 in.first = 0x0badf00d;
56 in.second = 0x0badf00d;
57 in.third = 0x0badf00d;
58}
59
Christian Heimesdd15f6c2008-03-16 00:07:10 +000060EXPORT(void)testfunc_array(int values[4])
61{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 printf("testfunc_array %d %d %d %d\n",
63 values[0],
64 values[1],
65 values[2],
66 values[3]);
Christian Heimesdd15f6c2008-03-16 00:07:10 +000067}
68
Thomas Wouters89d996e2007-09-08 17:39:28 +000069EXPORT(long double)testfunc_Ddd(double a, double b)
70{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 long double result = (long double)(a * b);
72 printf("testfunc_Ddd(%p, %p)\n", &a, &b);
73 printf("testfunc_Ddd(%g, %g)\n", a, b);
74 return result;
Thomas Wouters89d996e2007-09-08 17:39:28 +000075}
76
77EXPORT(long double)testfunc_DDD(long double a, long double b)
78{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079 long double result = a * b;
80 printf("testfunc_DDD(%p, %p)\n", &a, &b);
81 printf("testfunc_DDD(%Lg, %Lg)\n", a, b);
82 return result;
Thomas Wouters89d996e2007-09-08 17:39:28 +000083}
84
85EXPORT(int)testfunc_iii(int a, int b)
86{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 int result = a * b;
88 printf("testfunc_iii(%p, %p)\n", &a, &b);
89 return result;
Thomas Wouters89d996e2007-09-08 17:39:28 +000090}
91
Thomas Wouters89f507f2006-12-13 04:49:30 +000092EXPORT(int)myprintf(char *fmt, ...)
93{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 int result;
95 va_list argptr;
96 va_start(argptr, fmt);
97 result = vprintf(fmt, argptr);
98 va_end(argptr);
99 return result;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000100}
101
Thomas Hellerd4c93202006-03-08 19:35:11 +0000102EXPORT(char *)my_strtok(char *token, const char *delim)
103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 return strtok(token, delim);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000105}
106
107EXPORT(char *)my_strchr(const char *s, int c)
108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 return strchr(s, c);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000110}
111
112
113EXPORT(double) my_sqrt(double a)
114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 return sqrt(a);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000116}
117
118EXPORT(void) my_qsort(void *base, size_t num, size_t width, int(*compare)(const void*, const void*))
119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 qsort(base, num, width, compare);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000121}
122
123EXPORT(int *) _testfunc_ai8(int a[8])
124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 return a;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000126}
127
128EXPORT(void) _testfunc_v(int a, int b, int *presult)
129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 *presult = a + b;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000131}
132
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000133EXPORT(int) _testfunc_i_bhilfd(signed char b, short h, int i, long l, float f, double d)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135/* printf("_testfunc_i_bhilfd got %d %d %d %ld %f %f\n",
136 b, h, i, l, f, d);
Thomas Woutersb2137042007-02-01 18:02:27 +0000137*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 return (int)(b + h + i + l + f + d);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000139}
140
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000141EXPORT(float) _testfunc_f_bhilfd(signed char b, short h, int i, long l, float f, double d)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143/* printf("_testfunc_f_bhilfd got %d %d %d %ld %f %f\n",
144 b, h, i, l, f, d);
Thomas Woutersb2137042007-02-01 18:02:27 +0000145*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 return (float)(b + h + i + l + f + d);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000147}
148
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000149EXPORT(double) _testfunc_d_bhilfd(signed char b, short h, int i, long l, float f, double d)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151/* printf("_testfunc_d_bhilfd got %d %d %d %ld %f %f\n",
152 b, h, i, l, f, d);
Thomas Woutersb2137042007-02-01 18:02:27 +0000153*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 return (double)(b + h + i + l + f + d);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000155}
156
Thomas Wouters89d996e2007-09-08 17:39:28 +0000157EXPORT(long double) _testfunc_D_bhilfD(signed char b, short h, int i, long l, float f, long double d)
158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000159/* printf("_testfunc_d_bhilfd got %d %d %d %ld %f %f\n",
160 b, h, i, l, f, d);
Thomas Wouters89d996e2007-09-08 17:39:28 +0000161*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 return (long double)(b + h + i + l + f + d);
Thomas Wouters89d996e2007-09-08 17:39:28 +0000163}
164
Thomas Hellerd4c93202006-03-08 19:35:11 +0000165EXPORT(char *) _testfunc_p_p(void *s)
166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 return (char *)s;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000168}
169
170EXPORT(void *) _testfunc_c_p_p(int *argcp, char **argv)
171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 return argv[(*argcp)-1];
Thomas Hellerd4c93202006-03-08 19:35:11 +0000173}
174
175EXPORT(void *) get_strchr(void)
176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 return (void *)strchr;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000178}
179
180EXPORT(char *) my_strdup(char *src)
181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 char *dst = (char *)malloc(strlen(src)+1);
183 if (!dst)
184 return NULL;
185 strcpy(dst, src);
186 return dst;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000187}
188
Thomas Wouters477c8d52006-05-27 19:21:47 +0000189EXPORT(void)my_free(void *ptr)
190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 free(ptr);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000192}
193
Thomas Hellerd4c93202006-03-08 19:35:11 +0000194#ifdef HAVE_WCHAR_H
195EXPORT(wchar_t *) my_wcsdup(wchar_t *src)
196{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 size_t len = wcslen(src);
198 wchar_t *ptr = (wchar_t *)malloc((len + 1) * sizeof(wchar_t));
199 if (ptr == NULL)
200 return NULL;
201 memcpy(ptr, src, (len+1) * sizeof(wchar_t));
202 return ptr;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000203}
204
205EXPORT(size_t) my_wcslen(wchar_t *src)
206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 return wcslen(src);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000208}
209#endif
210
211#ifndef MS_WIN32
212# ifndef __stdcall
213# define __stdcall /* */
214# endif
215#endif
216
217typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 int (*c)(int, int);
219 int (__stdcall *s)(int, int);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000220} FUNCS;
221
222EXPORT(int) _testfunc_callfuncp(FUNCS *fp)
223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 fp->c(1, 2);
225 fp->s(3, 4);
226 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000227}
228
229EXPORT(int) _testfunc_deref_pointer(int *pi)
230{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 return *pi;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000232}
233
234#ifdef MS_WIN32
235EXPORT(int) _testfunc_piunk(IUnknown FAR *piunk)
236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 piunk->lpVtbl->AddRef(piunk);
238 return piunk->lpVtbl->Release(piunk);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000239}
240#endif
241
242EXPORT(int) _testfunc_callback_with_pointer(int (*func)(int *))
243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 int table[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Thomas Hellerd4c93202006-03-08 19:35:11 +0000245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 return (*func)(table);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000247}
248
Benjamin Peterson47ff0732016-09-08 09:15:54 -0700249EXPORT(long long) _testfunc_q_bhilfdq(signed char b, short h, int i, long l, float f,
250 double d, long long q)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000251{
Benjamin Peterson47ff0732016-09-08 09:15:54 -0700252 return (long long)(b + h + i + l + f + d + q);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000253}
254
Benjamin Peterson47ff0732016-09-08 09:15:54 -0700255EXPORT(long long) _testfunc_q_bhilfd(signed char b, short h, int i, long l, float f, double d)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000256{
Benjamin Peterson47ff0732016-09-08 09:15:54 -0700257 return (long long)(b + h + i + l + f + d);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000258}
259
260EXPORT(int) _testfunc_callback_i_if(int value, int (*func)(int))
261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 int sum = 0;
263 while (value != 0) {
264 sum += func(value);
265 value /= 2;
266 }
267 return sum;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000268}
269
Benjamin Peterson47ff0732016-09-08 09:15:54 -0700270EXPORT(long long) _testfunc_callback_q_qf(long long value,
271 long long (*func)(long long))
Thomas Hellerd4c93202006-03-08 19:35:11 +0000272{
Benjamin Peterson47ff0732016-09-08 09:15:54 -0700273 long long sum = 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 while (value != 0) {
276 sum += func(value);
277 value /= 2;
278 }
279 return sum;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000280}
281
Thomas Hellerd4c93202006-03-08 19:35:11 +0000282typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 char *name;
284 char *value;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000285} SPAM;
286
287typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 char *name;
289 int num_spams;
290 SPAM *spams;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000291} EGG;
292
293SPAM my_spams[2] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 { "name1", "value1" },
295 { "name2", "value2" },
Thomas Hellerd4c93202006-03-08 19:35:11 +0000296};
297
298EGG my_eggs[1] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 { "first egg", 1, my_spams }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000300};
301
302EXPORT(int) getSPAMANDEGGS(EGG **eggs)
303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 *eggs = my_eggs;
305 return 1;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000306}
307
308typedef struct tagpoint {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 int x;
310 int y;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000311} point;
312
313EXPORT(int) _testfunc_byval(point in, point *pout)
314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 if (pout) {
316 pout->x = in.x;
317 pout->y = in.y;
318 }
319 return in.x + in.y;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000320}
321
322EXPORT (int) an_integer = 42;
323
324EXPORT(int) get_an_integer(void)
325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 return an_integer;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000327}
328
329EXPORT(double)
330integrate(double a, double b, double (*f)(double), long nstep)
331{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 double x, sum=0.0, dx=(b-a)/(double)nstep;
333 for(x=a+0.5*dx; (b-x)*(x-a)>0.0; x+=dx)
334 sum += f(x);
335 return sum/(double)nstep;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000336}
337
338typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 void (*initialize)(void *(*)(int), void(*)(void *));
Thomas Hellerd4c93202006-03-08 19:35:11 +0000340} xxx_library;
341
342static void _xxx_init(void *(*Xalloc)(int), void (*Xfree)(void *))
343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 void *ptr;
345
346 printf("_xxx_init got %p %p\n", Xalloc, Xfree);
347 printf("calling\n");
348 ptr = Xalloc(32);
349 Xfree(ptr);
350 printf("calls done, ptr was %p\n", ptr);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000351}
352
353xxx_library _xxx_lib = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 _xxx_init
Thomas Hellerd4c93202006-03-08 19:35:11 +0000355};
356
357EXPORT(xxx_library) *library_get(void)
358{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 return &_xxx_lib;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000360}
361
362#ifdef MS_WIN32
363/* See Don Box (german), pp 79ff. */
364EXPORT(void) GetString(BSTR *pbstr)
365{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 *pbstr = SysAllocString(L"Goodbye!");
Thomas Hellerd4c93202006-03-08 19:35:11 +0000367}
368#endif
369
370/*
371 * Some do-nothing functions, for speed tests
372 */
373PyObject *py_func_si(PyObject *self, PyObject *args)
374{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 char *name;
376 int i;
377 if (!PyArg_ParseTuple(args, "si", &name, &i))
378 return NULL;
379 Py_INCREF(Py_None);
380 return Py_None;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000381}
382
383EXPORT(void) _py_func_si(char *s, int i)
384{
385}
386
387PyObject *py_func(PyObject *self, PyObject *args)
388{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 Py_INCREF(Py_None);
390 return Py_None;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000391}
392
393EXPORT(void) _py_func(void)
394{
395}
396
Benjamin Peterson47ff0732016-09-08 09:15:54 -0700397EXPORT(long long) last_tf_arg_s;
398EXPORT(unsigned long long) last_tf_arg_u;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000399
400struct BITS {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 int A: 1, B:2, C:3, D:4, E: 5, F: 6, G: 7, H: 8, I: 9;
402 short M: 1, N: 2, O: 3, P: 4, Q: 5, R: 6, S: 7;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000403};
404
Thomas Heller918d8302007-07-11 09:41:04 +0000405EXPORT(void) set_bitfields(struct BITS *bits, char name, int value)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 switch (name) {
408 case 'A': bits->A = value; break;
409 case 'B': bits->B = value; break;
410 case 'C': bits->C = value; break;
411 case 'D': bits->D = value; break;
412 case 'E': bits->E = value; break;
413 case 'F': bits->F = value; break;
414 case 'G': bits->G = value; break;
415 case 'H': bits->H = value; break;
416 case 'I': bits->I = value; break;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 case 'M': bits->M = value; break;
419 case 'N': bits->N = value; break;
420 case 'O': bits->O = value; break;
421 case 'P': bits->P = value; break;
422 case 'Q': bits->Q = value; break;
423 case 'R': bits->R = value; break;
424 case 'S': bits->S = value; break;
425 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000426}
427
Thomas Heller918d8302007-07-11 09:41:04 +0000428EXPORT(int) unpack_bitfields(struct BITS *bits, char name)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000429{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 switch (name) {
431 case 'A': return bits->A;
432 case 'B': return bits->B;
433 case 'C': return bits->C;
434 case 'D': return bits->D;
435 case 'E': return bits->E;
436 case 'F': return bits->F;
437 case 'G': return bits->G;
438 case 'H': return bits->H;
439 case 'I': return bits->I;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 case 'M': return bits->M;
442 case 'N': return bits->N;
443 case 'O': return bits->O;
444 case 'P': return bits->P;
445 case 'Q': return bits->Q;
446 case 'R': return bits->R;
447 case 'S': return bits->S;
448 }
449 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000450}
451
Christian Heimesa612dc02008-02-24 13:08:18 +0000452static PyMethodDef module_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453/* {"get_last_tf_arg_s", get_last_tf_arg_s, METH_NOARGS},
454 {"get_last_tf_arg_u", get_last_tf_arg_u, METH_NOARGS},
Thomas Woutersb2137042007-02-01 18:02:27 +0000455*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 {"func_si", py_func_si, METH_VARARGS},
457 {"func", py_func, METH_NOARGS},
458 { NULL, NULL, 0, NULL},
Thomas Hellerd4c93202006-03-08 19:35:11 +0000459};
460
Benjamin Peterson47ff0732016-09-08 09:15:54 -0700461#define S last_tf_arg_s = (long long)c
462#define U last_tf_arg_u = (unsigned long long)c
Thomas Hellerd4c93202006-03-08 19:35:11 +0000463
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000464EXPORT(signed char) tf_b(signed char c) { S; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000465EXPORT(unsigned char) tf_B(unsigned char c) { U; return c/3; }
466EXPORT(short) tf_h(short c) { S; return c/3; }
467EXPORT(unsigned short) tf_H(unsigned short c) { U; return c/3; }
468EXPORT(int) tf_i(int c) { S; return c/3; }
469EXPORT(unsigned int) tf_I(unsigned int c) { U; return c/3; }
470EXPORT(long) tf_l(long c) { S; return c/3; }
471EXPORT(unsigned long) tf_L(unsigned long c) { U; return c/3; }
Benjamin Peterson47ff0732016-09-08 09:15:54 -0700472EXPORT(long long) tf_q(long long c) { S; return c/3; }
473EXPORT(unsigned long long) tf_Q(unsigned long long c) { U; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000474EXPORT(float) tf_f(float c) { S; return c/3; }
475EXPORT(double) tf_d(double c) { S; return c/3; }
Thomas Wouters89d996e2007-09-08 17:39:28 +0000476EXPORT(long double) tf_D(long double c) { S; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000477
478#ifdef MS_WIN32
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000479EXPORT(signed char) __stdcall s_tf_b(signed char c) { S; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000480EXPORT(unsigned char) __stdcall s_tf_B(unsigned char c) { U; return c/3; }
481EXPORT(short) __stdcall s_tf_h(short c) { S; return c/3; }
482EXPORT(unsigned short) __stdcall s_tf_H(unsigned short c) { U; return c/3; }
483EXPORT(int) __stdcall s_tf_i(int c) { S; return c/3; }
484EXPORT(unsigned int) __stdcall s_tf_I(unsigned int c) { U; return c/3; }
485EXPORT(long) __stdcall s_tf_l(long c) { S; return c/3; }
486EXPORT(unsigned long) __stdcall s_tf_L(unsigned long c) { U; return c/3; }
Benjamin Peterson47ff0732016-09-08 09:15:54 -0700487EXPORT(long long) __stdcall s_tf_q(long long c) { S; return c/3; }
488EXPORT(unsigned long long) __stdcall s_tf_Q(unsigned long long c) { U; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000489EXPORT(float) __stdcall s_tf_f(float c) { S; return c/3; }
490EXPORT(double) __stdcall s_tf_d(double c) { S; return c/3; }
Thomas Wouters89d996e2007-09-08 17:39:28 +0000491EXPORT(long double) __stdcall s_tf_D(long double c) { S; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000492#endif
493/*******/
494
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000495EXPORT(signed char) tf_bb(signed char x, signed char c) { S; return c/3; }
496EXPORT(unsigned char) tf_bB(signed char x, unsigned char c) { U; return c/3; }
497EXPORT(short) tf_bh(signed char x, short c) { S; return c/3; }
498EXPORT(unsigned short) tf_bH(signed char x, unsigned short c) { U; return c/3; }
499EXPORT(int) tf_bi(signed char x, int c) { S; return c/3; }
500EXPORT(unsigned int) tf_bI(signed char x, unsigned int c) { U; return c/3; }
501EXPORT(long) tf_bl(signed char x, long c) { S; return c/3; }
502EXPORT(unsigned long) tf_bL(signed char x, unsigned long c) { U; return c/3; }
Benjamin Peterson47ff0732016-09-08 09:15:54 -0700503EXPORT(long long) tf_bq(signed char x, long long c) { S; return c/3; }
504EXPORT(unsigned long long) tf_bQ(signed char x, unsigned long long c) { U; return c/3; }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000505EXPORT(float) tf_bf(signed char x, float c) { S; return c/3; }
506EXPORT(double) tf_bd(signed char x, double c) { S; return c/3; }
Thomas Wouters89d996e2007-09-08 17:39:28 +0000507EXPORT(long double) tf_bD(signed char x, long double c) { S; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000508EXPORT(void) tv_i(int c) { S; return; }
509
510#ifdef MS_WIN32
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000511EXPORT(signed char) __stdcall s_tf_bb(signed char x, signed char c) { S; return c/3; }
512EXPORT(unsigned char) __stdcall s_tf_bB(signed char x, unsigned char c) { U; return c/3; }
513EXPORT(short) __stdcall s_tf_bh(signed char x, short c) { S; return c/3; }
514EXPORT(unsigned short) __stdcall s_tf_bH(signed char x, unsigned short c) { U; return c/3; }
515EXPORT(int) __stdcall s_tf_bi(signed char x, int c) { S; return c/3; }
516EXPORT(unsigned int) __stdcall s_tf_bI(signed char x, unsigned int c) { U; return c/3; }
517EXPORT(long) __stdcall s_tf_bl(signed char x, long c) { S; return c/3; }
518EXPORT(unsigned long) __stdcall s_tf_bL(signed char x, unsigned long c) { U; return c/3; }
Benjamin Peterson47ff0732016-09-08 09:15:54 -0700519EXPORT(long long) __stdcall s_tf_bq(signed char x, long long c) { S; return c/3; }
520EXPORT(unsigned long long) __stdcall s_tf_bQ(signed char x, unsigned long long c) { U; return c/3; }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000521EXPORT(float) __stdcall s_tf_bf(signed char x, float c) { S; return c/3; }
522EXPORT(double) __stdcall s_tf_bd(signed char x, double c) { S; return c/3; }
Thomas Wouters89d996e2007-09-08 17:39:28 +0000523EXPORT(long double) __stdcall s_tf_bD(signed char x, long double c) { S; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000524EXPORT(void) __stdcall s_tv_i(int c) { S; return; }
525#endif
526
527/********/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528
Thomas Hellerd4c93202006-03-08 19:35:11 +0000529#ifndef MS_WIN32
530
531typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 long x;
533 long y;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000534} POINT;
535
536typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 long left;
538 long top;
539 long right;
540 long bottom;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000541} RECT;
542
543#endif
544
545EXPORT(int) PointInRect(RECT *prc, POINT pt)
546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 if (pt.x < prc->left)
548 return 0;
549 if (pt.x > prc->right)
550 return 0;
551 if (pt.y < prc->top)
552 return 0;
553 if (pt.y > prc->bottom)
554 return 0;
555 return 1;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000556}
557
Benjamin Petersonabd1c972014-11-06 00:52:58 -0500558EXPORT(long left = 10);
559EXPORT(long top = 20);
560EXPORT(long right = 30);
561EXPORT(long bottom = 40);
Steve Dowerb7fa2012014-11-04 21:21:22 -0800562
563EXPORT(RECT) ReturnRect(int i, RECT ar, RECT* br, POINT cp, RECT dr,
564 RECT *er, POINT fp, RECT gr)
565{
566 /*Check input */
567 if (ar.left + br->left + dr.left + er->left + gr.left != left * 5)
568 {
569 ar.left = 100;
570 return ar;
571 }
572 if (ar.right + br->right + dr.right + er->right + gr.right != right * 5)
573 {
574 ar.right = 100;
575 return ar;
576 }
577 if (cp.x != fp.x)
578 {
579 ar.left = -100;
580 }
581 if (cp.y != fp.y)
582 {
583 ar.left = -200;
584 }
585 switch(i)
586 {
587 case 0:
588 return ar;
589 break;
590 case 1:
591 return dr;
592 break;
593 case 2:
594 return gr;
595 break;
596
597 }
598 return ar;
599}
600
Thomas Hellerd4c93202006-03-08 19:35:11 +0000601typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 short x;
603 short y;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000604} S2H;
605
606EXPORT(S2H) ret_2h_func(S2H inp)
607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 inp.x *= 2;
609 inp.y *= 3;
610 return inp;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000611}
612
613typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 int a, b, c, d, e, f, g, h;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000615} S8I;
616
617EXPORT(S8I) ret_8i_func(S8I inp)
618{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 inp.a *= 2;
620 inp.b *= 3;
621 inp.c *= 4;
622 inp.d *= 5;
623 inp.e *= 6;
624 inp.f *= 7;
625 inp.g *= 8;
626 inp.h *= 9;
627 return inp;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000628}
629
630EXPORT(int) GetRectangle(int flag, RECT *prect)
631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 if (flag == 0)
633 return 0;
634 prect->left = (int)flag;
635 prect->top = (int)flag + 1;
636 prect->right = (int)flag + 2;
637 prect->bottom = (int)flag + 3;
638 return 1;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000639}
640
641EXPORT(void) TwoOutArgs(int a, int *pi, int b, int *pj)
642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 *pi += a;
644 *pj += b;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000645}
646
647#ifdef MS_WIN32
648EXPORT(S2H) __stdcall s_ret_2h_func(S2H inp) { return ret_2h_func(inp); }
649EXPORT(S8I) __stdcall s_ret_8i_func(S8I inp) { return ret_8i_func(inp); }
650#endif
651
652#ifdef MS_WIN32
653/* Should port this */
654#include <stdlib.h>
655#include <search.h>
656
657EXPORT (HRESULT) KeepObject(IUnknown *punk)
658{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 static IUnknown *pobj;
660 if (punk)
661 punk->lpVtbl->AddRef(punk);
662 if (pobj)
663 pobj->lpVtbl->Release(pobj);
664 pobj = punk;
665 return S_OK;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000666}
667
668#endif
669
Martin v. Löwis1a214512008-06-11 05:26:20 +0000670
671static struct PyModuleDef _ctypes_testmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 PyModuleDef_HEAD_INIT,
673 "_ctypes_test",
674 NULL,
675 -1,
676 module_methods,
677 NULL,
678 NULL,
679 NULL,
680 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000681};
682
Neal Norwitzf6657e62006-12-28 04:47:50 +0000683PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000684PyInit__ctypes_test(void)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000685{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 return PyModule_Create(&_ctypes_testmodule);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000687}