move sections
[python/dscho.git] / Mac / Modules / cf / cfscan.py
blob6de4f1edc830d94a556808ccc1555af44153be19
1 # Scan an Apple header file, generating a Python file of generator calls.
3 import sys
4 from bgenlocations import TOOLBOXDIR, BGENDIR
5 sys.path.append(BGENDIR)
6 from scantools import Scanner_OSX
8 LONG = "CoreFoundation"
9 SHORT = "cf"
10 OBJECTS = ("CFTypeRef",
11 "CFArrayRef", "CFMutableArrayRef",
12 "CFDataRef", "CFMutableDataRef",
13 "CFDictionaryRef", "CFMutableDictionaryRef",
14 "CFStringRef", "CFMutableStringRef",
15 "CFURLRef",
16 ## "CFPropertyListRef",
18 # ADD object typenames here
20 def main():
21 input = [
22 "CFBase.h",
23 "CFArray.h",
24 ## "CFBag.h",
25 ## "CFBundle.h",
26 ## "CFCharacterSet.h",
27 "CFData.h",
28 ## "CFDate.h",
29 "CFDictionary.h",
30 ## "CFNumber.h",
31 ## "CFPlugIn.h",
32 "CFPreferences.h",
33 "CFPropertyList.h",
34 ## "CFSet.h",
35 "CFString.h",
36 ## "CFStringEncodingExt.h",
37 ## "CFTimeZone.h",
38 "CFURL.h",
40 output = SHORT + "gen.py"
41 defsoutput = TOOLBOXDIR + LONG + ".py"
42 scanner = MyScanner(input, output, defsoutput)
43 scanner.scan()
44 scanner.gentypetest(SHORT+"typetest.py")
45 scanner.close()
46 print "=== Testing definitions output code ==="
47 execfile(defsoutput, {}, {})
48 print "=== Done scanning and generating, now importing the generated code... ==="
49 exec "import " + SHORT + "support"
50 print "=== Done. It's up to you to compile it now! ==="
52 class MyScanner(Scanner_OSX):
54 def destination(self, type, name, arglist):
55 classname = "Function"
56 listname = "functions"
57 if arglist and name[:13] != 'CFPreferences':
58 t, n, m = arglist[0]
59 if t in OBJECTS and m == "InMode":
60 classname = "Method"
61 listname = t + "_methods"
62 # Special case for the silly first AllocatorRef argument
63 if t == 'CFAllocatorRef' and m == 'InMode' and len(arglist) > 1:
64 t, n, m = arglist[1]
65 if t in OBJECTS and m == "InMode":
66 classname = "MethodSkipArg1"
67 listname = t + "_methods"
68 return classname, listname
70 def writeinitialdefs(self):
71 self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
73 def makeblacklistnames(self):
74 return [
75 # Memory allocator functions
76 "CFAllocatorGetDefault",
77 "CFAllocatorSetDefault",
78 "CFAllocatorAllocate",
79 "CFAllocatorReallocate",
80 "CFAllocatorDeallocate",
81 "CFGetAllocator",
82 # Array functions we skip for now.
83 "CFArrayGetValueAtIndex",
84 # Data pointer functions. Skip for now.
85 "CFDataGetBytePtr",
86 "CFDataGetMutableBytePtr",
87 "CFDataGetBytes", # XXXX Should support this one
88 # String functions
89 "CFStringGetPascalString", # Use the C-string methods.
90 "CFStringGetPascalStringPtr", # TBD automatically
91 "CFStringGetCStringPtr",
92 "CFStringGetCharactersPtr",
93 "CFStringGetCString",
94 "CFStringGetCharacters",
95 "CFURLCreateStringWithFileSystemPath", # Gone in later releases
96 "CFStringCreateMutableWithExternalCharactersNoCopy", # Not a clue...
97 "CFStringSetExternalCharactersNoCopy",
98 "CFStringGetCharacterAtIndex", # No format for single unichars yet.
99 "kCFStringEncodingInvalidId", # incompatible constant declaration
100 "CFPropertyListCreateFromXMLData", # Manually generated
103 def makegreylist(self):
104 return []
106 def makeblacklisttypes(self):
107 return [
108 "CFComparatorFunction", # Callback function pointer
109 "CFAllocatorContext", # Not interested in providing our own allocator
110 "void_ptr_ptr", # Tricky. This is the initializer for arrays...
111 "void_ptr", # Ditto for various array lookup methods
112 "CFArrayApplierFunction", # Callback function pointer
113 "CFDictionaryApplierFunction", # Callback function pointer
114 "va_list", # For printf-to-a-cfstring. Use Python.
115 "const_CFStringEncoding_ptr", # To be done, I guess
118 def makerepairinstructions(self):
119 return [
120 # Buffers in CF seem to be passed as UInt8 * normally.
121 ([("UInt8_ptr", "*", "InMode"), ("CFIndex", "*", "InMode")],
122 [("UcharInBuffer", "*", "*")]),
124 ([("UniChar_ptr", "*", "InMode"), ("CFIndex", "*", "InMode")],
125 [("UnicodeInBuffer", "*", "*")]),
127 # Some functions return a const char *. Don't worry, we won't modify it.
128 ([("const_char_ptr", "*", "ReturnMode")],
129 [("return_stringptr", "*", "*")]),
131 # base URLs are optional (pass None for NULL)
132 ([("CFURLRef", "baseURL", "InMode")],
133 [("OptionalCFURLRef", "*", "*")]),
135 # We handle CFPropertyListRef objects as plain CFTypeRef
136 ([("CFPropertyListRef", "*", "*")],
137 [("CFTypeRef", "*", "*")]),
140 if __name__ == "__main__":
141 main()