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 7 8 LONG = "Fonts" 9 SHORT = "fm" 10 11 def main(): 12 input = "Fonts.h" 13 output = SHORT + "gen.py" 14 defsoutput = TOOLBOXDIR + LONG + ".py" 15 scanner = MyScanner(input, output, defsoutput) 16 scanner.scan() 17 scanner.close() 18 print "=== Testing definitions output code ===" 19 execfile(defsoutput, {}, {}) 20 print "=== Done scanning and generating, now importing the generated code... ===" 21 exec "import " + SHORT + "support" 22 print "=== Done. It's up to you to compile it now! ===" 23 24 class MyScanner(Scanner): 25 26 def destination(self, type, name, arglist): 27 classname = "Function" 28 listname = "functions" 29 return classname, listname 30 31 def makeblacklistnames(self): 32 return [ 33 "OutlineMetrics", # Too complicated 34 "AntiTextIsAntiAliased", # XXXX Missing from library... 35 "AntiTextGetEnabled", 36 "AntiTextSetEnabled", 37 "AntiTextGetApplicationAware", 38 "AntiTextSetApplicationAware", 39 # These are tricky: they're not Carbon dependent or anything, but they 40 # exist only on 8.6 or later (both in Carbon and Classic). 41 # Disabling them is the easiest path. 42 'SetAntiAliasedTextEnabled', 43 'IsAntiAliasedTextEnabled', 44 # OS8-only 45 'InitFonts', 46 'SetFontLock', 47 'FlushFonts', 48 ] 49 50 def makeblacklisttypes(self): 51 return [ 52 "FMInput_ptr", # Not needed for now 53 "FMOutPtr", # Ditto 54 ## "void_ptr", # Don't know how to do this right now 55 "FontInfo", # Ditto 56 ] 57 58 def makerepairinstructions(self): 59 return [ 60 ([('Str255', '*', 'InMode')], [('Str255', '*', 'OutMode')]), 61 ([('FMetricRecPtr', 'theMetrics', 'InMode')], [('FMetricRecPtr', 'theMetrics', 'OutMode')]), 62 ([('short', 'byteCount', 'InMode'), ('void_ptr', 'textAddr', 'InMode'),], 63 [('TextBuffer', 'inText', 'InMode')]), 64 ] 65 66 def writeinitialdefs(self): 67 self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n") 68 self.defsfile.write("kNilOptions = 0\n") 69 70 if __name__ == "__main__": 71 main() 72