/Mac/Modules/file/filescan.py

http://unladen-swallow.googlecode.com/ · Python · 198 lines · 147 code · 27 blank · 24 comment · 11 complexity · 6cd5a7e94c5c46d9382759f0a7727910 MD5 · raw file

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