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