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