1# Scan an Apple header file, generating a Python file of generator calls. 2 3import sys 4from bgenlocations import TOOLBOXDIR, BGENDIR 5sys.path.append(BGENDIR) 6from scantools import Scanner_OSX 7 8LONG = "Files" 9SHORT = "file" 10 11def main(): 12 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! ===" 24 25class MyScanner(Scanner_OSX): 26 27 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 50 51 def makeblacklistnames(self): 52 return [ 53 # Constants with incompatible definitions 54 "kioACAccessOwnerMask", 55 "kFSCatInfoReserved", 56 "kFSIterateReserved", 57 "kSystemFolderType", 58 59 "FSRefMakePath", # Do this manually 60# "ResolveAlias", # Do this manually 61# "ResolveAliasWithMountFlags", # Do this manually 62# "FollowFinderAlias", # Do this manually 63 64 "FSRead", # Couldn't be bothered 65 "FSWrite", # ditto 66 "FSReadFork", # ditto 67 "FSWriteFork", # ditto 68 69 # 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", 104 105 ] 106 107 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 197if __name__ == "__main__": 198 main() 199