1 # Scan an Apple header file, generating a Python file of generator calls.
5 from bgenlocations
import TOOLBOXDIR
, BGENDIR
6 sys
.path
.append(BGENDIR
)
7 from scantools
import Scanner_OSX
13 input = ["Files.h", "Aliases.h", "Finder.h"]
14 output
= SHORT
+ "gen.py"
15 defsoutput
= TOOLBOXDIR
+ LONG
+ ".py"
16 scanner
= MyScanner(input, output
, defsoutput
)
19 scanner
.gentypetest(SHORT
+"typetest.py")
20 print "=== Testing definitions output code ==="
21 execfile(defsoutput
, {}, {})
22 print "=== Done scanning and generating, now importing the generated code... ==="
23 exec "import " + SHORT
+ "support"
24 print "=== Done. It's up to you to compile it now! ==="
26 class MyScanner(Scanner_OSX
):
28 def destination(self
, type, name
, arglist
):
29 classname
= "Function"
30 listname
= "functions"
35 if t
== "AliasHandle" and m
== "InMode":
36 classname
= "Arg2MethodGenerator"
37 listname
= "alias_methods"
38 return classname
, listname
41 if t
== "AliasHandle" and m
== "InMode":
43 listname
= "alias_methods"
44 if t
== "FSSpec_ptr" and m
== "InMode":
46 listname
= "fsspec_methods"
47 if t
== "FSRef_ptr" and m
== "InMode":
49 listname
= "fsref_methods"
50 return classname
, listname
52 def makeblacklistnames(self
):
54 # Constants with incompatible definitions
55 "kioACAccessOwnerMask",
60 "FSRefMakePath", # Do this manually
61 # "ResolveAlias", # Do this manually
62 # "ResolveAliasWithMountFlags", # Do this manually
63 # "FollowFinderAlias", # Do this manually
65 "FSRead", # Couldn't be bothered
68 "FSWriteFork", # ditto
108 def makegreylist(self
):
110 ('#if TARGET_API_MAC_OSX', [
116 def makeblacklisttypes(self
):
118 "CInfoPBPtr", # Old stuff
119 "CMovePBPtr", # Old stuff
120 "ParmBlkPtr", # Old stuff
121 "HParmBlkPtr", # Old stuff
122 "DTPBPtr", # Old stuff
123 "FCBPBPtr", # Old stuff
124 "QHdrPtr", # Old stuff
125 "CSParamPtr", # Old stuff
126 "FSCatalogBulkParam", # old stuff
127 "FSForkCBInfoParam", # old stuff
128 "FSForkIOParam", # old stuff
129 "FSRefParam", # old stuff
130 "FSVolumeInfoParam", # old stuff
131 "WDPBPtr", # old stuff
132 "XCInfoPBPtr", # old stuff
133 "XVolumeParamPtr", # old stuff
136 "CatPositionRec", # State variable, not too difficult
137 "FSIterator", # Should become an object
138 "FSForkInfo", # Lots of fields, difficult struct
139 "FSSearchParams", # Also catsearch stuff
140 "FSVolumeInfo", # big struct
141 "FSVolumeInfo_ptr", # big struct
143 "IOCompletionProcPtr", # proc pointer
144 "IOCompletionUPP", # Proc pointer
145 "AliasFilterProcPtr",
150 def makerepairinstructions(self
):
152 # Various ways to give pathnames
153 ([('char_ptr', '*', 'InMode')],
154 [('stringptr', '*', 'InMode')]
157 # Unicode filenames passed as length, buffer
158 ([('UniCharCount', '*', 'InMode'),
159 ('UniChar_ptr', '*', 'InMode')],
160 [('UnicodeReverseInBuffer', '*', 'InMode')]
163 ([('Str63', 'theString', 'InMode')],
164 [('Str63', 'theString', 'OutMode')]),
166 # Yet another way to give a pathname:-)
167 ([('short', 'fullPathLength', 'InMode'),
168 ('void_ptr', 'fullPath', 'InMode')],
169 [('FullPathName', 'fullPath', 'InMode')]),
171 # Various ResolveAliasFileXXXX functions
172 ([('FSSpec', 'theSpec', 'OutMode')],
173 [('FSSpec_ptr', 'theSpec', 'InOutMode')]),
175 ([('FSRef', 'theRef', 'OutMode')],
176 [('FSRef_ptr', 'theRef', 'InOutMode')]),
178 # The optional FSSpec to all ResolveAlias and NewAlias methods
179 ([('FSSpec_ptr', 'fromFile', 'InMode')],
180 [('OptFSSpecPtr', 'fromFile', 'InMode')]),
182 ([('FSRef_ptr', 'fromFile', 'InMode')],
183 [('OptFSRefPtr', 'fromFile', 'InMode')]),
185 ## # FSCatalogInfo input handling
186 ## ([('FSCatalogInfoBitmap', 'whichInfo', 'InMode'),
187 ## ('FSCatalogInfo_ptr', 'catalogInfo', 'InMode')],
188 ## [('FSCatalogInfoAndBitmap_in', 'catalogInfo', 'InMode')]),
190 ## # FSCatalogInfo output handling
191 ## ([('FSCatalogInfoBitmap', 'whichInfo', 'InMode'),
192 ## ('FSCatalogInfo', 'catalogInfo', 'OutMode')],
193 ## [('FSCatalogInfoAndBitmap_out', 'catalogInfo', 'InOutMode')]),
199 def writeinitialdefs(self
):
200 self
.defsfile
.write("def FOUR_CHAR_CODE(x): return x\n")
201 self
.defsfile
.write("true = True\n")
202 self
.defsfile
.write("false = False\n")
204 if __name__
== "__main__":