blob: 3a6845f39bb68c5f4445ec0ef5d13a67602be293 [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
Christian Heimesdd15f6c2008-03-16 00:07:10 +000029EXPORT(void)testfunc_array(int values[4])
30{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000031 printf("testfunc_array %d %d %d %d\n",
32 values[0],
33 values[1],
34 values[2],
35 values[3]);
Christian Heimesdd15f6c2008-03-16 00:07:10 +000036}
37
Thomas Wouters89d996e2007-09-08 17:39:28 +000038EXPORT(long double)testfunc_Ddd(double a, double b)
39{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 long double result = (long double)(a * b);
41 printf("testfunc_Ddd(%p, %p)\n", &a, &b);
42 printf("testfunc_Ddd(%g, %g)\n", a, b);
43 return result;
Thomas Wouters89d996e2007-09-08 17:39:28 +000044}
45
46EXPORT(long double)testfunc_DDD(long double a, long double b)
47{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 long double result = a * b;
49 printf("testfunc_DDD(%p, %p)\n", &a, &b);
50 printf("testfunc_DDD(%Lg, %Lg)\n", a, b);
51 return result;
Thomas Wouters89d996e2007-09-08 17:39:28 +000052}
53
54EXPORT(int)testfunc_iii(int a, int b)
55{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 int result = a * b;
57 printf("testfunc_iii(%p, %p)\n", &a, &b);
58 return result;
Thomas Wouters89d996e2007-09-08 17:39:28 +000059}
60
Thomas Wouters89f507f2006-12-13 04:49:30 +000061EXPORT(int)myprintf(char *fmt, ...)
62{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 int result;
64 va_list argptr;
65 va_start(argptr, fmt);
66 result = vprintf(fmt, argptr);
67 va_end(argptr);
68 return result;
Thomas Wouters89f507f2006-12-13 04:49:30 +000069}
70
Thomas Hellerd4c93202006-03-08 19:35:11 +000071EXPORT(char *)my_strtok(char *token, const char *delim)
72{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 return strtok(token, delim);
Thomas Hellerd4c93202006-03-08 19:35:11 +000074}
75
76EXPORT(char *)my_strchr(const char *s, int c)
77{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000078 return strchr(s, c);
Thomas Hellerd4c93202006-03-08 19:35:11 +000079}
80
81
82EXPORT(double) my_sqrt(double a)
83{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 return sqrt(a);
Thomas Hellerd4c93202006-03-08 19:35:11 +000085}
86
87EXPORT(void) my_qsort(void *base, size_t num, size_t width, int(*compare)(const void*, const void*))
88{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 qsort(base, num, width, compare);
Thomas Hellerd4c93202006-03-08 19:35:11 +000090}
91
92EXPORT(int *) _testfunc_ai8(int a[8])
93{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 return a;
Thomas Hellerd4c93202006-03-08 19:35:11 +000095}
96
97EXPORT(void) _testfunc_v(int a, int b, int *presult)
98{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 *presult = a + b;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000100}
101
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000102EXPORT(int) _testfunc_i_bhilfd(signed char b, short h, int i, long l, float f, double d)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104/* printf("_testfunc_i_bhilfd got %d %d %d %ld %f %f\n",
105 b, h, i, l, f, d);
Thomas Woutersb2137042007-02-01 18:02:27 +0000106*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 return (int)(b + h + i + l + f + d);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000108}
109
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000110EXPORT(float) _testfunc_f_bhilfd(signed char b, short h, int i, long l, float f, double d)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112/* printf("_testfunc_f_bhilfd got %d %d %d %ld %f %f\n",
113 b, h, i, l, f, d);
Thomas Woutersb2137042007-02-01 18:02:27 +0000114*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 return (float)(b + h + i + l + f + d);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000116}
117
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000118EXPORT(double) _testfunc_d_bhilfd(signed char b, short h, int i, long l, float f, double d)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120/* printf("_testfunc_d_bhilfd got %d %d %d %ld %f %f\n",
121 b, h, i, l, f, d);
Thomas Woutersb2137042007-02-01 18:02:27 +0000122*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 return (double)(b + h + i + l + f + d);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000124}
125
Thomas Wouters89d996e2007-09-08 17:39:28 +0000126EXPORT(long double) _testfunc_D_bhilfD(signed char b, short h, int i, long l, float f, long double d)
127{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128/* printf("_testfunc_d_bhilfd got %d %d %d %ld %f %f\n",
129 b, h, i, l, f, d);
Thomas Wouters89d996e2007-09-08 17:39:28 +0000130*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 return (long double)(b + h + i + l + f + d);
Thomas Wouters89d996e2007-09-08 17:39:28 +0000132}
133
Thomas Hellerd4c93202006-03-08 19:35:11 +0000134EXPORT(char *) _testfunc_p_p(void *s)
135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 return (char *)s;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000137}
138
139EXPORT(void *) _testfunc_c_p_p(int *argcp, char **argv)
140{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 return argv[(*argcp)-1];
Thomas Hellerd4c93202006-03-08 19:35:11 +0000142}
143
144EXPORT(void *) get_strchr(void)
145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 return (void *)strchr;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000147}
148
149EXPORT(char *) my_strdup(char *src)
150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 char *dst = (char *)malloc(strlen(src)+1);
152 if (!dst)
153 return NULL;
154 strcpy(dst, src);
155 return dst;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000156}
157
Thomas Wouters477c8d52006-05-27 19:21:47 +0000158EXPORT(void)my_free(void *ptr)
159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 free(ptr);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000161}
162
Thomas Hellerd4c93202006-03-08 19:35:11 +0000163#ifdef HAVE_WCHAR_H
164EXPORT(wchar_t *) my_wcsdup(wchar_t *src)
165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 size_t len = wcslen(src);
167 wchar_t *ptr = (wchar_t *)malloc((len + 1) * sizeof(wchar_t));
168 if (ptr == NULL)
169 return NULL;
170 memcpy(ptr, src, (len+1) * sizeof(wchar_t));
171 return ptr;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000172}
173
174EXPORT(size_t) my_wcslen(wchar_t *src)
175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 return wcslen(src);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000177}
178#endif
179
180#ifndef MS_WIN32
181# ifndef __stdcall
182# define __stdcall /* */
183# endif
184#endif
185
186typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 int (*c)(int, int);
188 int (__stdcall *s)(int, int);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000189} FUNCS;
190
191EXPORT(int) _testfunc_callfuncp(FUNCS *fp)
192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 fp->c(1, 2);
194 fp->s(3, 4);
195 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000196}
197
198EXPORT(int) _testfunc_deref_pointer(int *pi)
199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 return *pi;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000201}
202
203#ifdef MS_WIN32
204EXPORT(int) _testfunc_piunk(IUnknown FAR *piunk)
205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 piunk->lpVtbl->AddRef(piunk);
207 return piunk->lpVtbl->Release(piunk);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000208}
209#endif
210
211EXPORT(int) _testfunc_callback_with_pointer(int (*func)(int *))
212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 int table[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Thomas Hellerd4c93202006-03-08 19:35:11 +0000214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 return (*func)(table);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000216}
217
218#ifdef HAVE_LONG_LONG
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000219EXPORT(PY_LONG_LONG) _testfunc_q_bhilfdq(signed char b, short h, int i, long l, float f,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 double d, PY_LONG_LONG q)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 return (PY_LONG_LONG)(b + h + i + l + f + d + q);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000223}
224
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000225EXPORT(PY_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 +0000226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 return (PY_LONG_LONG)(b + h + i + l + f + d);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000228}
229
230EXPORT(int) _testfunc_callback_i_if(int value, int (*func)(int))
231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 int sum = 0;
233 while (value != 0) {
234 sum += func(value);
235 value /= 2;
236 }
237 return sum;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000238}
239
240EXPORT(PY_LONG_LONG) _testfunc_callback_q_qf(PY_LONG_LONG value,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 PY_LONG_LONG (*func)(PY_LONG_LONG))
Thomas Hellerd4c93202006-03-08 19:35:11 +0000242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 PY_LONG_LONG sum = 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 while (value != 0) {
246 sum += func(value);
247 value /= 2;
248 }
249 return sum;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000250}
251
252#endif
253
Thomas Hellerd4c93202006-03-08 19:35:11 +0000254typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 char *name;
256 char *value;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000257} SPAM;
258
259typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 char *name;
261 int num_spams;
262 SPAM *spams;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000263} EGG;
264
265SPAM my_spams[2] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 { "name1", "value1" },
267 { "name2", "value2" },
Thomas Hellerd4c93202006-03-08 19:35:11 +0000268};
269
270EGG my_eggs[1] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 { "first egg", 1, my_spams }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000272};
273
274EXPORT(int) getSPAMANDEGGS(EGG **eggs)
275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 *eggs = my_eggs;
277 return 1;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000278}
279
280typedef struct tagpoint {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 int x;
282 int y;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000283} point;
284
285EXPORT(int) _testfunc_byval(point in, point *pout)
286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 if (pout) {
288 pout->x = in.x;
289 pout->y = in.y;
290 }
291 return in.x + in.y;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000292}
293
294EXPORT (int) an_integer = 42;
295
296EXPORT(int) get_an_integer(void)
297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 return an_integer;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000299}
300
301EXPORT(double)
302integrate(double a, double b, double (*f)(double), long nstep)
303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 double x, sum=0.0, dx=(b-a)/(double)nstep;
305 for(x=a+0.5*dx; (b-x)*(x-a)>0.0; x+=dx)
306 sum += f(x);
307 return sum/(double)nstep;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000308}
309
310typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 void (*initialize)(void *(*)(int), void(*)(void *));
Thomas Hellerd4c93202006-03-08 19:35:11 +0000312} xxx_library;
313
314static void _xxx_init(void *(*Xalloc)(int), void (*Xfree)(void *))
315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 void *ptr;
317
318 printf("_xxx_init got %p %p\n", Xalloc, Xfree);
319 printf("calling\n");
320 ptr = Xalloc(32);
321 Xfree(ptr);
322 printf("calls done, ptr was %p\n", ptr);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000323}
324
325xxx_library _xxx_lib = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 _xxx_init
Thomas Hellerd4c93202006-03-08 19:35:11 +0000327};
328
329EXPORT(xxx_library) *library_get(void)
330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 return &_xxx_lib;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000332}
333
334#ifdef MS_WIN32
335/* See Don Box (german), pp 79ff. */
336EXPORT(void) GetString(BSTR *pbstr)
337{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 *pbstr = SysAllocString(L"Goodbye!");
Thomas Hellerd4c93202006-03-08 19:35:11 +0000339}
340#endif
341
342/*
343 * Some do-nothing functions, for speed tests
344 */
345PyObject *py_func_si(PyObject *self, PyObject *args)
346{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 char *name;
348 int i;
349 if (!PyArg_ParseTuple(args, "si", &name, &i))
350 return NULL;
351 Py_INCREF(Py_None);
352 return Py_None;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000353}
354
355EXPORT(void) _py_func_si(char *s, int i)
356{
357}
358
359PyObject *py_func(PyObject *self, PyObject *args)
360{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 Py_INCREF(Py_None);
362 return Py_None;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000363}
364
365EXPORT(void) _py_func(void)
366{
367}
368
369EXPORT(PY_LONG_LONG) last_tf_arg_s;
370EXPORT(unsigned PY_LONG_LONG) last_tf_arg_u;
371
372struct BITS {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 int A: 1, B:2, C:3, D:4, E: 5, F: 6, G: 7, H: 8, I: 9;
374 short M: 1, N: 2, O: 3, P: 4, Q: 5, R: 6, S: 7;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000375};
376
Thomas Heller918d8302007-07-11 09:41:04 +0000377EXPORT(void) set_bitfields(struct BITS *bits, char name, int value)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 switch (name) {
380 case 'A': bits->A = value; break;
381 case 'B': bits->B = value; break;
382 case 'C': bits->C = value; break;
383 case 'D': bits->D = value; break;
384 case 'E': bits->E = value; break;
385 case 'F': bits->F = value; break;
386 case 'G': bits->G = value; break;
387 case 'H': bits->H = value; break;
388 case 'I': bits->I = value; break;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 case 'M': bits->M = value; break;
391 case 'N': bits->N = value; break;
392 case 'O': bits->O = value; break;
393 case 'P': bits->P = value; break;
394 case 'Q': bits->Q = value; break;
395 case 'R': bits->R = value; break;
396 case 'S': bits->S = value; break;
397 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000398}
399
Thomas Heller918d8302007-07-11 09:41:04 +0000400EXPORT(int) unpack_bitfields(struct BITS *bits, char name)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 switch (name) {
403 case 'A': return bits->A;
404 case 'B': return bits->B;
405 case 'C': return bits->C;
406 case 'D': return bits->D;
407 case 'E': return bits->E;
408 case 'F': return bits->F;
409 case 'G': return bits->G;
410 case 'H': return bits->H;
411 case 'I': return bits->I;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 case 'M': return bits->M;
414 case 'N': return bits->N;
415 case 'O': return bits->O;
416 case 'P': return bits->P;
417 case 'Q': return bits->Q;
418 case 'R': return bits->R;
419 case 'S': return bits->S;
420 }
421 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000422}
423
Christian Heimesa612dc02008-02-24 13:08:18 +0000424static PyMethodDef module_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425/* {"get_last_tf_arg_s", get_last_tf_arg_s, METH_NOARGS},
426 {"get_last_tf_arg_u", get_last_tf_arg_u, METH_NOARGS},
Thomas Woutersb2137042007-02-01 18:02:27 +0000427*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 {"func_si", py_func_si, METH_VARARGS},
429 {"func", py_func, METH_NOARGS},
430 { NULL, NULL, 0, NULL},
Thomas Hellerd4c93202006-03-08 19:35:11 +0000431};
432
433#define S last_tf_arg_s = (PY_LONG_LONG)c
434#define U last_tf_arg_u = (unsigned PY_LONG_LONG)c
435
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000436EXPORT(signed char) tf_b(signed char c) { S; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000437EXPORT(unsigned char) tf_B(unsigned char c) { U; return c/3; }
438EXPORT(short) tf_h(short c) { S; return c/3; }
439EXPORT(unsigned short) tf_H(unsigned short c) { U; return c/3; }
440EXPORT(int) tf_i(int c) { S; return c/3; }
441EXPORT(unsigned int) tf_I(unsigned int c) { U; return c/3; }
442EXPORT(long) tf_l(long c) { S; return c/3; }
443EXPORT(unsigned long) tf_L(unsigned long c) { U; return c/3; }
444EXPORT(PY_LONG_LONG) tf_q(PY_LONG_LONG c) { S; return c/3; }
445EXPORT(unsigned PY_LONG_LONG) tf_Q(unsigned PY_LONG_LONG c) { U; return c/3; }
446EXPORT(float) tf_f(float c) { S; return c/3; }
447EXPORT(double) tf_d(double c) { S; return c/3; }
Thomas Wouters89d996e2007-09-08 17:39:28 +0000448EXPORT(long double) tf_D(long double c) { S; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000449
450#ifdef MS_WIN32
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000451EXPORT(signed char) __stdcall s_tf_b(signed char c) { S; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000452EXPORT(unsigned char) __stdcall s_tf_B(unsigned char c) { U; return c/3; }
453EXPORT(short) __stdcall s_tf_h(short c) { S; return c/3; }
454EXPORT(unsigned short) __stdcall s_tf_H(unsigned short c) { U; return c/3; }
455EXPORT(int) __stdcall s_tf_i(int c) { S; return c/3; }
456EXPORT(unsigned int) __stdcall s_tf_I(unsigned int c) { U; return c/3; }
457EXPORT(long) __stdcall s_tf_l(long c) { S; return c/3; }
458EXPORT(unsigned long) __stdcall s_tf_L(unsigned long c) { U; return c/3; }
459EXPORT(PY_LONG_LONG) __stdcall s_tf_q(PY_LONG_LONG c) { S; return c/3; }
460EXPORT(unsigned PY_LONG_LONG) __stdcall s_tf_Q(unsigned PY_LONG_LONG c) { U; return c/3; }
461EXPORT(float) __stdcall s_tf_f(float c) { S; return c/3; }
462EXPORT(double) __stdcall s_tf_d(double c) { S; return c/3; }
Thomas Wouters89d996e2007-09-08 17:39:28 +0000463EXPORT(long double) __stdcall s_tf_D(long double c) { S; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000464#endif
465/*******/
466
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000467EXPORT(signed char) tf_bb(signed char x, signed char c) { S; return c/3; }
468EXPORT(unsigned char) tf_bB(signed char x, unsigned char c) { U; return c/3; }
469EXPORT(short) tf_bh(signed char x, short c) { S; return c/3; }
470EXPORT(unsigned short) tf_bH(signed char x, unsigned short c) { U; return c/3; }
471EXPORT(int) tf_bi(signed char x, int c) { S; return c/3; }
472EXPORT(unsigned int) tf_bI(signed char x, unsigned int c) { U; return c/3; }
473EXPORT(long) tf_bl(signed char x, long c) { S; return c/3; }
474EXPORT(unsigned long) tf_bL(signed char x, unsigned long c) { U; return c/3; }
475EXPORT(PY_LONG_LONG) tf_bq(signed char x, PY_LONG_LONG c) { S; return c/3; }
476EXPORT(unsigned PY_LONG_LONG) tf_bQ(signed char x, unsigned PY_LONG_LONG c) { U; return c/3; }
477EXPORT(float) tf_bf(signed char x, float c) { S; return c/3; }
478EXPORT(double) tf_bd(signed char x, double c) { S; return c/3; }
Thomas Wouters89d996e2007-09-08 17:39:28 +0000479EXPORT(long double) tf_bD(signed char x, long double c) { S; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000480EXPORT(void) tv_i(int c) { S; return; }
481
482#ifdef MS_WIN32
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000483EXPORT(signed char) __stdcall s_tf_bb(signed char x, signed char c) { S; return c/3; }
484EXPORT(unsigned char) __stdcall s_tf_bB(signed char x, unsigned char c) { U; return c/3; }
485EXPORT(short) __stdcall s_tf_bh(signed char x, short c) { S; return c/3; }
486EXPORT(unsigned short) __stdcall s_tf_bH(signed char x, unsigned short c) { U; return c/3; }
487EXPORT(int) __stdcall s_tf_bi(signed char x, int c) { S; return c/3; }
488EXPORT(unsigned int) __stdcall s_tf_bI(signed char x, unsigned int c) { U; return c/3; }
489EXPORT(long) __stdcall s_tf_bl(signed char x, long c) { S; return c/3; }
490EXPORT(unsigned long) __stdcall s_tf_bL(signed char x, unsigned long c) { U; return c/3; }
491EXPORT(PY_LONG_LONG) __stdcall s_tf_bq(signed char x, PY_LONG_LONG c) { S; return c/3; }
492EXPORT(unsigned PY_LONG_LONG) __stdcall s_tf_bQ(signed char x, unsigned PY_LONG_LONG c) { U; return c/3; }
493EXPORT(float) __stdcall s_tf_bf(signed char x, float c) { S; return c/3; }
494EXPORT(double) __stdcall s_tf_bd(signed char x, double c) { S; return c/3; }
Thomas Wouters89d996e2007-09-08 17:39:28 +0000495EXPORT(long double) __stdcall s_tf_bD(signed char x, long double c) { S; return c/3; }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000496EXPORT(void) __stdcall s_tv_i(int c) { S; return; }
497#endif
498
499/********/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500
Thomas Hellerd4c93202006-03-08 19:35:11 +0000501#ifndef MS_WIN32
502
503typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 long x;
505 long y;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000506} POINT;
507
508typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 long left;
510 long top;
511 long right;
512 long bottom;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000513} RECT;
514
515#endif
516
517EXPORT(int) PointInRect(RECT *prc, POINT pt)
518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 if (pt.x < prc->left)
520 return 0;
521 if (pt.x > prc->right)
522 return 0;
523 if (pt.y < prc->top)
524 return 0;
525 if (pt.y > prc->bottom)
526 return 0;
527 return 1;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000528}
529
530typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 short x;
532 short y;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000533} S2H;
534
535EXPORT(S2H) ret_2h_func(S2H inp)
536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 inp.x *= 2;
538 inp.y *= 3;
539 return inp;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000540}
541
542typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 int a, b, c, d, e, f, g, h;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000544} S8I;
545
546EXPORT(S8I) ret_8i_func(S8I inp)
547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 inp.a *= 2;
549 inp.b *= 3;
550 inp.c *= 4;
551 inp.d *= 5;
552 inp.e *= 6;
553 inp.f *= 7;
554 inp.g *= 8;
555 inp.h *= 9;
556 return inp;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000557}
558
559EXPORT(int) GetRectangle(int flag, RECT *prect)
560{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 if (flag == 0)
562 return 0;
563 prect->left = (int)flag;
564 prect->top = (int)flag + 1;
565 prect->right = (int)flag + 2;
566 prect->bottom = (int)flag + 3;
567 return 1;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000568}
569
570EXPORT(void) TwoOutArgs(int a, int *pi, int b, int *pj)
571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 *pi += a;
573 *pj += b;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000574}
575
576#ifdef MS_WIN32
577EXPORT(S2H) __stdcall s_ret_2h_func(S2H inp) { return ret_2h_func(inp); }
578EXPORT(S8I) __stdcall s_ret_8i_func(S8I inp) { return ret_8i_func(inp); }
579#endif
580
581#ifdef MS_WIN32
582/* Should port this */
583#include <stdlib.h>
584#include <search.h>
585
586EXPORT (HRESULT) KeepObject(IUnknown *punk)
587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 static IUnknown *pobj;
589 if (punk)
590 punk->lpVtbl->AddRef(punk);
591 if (pobj)
592 pobj->lpVtbl->Release(pobj);
593 pobj = punk;
594 return S_OK;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000595}
596
597#endif
598
Martin v. Löwis1a214512008-06-11 05:26:20 +0000599
600static struct PyModuleDef _ctypes_testmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 PyModuleDef_HEAD_INIT,
602 "_ctypes_test",
603 NULL,
604 -1,
605 module_methods,
606 NULL,
607 NULL,
608 NULL,
609 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000610};
611
Neal Norwitzf6657e62006-12-28 04:47:50 +0000612PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000613PyInit__ctypes_test(void)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 return PyModule_Create(&_ctypes_testmodule);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000616}