1e2ba87396cde5b57259405722910c560f7d237c6Jack Jansen# Scan an Apple header file, generating a Python file of generator calls.
2e2ba87396cde5b57259405722910c560f7d237c6Jack Jansen
3e2ba87396cde5b57259405722910c560f7d237c6Jack Jansenimport sys
4e2ba87396cde5b57259405722910c560f7d237c6Jack Jansenfrom bgenlocations import TOOLBOXDIR, BGENDIR
5e2ba87396cde5b57259405722910c560f7d237c6Jack Jansensys.path.append(BGENDIR)
6e2ba87396cde5b57259405722910c560f7d237c6Jack Jansenfrom scantools import Scanner_OSX
7e2ba87396cde5b57259405722910c560f7d237c6Jack Jansen
8e2ba87396cde5b57259405722910c560f7d237c6Jack JansenLONG = "Files"
9e2ba87396cde5b57259405722910c560f7d237c6Jack JansenSHORT = "file"
10e2ba87396cde5b57259405722910c560f7d237c6Jack Jansen
11e2ba87396cde5b57259405722910c560f7d237c6Jack Jansendef main():
12182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    input = ["Files.h", "Aliases.h", "Finder.h"]
13182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    output = SHORT + "gen.py"
14182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    defsoutput = TOOLBOXDIR + LONG + ".py"
15182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    scanner = MyScanner(input, output, defsoutput)
16182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    scanner.scan()
17182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    scanner.close()
18182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    scanner.gentypetest(SHORT+"typetest.py")
19182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    print "=== Testing definitions output code ==="
20182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    execfile(defsoutput, {}, {})
21182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    print "=== Done scanning and generating, now importing the generated code... ==="
22182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    exec "import " + SHORT + "support"
23182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    print "=== Done.  It's up to you to compile it now! ==="
24e2ba87396cde5b57259405722910c560f7d237c6Jack Jansen
25e2ba87396cde5b57259405722910c560f7d237c6Jack Jansenclass MyScanner(Scanner_OSX):
26e2ba87396cde5b57259405722910c560f7d237c6Jack Jansen
27182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def destination(self, type, name, arglist):
28182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        classname = "Function"
29182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        listname = "functions"
30182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        if arglist:
31182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            # Funny special case
32182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            if len(arglist) > 2:
33182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                t, n, m = arglist[1]
34182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                if t == "AliasHandle" and m == "InMode":
35182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                    classname = "Arg2MethodGenerator"
36182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                    listname = "alias_methods"
37182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                    return classname, listname
38182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            # Normal cases
39182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            t, n, m = arglist[0]
40182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            if t == "AliasHandle" and m == "InMode":
41182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                classname = "Method"
42182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                listname = "alias_methods"
43182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            if t == "FSSpec_ptr" and m == "InMode":
44182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                classname = "Method"
45182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                listname = "fsspec_methods"
46182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            if t == "FSRef_ptr" and m == "InMode":
47182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                classname = "Method"
48182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                listname = "fsref_methods"
49182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return classname, listname
50182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
51182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def makeblacklistnames(self):
52182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return [
53182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # Constants with incompatible definitions
54182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "kioACAccessOwnerMask",
55182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "kFSCatInfoReserved",
56182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "kFSIterateReserved",
57182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "kSystemFolderType",
58182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
59182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSRefMakePath", # Do this manually
60182b5aca27d376b08a2904bed42b751496f932f3Tim Peters#                       "ResolveAlias", # Do this manually
61182b5aca27d376b08a2904bed42b751496f932f3Tim Peters#                       "ResolveAliasWithMountFlags", # Do this manually
62182b5aca27d376b08a2904bed42b751496f932f3Tim Peters#                       "FollowFinderAlias", # Do this manually
63182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
64182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSRead", # Couldn't be bothered
65182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSWrite", # ditto
66182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSReadFork", # ditto
67182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSWriteFork", # ditto
68182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
69182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # Old routines:
70182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "GetWDInfo",
71182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "OpenWD",
72182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "CloseWD",
73182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FInitQueue",
74182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "rstflock",
75182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "setflock",
76182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "setfinfo",
77182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "fsrename",
78182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "fsdelete",
79182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "create",
80182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "flushvol",
81182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "eject",
82182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "umountvol",
83182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "setvol",
84182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "getvol",
85182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "getfinfo",
86182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "getvinfo",
87182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "fsopen",
88182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "RstFLock",
89182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "SetFLock",
90182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "SetFInfo",
91182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "Rename",
92182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "OpenRF",
93182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSDelete",
94182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "Create",
95182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "GetVol",
96182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "GetFInfo",
97182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "GetVInfo",
98182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSOpen",
99182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "Eject",
100182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "SetVol",
101182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "openrf",
102182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "unmountvol",
103182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "OpenDF",
104182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
105182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ]
106182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
107182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def makeblacklisttypes(self):
108182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return [
109182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "CInfoPBPtr", # Old stuff
110182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "CMovePBPtr", # Old stuff
111182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "ParmBlkPtr", # Old stuff
112182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "HParmBlkPtr", # Old stuff
113182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "DTPBPtr", # Old stuff
114182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FCBPBPtr", # Old stuff
115182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "QHdrPtr", # Old stuff
116182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "CSParamPtr", # Old stuff
117182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSCatalogBulkParam", # old stuff
118182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSForkCBInfoParam", # old stuff
119182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSForkIOParam", # old stuff
120182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSRefParam",  # old stuff
121182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSVolumeInfoParam", # old stuff
122182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "WDPBPtr", # old stuff
123182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "XCInfoPBPtr", # old stuff
124182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "XVolumeParamPtr", # old stuff
125182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
126182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
127182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "CatPositionRec", # State variable, not too difficult
128182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSIterator", # Should become an object
129182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSForkInfo", # Lots of fields, difficult struct
130182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSSearchParams", # Also catsearch stuff
131182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSVolumeInfo", # big struct
132182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FSVolumeInfo_ptr", # big struct
133182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
134182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "IOCompletionProcPtr", # proc pointer
135182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "IOCompletionUPP", # Proc pointer
136182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "AliasFilterProcPtr",
137182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "AliasFilterUPP",
138182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FNSubscriptionUPP",
139182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
140182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FNSubscriptionRef", # Lazy, for now.
141182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ]
142182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
143182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def makerepairinstructions(self):
144182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return [
145182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # Various ways to give pathnames
146182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([('char_ptr', '*', 'InMode')],
147182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [('stringptr', '*', 'InMode')]
148182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ),
149182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
150182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # Unicode filenames passed as length, buffer
151182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([('UniCharCount', '*', 'InMode'),
152182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                  ('UniChar_ptr', '*', 'InMode')],
153182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [('UnicodeReverseInBuffer', '*', 'InMode')]
154182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ),
155182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # Wrong guess
156182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([('Str63', 'theString', 'InMode')],
157182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [('Str63', 'theString', 'OutMode')]),
158182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
159182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # Yet another way to give a pathname:-)
160182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([('short', 'fullPathLength', 'InMode'),
161182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                  ('void_ptr', 'fullPath', 'InMode')],
162182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [('FullPathName', 'fullPath', 'InMode')]),
163182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
164182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # Various ResolveAliasFileXXXX functions
165182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([('FSSpec', 'theSpec', 'OutMode')],
166182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [('FSSpec_ptr', 'theSpec', 'InOutMode')]),
167182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
168182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([('FSRef', 'theRef', 'OutMode')],
169182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [('FSRef_ptr', 'theRef', 'InOutMode')]),
170182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
171182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # The optional FSSpec to all ResolveAlias and NewAlias methods
172182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([('FSSpec_ptr', 'fromFile', 'InMode')],
173182b5aca27d376b08a2904bed42b751496f932f3Tim Peters         [('OptFSSpecPtr', 'fromFile', 'InMode')]),
174182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
175182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([('FSRef_ptr', 'fromFile', 'InMode')],
176182b5aca27d376b08a2904bed42b751496f932f3Tim Peters         [('OptFSRefPtr', 'fromFile', 'InMode')]),
177182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
178182b5aca27d376b08a2904bed42b751496f932f3Tim Peters##              # FSCatalogInfo input handling
179182b5aca27d376b08a2904bed42b751496f932f3Tim Peters##                      ([('FSCatalogInfoBitmap', 'whichInfo', 'InMode'),
180182b5aca27d376b08a2904bed42b751496f932f3Tim Peters##                ('FSCatalogInfo_ptr', 'catalogInfo', 'InMode')],
181182b5aca27d376b08a2904bed42b751496f932f3Tim Peters##               [('FSCatalogInfoAndBitmap_in', 'catalogInfo', 'InMode')]),
182182b5aca27d376b08a2904bed42b751496f932f3Tim Peters##
183182b5aca27d376b08a2904bed42b751496f932f3Tim Peters##              # FSCatalogInfo output handling
184182b5aca27d376b08a2904bed42b751496f932f3Tim Peters##                      ([('FSCatalogInfoBitmap', 'whichInfo', 'InMode'),
185182b5aca27d376b08a2904bed42b751496f932f3Tim Peters##                ('FSCatalogInfo', 'catalogInfo', 'OutMode')],
186182b5aca27d376b08a2904bed42b751496f932f3Tim Peters##               [('FSCatalogInfoAndBitmap_out', 'catalogInfo', 'InOutMode')]),
187182b5aca27d376b08a2904bed42b751496f932f3Tim Peters##
188182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
189182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        ]
190182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
191182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
192182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def writeinitialdefs(self):
193182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
194182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.defsfile.write("true = True\n")
195182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.defsfile.write("false = False\n")
196182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
197e2ba87396cde5b57259405722910c560f7d237c6Jack Jansenif __name__ == "__main__":
198182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    main()
199