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