1/*
2 * Helper methods for the XML metadata testcases.
3 *
4 * - add global functions
5 */
6#include "Python.h"
7#include "pyobjc-api.h"
8#include <stdarg.h>
9
10#import <Foundation/Foundation.h>
11
12static void use_int(int x __attribute__((__unused__))) { };
13static void use_charpp(char** x __attribute__((__unused__))) { };
14static void use_id(id x __attribute__((__unused__))) { };
15
16@interface OC_MetaDataTest : NSObject
17{
18}
19/* Return value arrays: */
20-(int*)   makeIntArrayOf5;
21-(char**) makeStringArray;
22-(int*)   makeIntArrayOf:(int)count;
23-(const int*)   nullIntArrayOf5;
24-(char**) nullStringArray;
25-(int*)   nullIntArrayOf:(int)count;
26-(int*)   unknownLengthArray;
27
28/* In arrays: */
29-(NSArray*)makeIntArray:(int*) data count:(unsigned)count;
30-(NSArray*)makeIntArray:(int*) data halfCount:(unsigned)count;
31-(NSArray*)makeIntArray:(int*) data countPtr:(unsigned*)countPtr;
32-(NSArray*)nullIntArray:(int*) data count:(unsigned)count;
33-(NSArray*)makeStringArray:(char**)data;
34-(NSArray*)makeObjectArray:(id*)data;
35-(NSArray*)nullStringArray:(char**)data;
36-(NSArray*)make4Tuple:(double*)data;
37-(NSArray*)null4Tuple:(double*)data;
38-(NSArray*) makeVariableLengthArray:(int*)array halfCount:(int)cnt;
39
40/* Out arrays: */
41-(void)fillArray:(int*)data count:(int)count;
42-(int)nullfillArray:(int*)data count:(int)count;
43-(void)fill4Tuple:(int*)data;
44-(int)nullfill4Tuple:(int*)data;
45-(int)fillArray:(int*)data uptoCount:(int)count;
46-(int)maybeFillArray:(int*)data;
47
48/* NULL-terminated output arrays can't work, these are just here to check that the
49 * bridge knows this too.
50 */
51-(void)fillStringArray:(char**)data;
52-(int)nullfillStringArray:(char**)data;
53
54/* In/out arrays: */
55-(void)reverseArray:(float*)data count:(int)count;
56-(int)nullreverseArray:(float*)data count:(int)count;
57-(void)reverseStrings:(char**)data;
58-(int)nullreverseStrings:(char**)data;
59-(void)reverse4Tuple:(short*)data;
60-(int)nullreverse4Tuple:(short*)data;
61-(int)reverseArray:(float*)data uptoCount:(int)count;
62-(int)maybeReverseArray:(short*)data;
63
64
65/* pass-by-reference */
66-(int)sumX:(int*)x andY:(int*)y;		/* in */
67-(int)divBy5:(int)x remainder:(int*)r;		/* out */
68-(void)swapX:(double*)x andY:(double*)y; 	/* inout */
69-(NSArray*)input:(int*)x output:(int*)y inputAndOutput:(int*)z;
70
71-(NSArray*)makeArrayWithFormat:(NSString*)fmt, ...;
72-(NSArray*)makeArrayWithCFormat:(char*)fmt, ...;
73-(NSArray*)makeArrayWithArguments:(id)arg, ...;
74
75/* Helpers for calling back into python: */
76
77+(int*)   makeIntArrayOf5On:(OC_MetaDataTest*)obj;
78+(char**) makeStringArrayOn:(OC_MetaDataTest*)obj;
79+(int*)   makeIntArrayOf:(int)count on:(OC_MetaDataTest*)obj;
80+(const int*)   nullIntArrayOf5On:(OC_MetaDataTest*)obj;
81+(char**) nullStringArrayOn:(OC_MetaDataTest*)obj;
82+(int*)   nullIntArrayOf:(int)count on:(OC_MetaDataTest*)obj;
83+(NSArray*)makeIntArray:(int*) data count:(unsigned)count on:(OC_MetaDataTest*)obj;
84+(NSArray*)makeIntArray:(int*) data countPtr:(unsigned*)countPtr on:(OC_MetaDataTest*)obj;
85+(NSArray*)nullIntArray:(int*) data count:(unsigned)count on:(OC_MetaDataTest*)obj;
86+(NSArray*)makeStringArray:(char**)data on:(OC_MetaDataTest*)obj;
87+(NSArray*)makeObjectArray:(id*)data on:(OC_MetaDataTest*)obj;
88+(NSArray*)nullStringArray:(char**)data on:(OC_MetaDataTest*)obj;
89+(NSArray*)make4Tuple:(double*)data on:(OC_MetaDataTest*)obj;
90+(NSArray*)null4Tuple:(double*)data on:(OC_MetaDataTest*)obj;
91+(void)fillArray:(int*)data count:(int)count on:(OC_MetaDataTest*)obj;
92+(int)nullfillArray:(int*)data count:(int)count on:(OC_MetaDataTest*)obj;
93+(void)fill4Tuple:(int*)data on:(OC_MetaDataTest*)obj;
94+(int)nullfill4Tuple:(int*)data on:(OC_MetaDataTest*)obj;
95+(int)fillArray:(int*)data uptoCount:(int)count on:(OC_MetaDataTest*)obj;
96+(int)maybeFillArray:(int*)data on:(OC_MetaDataTest*)obj;
97+(void)fillStringArray:(char**)data on:(OC_MetaDataTest*)obj;
98+(int)nullfillStringArray:(char**)data on:(OC_MetaDataTest*)obj;
99+(void)reverseArray:(float*)data count:(int)count on:(OC_MetaDataTest*)obj;
100+(int)nullreverseArray:(float*)data count:(int)count on:(OC_MetaDataTest*)obj;
101+(void)reverseStrings:(char**)data on:(OC_MetaDataTest*)obj;
102+(int)nullreverseStrings:(char**)data on:(OC_MetaDataTest*)obj;
103+(void)reverse4Tuple:(short*)data on:(OC_MetaDataTest*)obj;
104+(int)nullreverse4Tuple:(short*)data on:(OC_MetaDataTest*)obj;
105+(int)reverseArray:(float*)data uptoCount:(int)count on:(OC_MetaDataTest*)obj;
106+(int)maybeReverseArray:(short*)data on:(OC_MetaDataTest*)obj;
107+(int)sumX:(int*)x andY:(int*)y on:(OC_MetaDataTest*)obj;
108+(int)divBy5:(int)x remainder:(int*)r on:(OC_MetaDataTest*)obj;
109+(void)swapX:(double*)x andY:(double*)y on:(OC_MetaDataTest*)obj;
110+(NSArray*)input:(int*)x output:(int*)y inputAndOutput:(int*)z on:(OC_MetaDataTest*)obj;
111
112/* Various */
113-(void)varargsMethodWithObjects:(id)first, ...;
114-(int)ignoreMethod;
115
116/* Byte arrays and C-strings */
117-(NSData*)makeDataForBytes:(char*)data count:(int)count;
118-(NSData*)makeDataForVoids:(void*)data count:(int)count;
119-(void)addOneToBytes:(char*)data count:(int)count;
120-(void)addOneToVoids:(void*)data count:(int)count;
121-(void)fillBuffer:(char*)data count:(int)count;
122-(void)fillVoids:(void*)data count:(int)count;
123
124@end
125
126@implementation OC_MetaDataTest
127
128
129-(int*)   makeIntArrayOf5
130{
131	static int result[5];
132	int i;
133	for (i = 0; i < 5; i++) {
134		result[i] = i*i;
135	}
136	return result;
137}
138
139-(char**) makeStringArray
140{
141	static char* result[] = {
142		"hello",
143		"world",
144		"out",
145		"there",
146		NULL
147	};
148	return result;
149}
150
151
152-(int*)   makeIntArrayOf:(int)count
153{
154	static int* result = NULL;
155	int i;
156
157	if (result) {
158		free(result);
159	}
160	result = malloc(sizeof(int) * count);
161	if (result == NULL) {
162		return NULL;
163	}
164	for (i = 0; i < count; i++) {
165		result[i] = i * i * i;
166	}
167	return result;
168}
169-(int*)   nullIntArrayOf5
170{
171	return NULL;
172}
173
174-(char**) nullStringArray
175{
176	return NULL;
177}
178
179-(int*)   nullIntArrayOf:(int)count
180{
181	use_int(count);
182	return NULL;
183}
184
185
186-(NSArray*)nullIntArray:(int*) data count:(unsigned)count
187{
188	if (data) {
189		return [self makeIntArray:data count:count];
190	} else {
191		return nil;
192	}
193}
194
195-(NSArray*)makeIntArray:(int*) data countPtr:(unsigned*)countPtr
196{
197	return [self makeIntArray:data count:*countPtr];
198}
199
200-(NSArray*)makeIntArray:(int*) data halfCount:(unsigned)count
201{
202	return [self makeIntArray:data count:count*2];
203}
204
205-(NSArray*)makeIntArray:(int*) data count:(unsigned)count
206{
207	NSMutableArray* array;
208	unsigned i;
209
210	array = [NSMutableArray arrayWithCapacity:count];
211
212	for (i = 0; i < count; i++) {
213		[array addObject: [NSNumber numberWithInt:data[i]]];
214	}
215	return array;
216}
217
218-(NSArray*)make4Tuple:(double*)data
219{
220	NSMutableArray* array;
221	unsigned i;
222
223	array = [NSMutableArray array];
224
225	for (i = 0; i < 4; i++) {
226		[array addObject: [NSNumber numberWithDouble:data[i]]];
227	}
228	return array;
229}
230
231-(NSArray*)null4Tuple:(double*)data
232{
233	if (data)  {
234		return [self make4Tuple:data];
235	} else {
236		return nil;
237	}
238}
239
240
241-(NSArray*)nullStringArray:(char**)data
242{
243	if (data) {
244		return [self makeStringArray:data];
245	} else {
246		return nil;
247	}
248}
249
250-(NSArray*)makeStringArray:(char**)data
251{
252	NSMutableArray* array;
253
254	array = [NSMutableArray array];
255
256	while (*data != NULL) {
257		[array addObject: [NSString stringWithCString: *data]];
258		data ++;
259	}
260	return array;
261}
262
263-(NSArray*)makeObjectArray:(id*)data;
264{
265	NSMutableArray* array;
266
267	array = [NSMutableArray array];
268
269	while (*data != NULL) {
270		[array addObject: *data];
271		data ++;
272	}
273	return array;
274}
275
276-(void)fillArray:(int*)data count:(int)count
277{
278	int i;
279	for (i = 0; i < count; i++) {
280		data[i] = i*i;
281	}
282}
283
284-(int)nullfillArray:(int*)data count:(int)count
285{
286	if (data == NULL) {
287		return 0;
288	} else {
289		[self fillArray:data count:count];
290		return 1;
291	}
292}
293
294-(void)fill4Tuple:(int*)data;
295{
296	int i;
297	for (i = 0; i < 4; i++) {
298		data[i] = - i * i * i;
299	}
300}
301
302-(int)nullfill4Tuple:(int*)data;
303{
304	if (data == NULL) {
305		return 0;
306	} else {
307		[self fill4Tuple:data];
308		return 1;
309	}
310}
311
312-(void)fillStringArray:(char**)data
313{
314	use_charpp(data);
315	/* NULL-terminated output arrays can't work */
316}
317
318-(int)nullfillStringArray:(char**)data
319{
320	if (data == NULL) return 0;
321	[self fillStringArray:data];
322	return 1;
323}
324
325-(void)reverseArray:(float*)data count:(int)count;
326{
327	float t;
328	int i;
329	for (i = 0; i < count / 2; i++) {
330		t = data[i];
331		data[i] = data[count - 1 - i];
332		data[count - 1 -i] = t;
333	}
334}
335
336-(int)nullreverseArray:(float*)data count:(int)count;
337{
338	if (data == NULL) return 0;
339	[self reverseArray:data count:count];
340	return 1;
341}
342
343-(void)reverseStrings:(char**)data;
344{
345	int count, i;
346	char* t;
347
348	for (count = 0; data[count] != NULL; count++) {
349		;
350	}
351
352	for (i = 0; i < count / 2 ; i++) {
353		t = data[i];
354		data[i] = data[count-1-i];
355		data[count-1-i] = t;
356	}
357}
358
359-(int)nullreverseStrings:(char**)data;
360{
361	if (data == NULL) return 0;
362	[self reverseStrings:data];
363	return 1;
364}
365
366-(void)reverse4Tuple:(short*)data
367{
368	short t;
369
370	t = data[0];
371	data[0] = data[3];
372	data[3] = t;
373
374	t = data[1];
375	data[1] = data[2];
376	data[2] = t;
377}
378
379-(int)nullreverse4Tuple:(short*)data
380{
381	if (data == NULL) return 0;
382	[self reverse4Tuple:data];
383	return 1;
384}
385
386-(int)sumX:(int*)x andY:(int*)y		/* in */
387{
388	return *x + *y;
389}
390
391-(int)divBy5:(int)x remainder:(int*)r	/* out */
392{
393	*r = x % 5;
394	return x / 5;
395}
396
397-(void)swapX:(double*)x andY:(double*)y /* inout */
398{
399	int t = *x;
400	*x = *y;
401	*y = t;
402}
403
404-(NSArray*)input:(int*)x output:(int*)y inputAndOutput:(int*)z
405{
406	char buf[64];
407	NSMutableArray* result = [NSMutableArray array];
408
409	snprintf(buf, sizeof(buf), "%p", x);
410	[result addObject: [NSString stringWithCString:buf]];
411
412	snprintf(buf, sizeof(buf), "%p", y);
413	[result addObject: [NSString stringWithCString:buf]];
414
415	snprintf(buf, sizeof(buf), "%p", z);
416	[result addObject: [NSString stringWithCString:buf]];
417
418	if (y) {
419		if (x) {
420			if (z) {
421				*y = *x + *z;
422			} else {
423				*y = *x + 42;
424			}
425		} else if (z) {
426			*y = 42 - *z;
427		} else {
428			*y = -1;
429		}
430	}
431
432	if (z) {
433		if (x) {
434			*z = *x - *z;
435		} else {
436			*z = -*z;
437		}
438	}
439
440	return result;
441}
442
443-(int)fillArray:(int*)data uptoCount:(int)count
444{
445	int i;
446	for (i = 0; i < count / 2; i++) {
447		data[i] = i + 2;
448	}
449	for (i = count/2; i < count; i++) {
450		data[i] = -42;
451	}
452	return count/2;
453}
454
455-(int)maybeFillArray:(int*)data
456{
457	int i;
458	for (i = 0; i < 2; i++) {
459		data[i] = i + 10;
460	}
461	for (i = 2; i < 4; i++) {
462		data[i] = -42;
463	}
464	return 2;
465}
466
467-(int)reverseArray:(float*)data uptoCount:(int)count
468{
469	[self reverseArray:data count:count];
470	return count/2;
471}
472
473-(int)maybeReverseArray:(short*)data;
474{
475	[self reverse4Tuple:data];
476	return 2;
477}
478
479
480+(int*)   makeIntArrayOf5On:(OC_MetaDataTest*)obj
481{
482	return [obj makeIntArrayOf5];
483}
484
485+(char**) makeStringArrayOn:(OC_MetaDataTest*)obj
486{
487	return [obj makeStringArray];
488}
489
490+(int*)   makeIntArrayOf:(int)count on:(OC_MetaDataTest*)obj
491{
492	return [obj makeIntArrayOf:count];
493}
494
495+(const int*)   nullIntArrayOf5On:(OC_MetaDataTest*)obj
496{
497	return [obj nullIntArrayOf5];
498}
499
500+(char**) nullStringArrayOn:(OC_MetaDataTest*)obj
501{
502	return [obj nullStringArray];
503}
504
505+(int*)   nullIntArrayOf:(int)count on:(OC_MetaDataTest*)obj
506{
507	return [obj nullIntArrayOf:count];
508}
509
510+(NSArray*)makeIntArray:(int*) data count:(unsigned)count on:(OC_MetaDataTest*)obj
511{
512	return [obj makeIntArray:data count:count];
513}
514
515+(NSArray*)makeIntArray:(int*) data countPtr:(unsigned*)countPtr on:(OC_MetaDataTest*)obj
516{
517	return [obj makeIntArray:data countPtr:countPtr];
518}
519
520+(NSArray*)nullIntArray:(int*) data count:(unsigned)count on:(OC_MetaDataTest*)obj
521{
522	return [obj nullIntArray:data count:count];
523}
524
525+(NSArray*)makeStringArray:(char**)data on:(OC_MetaDataTest*)obj
526{
527	return [obj makeStringArray:data];
528}
529
530+(NSArray*)makeObjectArray:(id*)data on:(OC_MetaDataTest*)obj
531{
532	return [obj makeObjectArray:data];
533}
534
535+(NSArray*)nullStringArray:(char**)data on:(OC_MetaDataTest*)obj
536{
537	return [obj nullStringArray:data];
538}
539
540+(NSArray*)make4Tuple:(double*)data on:(OC_MetaDataTest*)obj
541{
542	return [obj make4Tuple:data];
543}
544
545+(NSArray*)null4Tuple:(double*)data on:(OC_MetaDataTest*)obj
546{
547	return [obj null4Tuple:data];
548}
549
550+(void)fillArray:(int*)data count:(int)count on:(OC_MetaDataTest*)obj
551{
552	return [obj fillArray:data count:count];
553}
554
555+(int)nullfillArray:(int*)data count:(int)count on:(OC_MetaDataTest*)obj
556{
557	return [obj nullfillArray:data count:count];
558}
559
560+(void)fill4Tuple:(int*)data on:(OC_MetaDataTest*)obj
561{
562	return [obj fill4Tuple:data];
563}
564
565+(int)nullfill4Tuple:(int*)data on:(OC_MetaDataTest*)obj
566{
567	return [obj nullfill4Tuple:data];
568}
569
570+(int)fillArray:(int*)data uptoCount:(int)count on:(OC_MetaDataTest*)obj
571{
572	return [obj fillArray:data uptoCount:count];
573}
574
575+(int)maybeFillArray:(int*)data on:(OC_MetaDataTest*)obj
576{
577	return [obj maybeFillArray:data];
578}
579
580+(void)fillStringArray:(char**)data on:(OC_MetaDataTest*)obj
581{
582	[obj fillStringArray:data];
583}
584
585+(int)nullfillStringArray:(char**)data on:(OC_MetaDataTest*)obj
586{
587	return [obj nullfillStringArray:data];
588}
589
590+(void)reverseArray:(float*)data count:(int)count on:(OC_MetaDataTest*)obj
591{
592	[obj reverseArray:data count:count];
593}
594
595+(int)nullreverseArray:(float*)data count:(int)count on:(OC_MetaDataTest*)obj
596{
597	return [obj nullreverseArray:data count:count];
598}
599
600+(void)reverseStrings:(char**)data on:(OC_MetaDataTest*)obj
601{
602	[obj reverseStrings:data];
603}
604
605+(int)nullreverseStrings:(char**)data on:(OC_MetaDataTest*)obj
606{
607	return [obj nullreverseStrings:data];
608}
609
610+(void)reverse4Tuple:(short*)data on:(OC_MetaDataTest*)obj
611{
612	[obj reverse4Tuple:data];
613}
614
615+(int)nullreverse4Tuple:(short*)data on:(OC_MetaDataTest*)obj
616{
617	return [obj nullreverse4Tuple:data];
618}
619
620+(int)reverseArray:(float*)data uptoCount:(int)count on:(OC_MetaDataTest*)obj
621{
622	return [obj reverseArray:data uptoCount:count];
623}
624
625+(int)maybeReverseArray:(short*)data on:(OC_MetaDataTest*)obj
626{
627	return [obj maybeReverseArray:data];
628}
629
630+(int)sumX:(int*)x andY:(int*)y on:(OC_MetaDataTest*)obj
631{
632	return [obj sumX:x andY:y];
633}
634
635+(int)divBy5:(int)x remainder:(int*)r on:(OC_MetaDataTest*)obj
636{
637	return [obj divBy5:x remainder:r];
638}
639
640+(void)swapX:(double*)x andY:(double*)y on:(OC_MetaDataTest*)obj
641{
642	return [obj swapX:x andY:y];
643}
644
645+(NSArray*)input:(int*)x output:(int*)y inputAndOutput:(int*)z on:(OC_MetaDataTest*)obj
646{
647	return [obj input:x output:y inputAndOutput:z];
648}
649
650-(NSArray*)makeArrayWithFormat:(NSString*)fmt, ...
651{
652	va_list ap;
653	char buffer[2048];
654
655	va_start(ap, fmt);
656	vsnprintf(buffer, sizeof(buffer), [fmt UTF8String], ap);
657	va_end(ap);
658
659	return [NSArray arrayWithObjects:
660			fmt,
661			[NSString stringWithUTF8String:buffer],
662			NULL];
663}
664
665-(NSArray*)makeArrayWithCFormat:(char*)fmt, ...
666{
667	va_list ap;
668	char  buffer[2048];
669
670	va_start(ap, fmt);
671	vsnprintf(buffer, sizeof(buffer), fmt, ap);
672	va_end(ap);
673
674	return [NSArray arrayWithObjects:
675			[NSString stringWithUTF8String:fmt],
676			[NSString stringWithUTF8String:buffer],
677			NULL];
678}
679
680-(NSArray*)makeArrayWithArguments:(id)arg, ...;
681{
682	va_list ap;
683	NSMutableArray* array = [[NSMutableArray alloc] init];
684	if (arg == NULL) {
685		return array;
686	}
687
688
689	va_start(ap, arg);
690	do {
691		[array addObject:arg];
692		arg = va_arg(ap, id);
693	} while (arg != NULL);
694
695	va_end(ap);
696	return array;
697}
698
699-(void)varargsMethodWithObjects:(id)first, ...
700{
701	use_id(first);
702}
703
704-(int)ignoreMethod
705{
706	return 42;
707}
708
709-(NSData*)makeDataForBytes:(char*)data count:(int)count
710{
711	return [NSData dataWithBytes:data length:count];
712}
713
714-(NSData*)makeDataForVoids:(void*)data count:(int)count
715{
716	return [NSData dataWithBytes:data length:count];
717}
718
719-(void)addOneToBytes:(char*)data count:(int)count
720{
721	int i;
722	for (i = 0;i < count; i++) {
723		data[i] += 1;
724	}
725}
726
727-(void)addOneToVoids:(void*)data count:(int)count
728{
729	int i;
730	for (i = 0; i < count; i++) {
731		((char*)data)[i] += 2;
732	}
733}
734
735-(void)fillBuffer:(char*)data count:(int)count
736{
737	memset(data, '\xfe', count);
738}
739
740-(void)fillVoids:(void*)data count:(int)count
741{
742	memset(data, '\xab', count);
743}
744
745-(int*)   unknownLengthArray
746{
747static  int theValue[] = { 1, 3, 5, 7, 11, 13, 17, 19 };
748	return theValue;
749}
750
751-(int*)  unknownLengthMutable
752{
753static  int theValue[20];
754	return theValue;
755}
756
757-(NSArray*) makeVariableLengthArray:(int*)array halfCount:(int)cnt
758{
759	cnt *= 2;
760
761	NSMutableArray* result;
762	int i;
763
764	result = [NSMutableArray arrayWithCapacity:cnt];
765
766	for (i = 0; i < cnt; i++) {
767		[result addObject: [NSNumber numberWithFloat:array[i]]];
768	}
769	return result;
770}
771
772
773@end
774
775
776static PyMethodDef mod_methods[] = {
777	        { 0, 0, 0, 0 }
778};
779
780void initmetadata(void);
781void initmetadata(void)
782{
783	PyObject* m;
784
785	m = Py_InitModule4("metadata", mod_methods, NULL, NULL, PYTHON_API_VERSION);
786
787	PyObjC_ImportAPI(m);
788
789	PyModule_AddObject(m, "OC_MetaDataTest",
790		PyObjCClass_New([OC_MetaDataTest class]));
791}
792