|
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() |