1686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansen# Scan an Apple header file, generating a Python file of generator calls. 2686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansen 3686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansenimport sys 4aaebdd6a02dd4d650b14e2192e327336ecb62a98Jack Jansenfrom bgenlocations import TOOLBOXDIR, BGENDIR 5686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansensys.path.append(BGENDIR) 6686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansenfrom scantools import Scanner_OSX 7686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansen 8686f9c344cfa68c04be9f0894fa89cf7937775c6Jack JansenLONG = "CoreFoundation" 9686f9c344cfa68c04be9f0894fa89cf7937775c6Jack JansenSHORT = "cf" 10182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOBJECTS = ("CFTypeRef", 11182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFArrayRef", "CFMutableArrayRef", 12182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFDataRef", "CFMutableDataRef", 13182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFDictionaryRef", "CFMutableDictionaryRef", 14182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFStringRef", "CFMutableStringRef", 15182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFURLRef", 16182b5aca27d376b08a2904bed42b751496f932f3Tim Peters## "CFPropertyListRef", 17182b5aca27d376b08a2904bed42b751496f932f3Tim Peters ) 18bc7c8960e0afe272a89b37607664819599e5572eJack Jansen# ADD object typenames here 19686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansen 20686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansendef main(): 21182b5aca27d376b08a2904bed42b751496f932f3Tim Peters input = [ 22182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFBase.h", 23182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFArray.h", 24182b5aca27d376b08a2904bed42b751496f932f3Tim Peters## "CFBag.h", 25182b5aca27d376b08a2904bed42b751496f932f3Tim Peters## "CFBundle.h", 26182b5aca27d376b08a2904bed42b751496f932f3Tim Peters## "CFCharacterSet.h", 27182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFData.h", 28182b5aca27d376b08a2904bed42b751496f932f3Tim Peters## "CFDate.h", 29182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFDictionary.h", 30182b5aca27d376b08a2904bed42b751496f932f3Tim Peters## "CFNumber.h", 31182b5aca27d376b08a2904bed42b751496f932f3Tim Peters## "CFPlugIn.h", 32182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFPreferences.h", 33182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFPropertyList.h", 34182b5aca27d376b08a2904bed42b751496f932f3Tim Peters## "CFSet.h", 35182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFString.h", 36182b5aca27d376b08a2904bed42b751496f932f3Tim Peters## "CFStringEncodingExt.h", 37182b5aca27d376b08a2904bed42b751496f932f3Tim Peters## "CFTimeZone.h", 38182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFURL.h", 39182b5aca27d376b08a2904bed42b751496f932f3Tim Peters ] 40182b5aca27d376b08a2904bed42b751496f932f3Tim Peters output = SHORT + "gen.py" 41182b5aca27d376b08a2904bed42b751496f932f3Tim Peters defsoutput = TOOLBOXDIR + LONG + ".py" 42182b5aca27d376b08a2904bed42b751496f932f3Tim Peters scanner = MyScanner(input, output, defsoutput) 43182b5aca27d376b08a2904bed42b751496f932f3Tim Peters scanner.scan() 44182b5aca27d376b08a2904bed42b751496f932f3Tim Peters scanner.gentypetest(SHORT+"typetest.py") 45182b5aca27d376b08a2904bed42b751496f932f3Tim Peters scanner.close() 46182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print "=== Testing definitions output code ===" 47182b5aca27d376b08a2904bed42b751496f932f3Tim Peters execfile(defsoutput, {}, {}) 48182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print "=== Done scanning and generating, now importing the generated code... ===" 49182b5aca27d376b08a2904bed42b751496f932f3Tim Peters exec "import " + SHORT + "support" 50182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print "=== Done. It's up to you to compile it now! ===" 51686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansen 52686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansenclass MyScanner(Scanner_OSX): 53686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansen 54182b5aca27d376b08a2904bed42b751496f932f3Tim Peters def destination(self, type, name, arglist): 55182b5aca27d376b08a2904bed42b751496f932f3Tim Peters classname = "Function" 56182b5aca27d376b08a2904bed42b751496f932f3Tim Peters listname = "functions" 57182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if arglist and name[:13] != 'CFPreferences': 58182b5aca27d376b08a2904bed42b751496f932f3Tim Peters t, n, m = arglist[0] 59182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if t in OBJECTS and m == "InMode": 60182b5aca27d376b08a2904bed42b751496f932f3Tim Peters classname = "Method" 61182b5aca27d376b08a2904bed42b751496f932f3Tim Peters listname = t + "_methods" 62182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Special case for the silly first AllocatorRef argument 63182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if t == 'CFAllocatorRef' and m == 'InMode' and len(arglist) > 1: 64182b5aca27d376b08a2904bed42b751496f932f3Tim Peters t, n, m = arglist[1] 65182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if t in OBJECTS and m == "InMode": 66182b5aca27d376b08a2904bed42b751496f932f3Tim Peters classname = "MethodSkipArg1" 67182b5aca27d376b08a2904bed42b751496f932f3Tim Peters listname = t + "_methods" 68182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return classname, listname 69686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansen 70182b5aca27d376b08a2904bed42b751496f932f3Tim Peters def writeinitialdefs(self): 71182b5aca27d376b08a2904bed42b751496f932f3Tim Peters self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n") 72686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansen 73182b5aca27d376b08a2904bed42b751496f932f3Tim Peters def makeblacklistnames(self): 74182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return [ 75182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Memory allocator functions 76182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFAllocatorGetDefault", 77182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFAllocatorSetDefault", 78182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFAllocatorAllocate", 79182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFAllocatorReallocate", 80182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFAllocatorDeallocate", 81182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFGetAllocator", 82182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Array functions we skip for now. 83182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFArrayGetValueAtIndex", 84182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Data pointer functions. Skip for now. 85182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFDataGetBytePtr", 86182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFDataGetMutableBytePtr", 87182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFDataGetBytes", # XXXX Should support this one 88182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # String functions 89182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFStringGetPascalString", # Use the C-string methods. 90182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFStringGetPascalStringPtr", # TBD automatically 91182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFStringGetCStringPtr", 92182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFStringGetCharactersPtr", 93182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFStringGetCString", 94182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFStringGetCharacters", 95182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFURLCreateStringWithFileSystemPath", # Gone in later releases 96182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFStringCreateMutableWithExternalCharactersNoCopy", # Not a clue... 97182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFStringSetExternalCharactersNoCopy", 98182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFStringGetCharacterAtIndex", # No format for single unichars yet. 99182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "kCFStringEncodingInvalidId", # incompatible constant declaration 100182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFPropertyListCreateFromXMLData", # Manually generated 101182b5aca27d376b08a2904bed42b751496f932f3Tim Peters ] 102686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansen 103182b5aca27d376b08a2904bed42b751496f932f3Tim Peters def makegreylist(self): 104182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return [] 105686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansen 106182b5aca27d376b08a2904bed42b751496f932f3Tim Peters def makeblacklisttypes(self): 107182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return [ 108182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFComparatorFunction", # Callback function pointer 109182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFAllocatorContext", # Not interested in providing our own allocator 110182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "void_ptr_ptr", # Tricky. This is the initializer for arrays... 111182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "void_ptr", # Ditto for various array lookup methods 112182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFArrayApplierFunction", # Callback function pointer 113182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "CFDictionaryApplierFunction", # Callback function pointer 114182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "va_list", # For printf-to-a-cfstring. Use Python. 115182b5aca27d376b08a2904bed42b751496f932f3Tim Peters "const_CFStringEncoding_ptr", # To be done, I guess 116182b5aca27d376b08a2904bed42b751496f932f3Tim Peters ] 117686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansen 118182b5aca27d376b08a2904bed42b751496f932f3Tim Peters def makerepairinstructions(self): 119182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return [ 120182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Buffers in CF seem to be passed as UInt8 * normally. 121182b5aca27d376b08a2904bed42b751496f932f3Tim Peters ([("UInt8_ptr", "*", "InMode"), ("CFIndex", "*", "InMode")], 122182b5aca27d376b08a2904bed42b751496f932f3Tim Peters [("UcharInBuffer", "*", "*")]), 123182b5aca27d376b08a2904bed42b751496f932f3Tim Peters 124182b5aca27d376b08a2904bed42b751496f932f3Tim Peters ([("UniChar_ptr", "*", "InMode"), ("CFIndex", "*", "InMode")], 125182b5aca27d376b08a2904bed42b751496f932f3Tim Peters [("UnicodeInBuffer", "*", "*")]), 126182b5aca27d376b08a2904bed42b751496f932f3Tim Peters 127182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Some functions return a const char *. Don't worry, we won't modify it. 128182b5aca27d376b08a2904bed42b751496f932f3Tim Peters ([("const_char_ptr", "*", "ReturnMode")], 129182b5aca27d376b08a2904bed42b751496f932f3Tim Peters [("return_stringptr", "*", "*")]), 130182b5aca27d376b08a2904bed42b751496f932f3Tim Peters 131182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # base URLs are optional (pass None for NULL) 132182b5aca27d376b08a2904bed42b751496f932f3Tim Peters ([("CFURLRef", "baseURL", "InMode")], 133182b5aca27d376b08a2904bed42b751496f932f3Tim Peters [("OptionalCFURLRef", "*", "*")]), 134182b5aca27d376b08a2904bed42b751496f932f3Tim Peters 135182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # We handle CFPropertyListRef objects as plain CFTypeRef 136182b5aca27d376b08a2904bed42b751496f932f3Tim Peters ([("CFPropertyListRef", "*", "*")], 137182b5aca27d376b08a2904bed42b751496f932f3Tim Peters [("CFTypeRef", "*", "*")]), 138182b5aca27d376b08a2904bed42b751496f932f3Tim Peters ] 13969ac361cb54c2134a13bd27b685ba8d01e3c9aa9Jack Jansen 140686f9c344cfa68c04be9f0894fa89cf7937775c6Jack Jansenif __name__ == "__main__": 141182b5aca27d376b08a2904bed42b751496f932f3Tim Peters main() 142