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