blob: 4b70823745660a19a59b9a41987e8ed268722047 [file] [log] [blame]
Jack Jansene2ba8732002-11-22 14:58:35 +00001# Scan an Apple header file, generating a Python file of generator calls.
2
3import sys
Jack Jansene2ba8732002-11-22 14:58:35 +00004from bgenlocations import TOOLBOXDIR, BGENDIR
5sys.path.append(BGENDIR)
6from scantools import Scanner_OSX
7
8LONG = "Files"
9SHORT = "file"
Jack Jansene2ba8732002-11-22 14:58:35 +000010
11def main():
Tim Peters182b5ac2004-07-18 06:16:08 +000012 input = ["Files.h", "Aliases.h", "Finder.h"]
13 output = SHORT + "gen.py"
14 defsoutput = TOOLBOXDIR + LONG + ".py"
15 scanner = MyScanner(input, output, defsoutput)
16 scanner.scan()
17 scanner.close()
18 scanner.gentypetest(SHORT+"typetest.py")
19 print "=== Testing definitions output code ==="
20 execfile(defsoutput, {}, {})
21 print "=== Done scanning and generating, now importing the generated code... ==="
22 exec "import " + SHORT + "support"
23 print "=== Done. It's up to you to compile it now! ==="
Jack Jansene2ba8732002-11-22 14:58:35 +000024
25class MyScanner(Scanner_OSX):
26
Tim Peters182b5ac2004-07-18 06:16:08 +000027 def destination(self, type, name, arglist):
28 classname = "Function"
29 listname = "functions"
30 if arglist:
31 # Funny special case
32 if len(arglist) > 2:
33 t, n, m = arglist[1]
34 if t == "AliasHandle" and m == "InMode":
35 classname = "Arg2MethodGenerator"
36 listname = "alias_methods"
37 return classname, listname
38 # Normal cases
39 t, n, m = arglist[0]
40 if t == "AliasHandle" and m == "InMode":
41 classname = "Method"
42 listname = "alias_methods"
43 if t == "FSSpec_ptr" and m == "InMode":
44 classname = "Method"
45 listname = "fsspec_methods"
46 if t == "FSRef_ptr" and m == "InMode":
47 classname = "Method"
48 listname = "fsref_methods"
49 return classname, listname
Jack Jansene2ba8732002-11-22 14:58:35 +000050
Tim Peters182b5ac2004-07-18 06:16:08 +000051 def makeblacklistnames(self):
52 return [
53 # Constants with incompatible definitions
54 "kioACAccessOwnerMask",
55 "kFSCatInfoReserved",
56 "kFSIterateReserved",
57 "kSystemFolderType",
Jack Jansene2ba8732002-11-22 14:58:35 +000058
Tim Peters182b5ac2004-07-18 06:16:08 +000059 "FSRefMakePath", # Do this manually
60# "ResolveAlias", # Do this manually
61# "ResolveAliasWithMountFlags", # Do this manually
62# "FollowFinderAlias", # Do this manually
Jack Jansene2ba8732002-11-22 14:58:35 +000063
Tim Peters182b5ac2004-07-18 06:16:08 +000064 "FSRead", # Couldn't be bothered
65 "FSWrite", # ditto
66 "FSReadFork", # ditto
67 "FSWriteFork", # ditto
Jack Jansene2ba8732002-11-22 14:58:35 +000068
Tim Peters182b5ac2004-07-18 06:16:08 +000069 # Old routines:
70 "GetWDInfo",
71 "OpenWD",
72 "CloseWD",
73 "FInitQueue",
74 "rstflock",
75 "setflock",
76 "setfinfo",
77 "fsrename",
78 "fsdelete",
79 "create",
80 "flushvol",
81 "eject",
82 "umountvol",
83 "setvol",
84 "getvol",
85 "getfinfo",
86 "getvinfo",
87 "fsopen",
88 "RstFLock",
89 "SetFLock",
90 "SetFInfo",
91 "Rename",
92 "OpenRF",
93 "FSDelete",
94 "Create",
95 "GetVol",
96 "GetFInfo",
97 "GetVInfo",
98 "FSOpen",
99 "Eject",
100 "SetVol",
101 "openrf",
102 "unmountvol",
103 "OpenDF",
Jack Jansen543c9252002-12-18 23:17:26 +0000104
Tim Peters182b5ac2004-07-18 06:16:08 +0000105 ]
Jack Jansen543c9252002-12-18 23:17:26 +0000106
Tim Peters182b5ac2004-07-18 06:16:08 +0000107 def makeblacklisttypes(self):
108 return [
109 "CInfoPBPtr", # Old stuff
110 "CMovePBPtr", # Old stuff
111 "ParmBlkPtr", # Old stuff
112 "HParmBlkPtr", # Old stuff
113 "DTPBPtr", # Old stuff
114 "FCBPBPtr", # Old stuff
115 "QHdrPtr", # Old stuff
116 "CSParamPtr", # Old stuff
117 "FSCatalogBulkParam", # old stuff
118 "FSForkCBInfoParam", # old stuff
119 "FSForkIOParam", # old stuff
120 "FSRefParam", # old stuff
121 "FSVolumeInfoParam", # old stuff
122 "WDPBPtr", # old stuff
123 "XCInfoPBPtr", # old stuff
124 "XVolumeParamPtr", # old stuff
125
126
127 "CatPositionRec", # State variable, not too difficult
128 "FSIterator", # Should become an object
129 "FSForkInfo", # Lots of fields, difficult struct
130 "FSSearchParams", # Also catsearch stuff
131 "FSVolumeInfo", # big struct
132 "FSVolumeInfo_ptr", # big struct
133
134 "IOCompletionProcPtr", # proc pointer
135 "IOCompletionUPP", # Proc pointer
136 "AliasFilterProcPtr",
137 "AliasFilterUPP",
138 "FNSubscriptionUPP",
139
140 "FNSubscriptionRef", # Lazy, for now.
141 ]
142
143 def makerepairinstructions(self):
144 return [
145 # Various ways to give pathnames
146 ([('char_ptr', '*', 'InMode')],
147 [('stringptr', '*', 'InMode')]
148 ),
149
150 # Unicode filenames passed as length, buffer
151 ([('UniCharCount', '*', 'InMode'),
152 ('UniChar_ptr', '*', 'InMode')],
153 [('UnicodeReverseInBuffer', '*', 'InMode')]
154 ),
155 # Wrong guess
156 ([('Str63', 'theString', 'InMode')],
157 [('Str63', 'theString', 'OutMode')]),
158
159 # Yet another way to give a pathname:-)
160 ([('short', 'fullPathLength', 'InMode'),
161 ('void_ptr', 'fullPath', 'InMode')],
162 [('FullPathName', 'fullPath', 'InMode')]),
163
164 # Various ResolveAliasFileXXXX functions
165 ([('FSSpec', 'theSpec', 'OutMode')],
166 [('FSSpec_ptr', 'theSpec', 'InOutMode')]),
167
168 ([('FSRef', 'theRef', 'OutMode')],
169 [('FSRef_ptr', 'theRef', 'InOutMode')]),
170
171 # The optional FSSpec to all ResolveAlias and NewAlias methods
172 ([('FSSpec_ptr', 'fromFile', 'InMode')],
173 [('OptFSSpecPtr', 'fromFile', 'InMode')]),
174
175 ([('FSRef_ptr', 'fromFile', 'InMode')],
176 [('OptFSRefPtr', 'fromFile', 'InMode')]),
177
178## # FSCatalogInfo input handling
179## ([('FSCatalogInfoBitmap', 'whichInfo', 'InMode'),
180## ('FSCatalogInfo_ptr', 'catalogInfo', 'InMode')],
181## [('FSCatalogInfoAndBitmap_in', 'catalogInfo', 'InMode')]),
182##
183## # FSCatalogInfo output handling
184## ([('FSCatalogInfoBitmap', 'whichInfo', 'InMode'),
185## ('FSCatalogInfo', 'catalogInfo', 'OutMode')],
186## [('FSCatalogInfoAndBitmap_out', 'catalogInfo', 'InOutMode')]),
187##
188
189 ]
190
191
192 def writeinitialdefs(self):
193 self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
194 self.defsfile.write("true = True\n")
195 self.defsfile.write("false = False\n")
196
Jack Jansene2ba8732002-11-22 14:58:35 +0000197if __name__ == "__main__":
Tim Peters182b5ac2004-07-18 06:16:08 +0000198 main()