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 = "MacTextEditor" 9SHORT = "mlte" 10OBJECTS = ("TXNObject", "TXNFontMenuObject") 11# ADD object typenames here 12 13def main(): 14 input = "MacTextEditor.h" 15 output = SHORT + "gen.py" 16 defsoutput = TOOLBOXDIR + LONG + ".py" 17 scanner = MyScanner(input, output, defsoutput) 18 scanner.scan() 19 scanner.gentypetest(SHORT+"typetest.py") 20 scanner.close() 21 print "=== Testing definitions output code ===" 22 execfile(defsoutput, {}, {}) 23 print "=== Done scanning and generating, now importing the generated code... ===" 24 exec "import " + SHORT + "support" 25 print "=== Done. It's up to you to compile it now! ===" 26 27class MyScanner(Scanner_OSX): 28 29 def destination(self, type, name, arglist): 30 classname = "Function" 31 listname = "functions" 32 if arglist: 33 t, n, m = arglist[0] 34 if t in OBJECTS and m == "InMode": 35 classname = "Method" 36 listname = t + "_methods" 37 return classname, listname 38 39 def writeinitialdefs(self): 40 self.defsfile.write(""" 41def FOUR_CHAR_CODE(x): return x 42false = 0 43true = 1 44kTXNClearThisControl = 0xFFFFFFFF 45kTXNClearTheseFontFeatures = 0x80000000 46kTXNDontCareTypeSize = 0xFFFFFFFF 47kTXNDecrementTypeSize = 0x80000000 48kTXNUseCurrentSelection = 0xFFFFFFFF 49kTXNStartOffset = 0 50kTXNEndOffset = 0x7FFFFFFF 51MovieFileType = FOUR_CHAR_CODE('moov') 52kTXNUseEncodingWordRulesMask = 0x80000000 53kTXNFontSizeAttributeSize = 4 54normal = 0 55""") 56 57 def makeblacklistnames(self): 58 return [ 59 "TXNGetFontDefaults", # Arg is too difficult 60 "TXNSetFontDefaults", # Arg is too difficult 61 "TXNInitTextension", # done manually 62 63 # Constants with funny definitions 64 "kTXNClearThisControl", 65 "kTXNClearTheseFontFeatures", 66 "kTXNDontCareTypeSize", 67 "kTXNDecrementTypeSize", 68 "kTXNUseCurrentSelection", 69 "kTXNStartOffset", 70 "kTXNEndOffset", 71 "kTXNQDFontNameAttributeSize", 72 "kTXNQDFontFamilyIDAttributeSize", 73 "kTXNQDFontSizeAttributeSize", 74 "kTXNQDFontStyleAttributeSize", 75 "kTXNQDFontColorAttributeSize", 76 "kTXNTextEncodingAttributeSize", 77 "kTXNUseEncodingWordRulesMask", 78 "kTXNFontSizeAttributeSize", 79 "status", 80 "justification", 81 'TXNTSMCheck', # OS8 82 ] 83 84 def makeblacklisttypes(self): 85 return [ 86 "TXNTab", # TBD 87 "TXNMargins", # TBD 88 "TXNControlData", #TBD 89 "TXNATSUIFeatures", #TBD 90 "TXNATSUIVariations", #TBD 91 "TXNAttributeData", #TBD 92 "TXNTypeAttributes", #TBD 93 "TXNMatchTextRecord", #TBD 94 "TXNBackground", #TBD 95 "TXNFindUPP", 96 "ATSUStyle", #TBD 97 "TXNBackground_ptr", #TBD 98 "TXNControlData_ptr", #TBD 99 "TXNControlTag_ptr", #TBD 100 "TXNLongRect", #TBD 101 "TXNLongRect_ptr", #TBD 102 "TXNTypeAttributes_ptr", #TBD 103 104 "TXNActionKeyMapperProcPtr", 105 "TXNActionKeyMapperUPP", 106 "TXNTextBoxOptionsData", 107 "TXNCountOptions", 108 "void_ptr", 109 ] 110 111 def makerepairinstructions(self): 112 return [ 113 # TXNNewObject has a lot of optional parameters 114 ([("FSSpec_ptr", "iFileSpec", "InMode")], 115 [("OptFSSpecPtr", "*", "*")]), 116 ([("Rect", "iFrame", "OutMode")], 117 [("OptRectPtr", "*", "InMode")]), 118 119 # In UH 332 some of the "const" are missing for input parameters passed 120 # by reference. We fix that up here. 121 ([("EventRecord", "iEvent", "OutMode")], 122 [("EventRecord_ptr", "*", "InMode")]), 123 ([("FSSpec", "iFileSpecification", "OutMode")], 124 [("FSSpec_ptr", "*", "InMode")]), 125 ([("TXNMacOSPreferredFontDescription", "iFontDefaults", "OutMode")], 126 [("TXNMacOSPreferredFontDescription_ptr", "*", "InMode")]), 127 128 # In buffers are passed as void * 129 ([("void", "*", "OutMode"), ("ByteCount", "*", "InMode")], 130 [("MlteInBuffer", "*", "InMode")]), 131 132 # The AdjustCursor region handle is optional 133 ([("RgnHandle", "ioCursorRgn", "InMode")], 134 [("OptRgnHandle", "*", "*")]), 135 136 # The GWorld for TXNDraw is optional 137 ([('GWorldPtr', 'iDrawPort', 'InMode')], 138 [('OptGWorldPtr', '*', '*')]), 139 ] 140 141if __name__ == "__main__": 142 main() 143