Home | History | Annotate | Download | only in file
      1 # Scan an Apple header file, generating a Python file of generator calls.
      2 
      3 import sys
      4 from bgenlocations import TOOLBOXDIR, BGENDIR
      5 sys.path.append(BGENDIR)
      6 from scantools import Scanner_OSX
      7 
      8 LONG = "Files"
      9 SHORT = "file"
     10 
     11 def 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 
     25 class 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 
    197 if __name__ == "__main__":
    198     main()
    199