1 | # Scan an Apple header file, generating a Python file of generator calls.
|
---|
2 |
|
---|
3 | import sys
|
---|
4 | from bgenlocations import TOOLBOXDIR, BGENDIR
|
---|
5 | sys.path.append(BGENDIR)
|
---|
6 | from scantools import Scanner_OSX
|
---|
7 |
|
---|
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",
|
---|
17 | )
|
---|
18 | # ADD object typenames here
|
---|
19 |
|
---|
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",
|
---|
39 | ]
|
---|
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! ==="
|
---|
51 |
|
---|
52 | class MyScanner(Scanner_OSX):
|
---|
53 |
|
---|
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
|
---|
69 |
|
---|
70 | def writeinitialdefs(self):
|
---|
71 | self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
|
---|
72 |
|
---|
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
|
---|
101 | ]
|
---|
102 |
|
---|
103 | def makegreylist(self):
|
---|
104 | return []
|
---|
105 |
|
---|
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
|
---|
116 | ]
|
---|
117 |
|
---|
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", "*", "*")]),
|
---|
123 |
|
---|
124 | ([("UniChar_ptr", "*", "InMode"), ("CFIndex", "*", "InMode")],
|
---|
125 | [("UnicodeInBuffer", "*", "*")]),
|
---|
126 |
|
---|
127 | # Some functions return a const char *. Don't worry, we won't modify it.
|
---|
128 | ([("const_char_ptr", "*", "ReturnMode")],
|
---|
129 | [("return_stringptr", "*", "*")]),
|
---|
130 |
|
---|
131 | # base URLs are optional (pass None for NULL)
|
---|
132 | ([("CFURLRef", "baseURL", "InMode")],
|
---|
133 | [("OptionalCFURLRef", "*", "*")]),
|
---|
134 |
|
---|
135 | # We handle CFPropertyListRef objects as plain CFTypeRef
|
---|
136 | ([("CFPropertyListRef", "*", "*")],
|
---|
137 | [("CFTypeRef", "*", "*")]),
|
---|
138 | ]
|
---|
139 |
|
---|
140 | if __name__ == "__main__":
|
---|
141 | main()
|
---|