16259af9bbbb0968abce4b91b966139fb7b3d386eJack Jansen# Scan an Apple header file, generating a Python file of generator calls.
26259af9bbbb0968abce4b91b966139fb7b3d386eJack Jansen
30c4d947eacfb360515a5ba58f1a6b96dddc6d265Jack Jansenimport sys
4aaebdd6a02dd4d650b14e2192e327336ecb62a98Jack Jansenfrom bgenlocations import TOOLBOXDIR, BGENDIR
50c4d947eacfb360515a5ba58f1a6b96dddc6d265Jack Jansensys.path.append(BGENDIR)
66259af9bbbb0968abce4b91b966139fb7b3d386eJack Jansenfrom scantools import Scanner
76259af9bbbb0968abce4b91b966139fb7b3d386eJack Jansen
86259af9bbbb0968abce4b91b966139fb7b3d386eJack JansenLONG = "Fonts"
921f96872f20080d5f07a72ea4141fac137ac9b15Jack JansenSHORT = "fm"
106259af9bbbb0968abce4b91b966139fb7b3d386eJack Jansen
116259af9bbbb0968abce4b91b966139fb7b3d386eJack Jansendef main():
12182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    input = "Fonts.h"
13182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    output = SHORT + "gen.py"
14182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    defsoutput = TOOLBOXDIR + LONG + ".py"
15182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    scanner = MyScanner(input, output, defsoutput)
16182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    scanner.scan()
17182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    scanner.close()
18182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    print "=== Testing definitions output code ==="
19182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    execfile(defsoutput, {}, {})
20182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    print "=== Done scanning and generating, now importing the generated code... ==="
21182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    exec "import " + SHORT + "support"
22182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    print "=== Done.  It's up to you to compile it now! ==="
236259af9bbbb0968abce4b91b966139fb7b3d386eJack Jansen
246259af9bbbb0968abce4b91b966139fb7b3d386eJack Jansenclass MyScanner(Scanner):
256259af9bbbb0968abce4b91b966139fb7b3d386eJack Jansen
26182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def destination(self, type, name, arglist):
27182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        classname = "Function"
28182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        listname = "functions"
29182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return classname, listname
306259af9bbbb0968abce4b91b966139fb7b3d386eJack Jansen
31182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def makeblacklistnames(self):
32182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return [
33182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "OutlineMetrics",       # Too complicated
34182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "AntiTextIsAntiAliased",        # XXXX Missing from library...
35182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "AntiTextGetEnabled",
36182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "AntiTextSetEnabled",
37182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "AntiTextGetApplicationAware",
38182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "AntiTextSetApplicationAware",
39182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # These are tricky: they're not Carbon dependent or anything, but they
40182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # exist only on 8.6 or later (both in Carbon and Classic).
41182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # Disabling them is the easiest path.
42182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'SetAntiAliasedTextEnabled',
43182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'IsAntiAliasedTextEnabled',
44182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # OS8-only
45182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'InitFonts',
46182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'SetFontLock',
47182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'FlushFonts',
48182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ]
496259af9bbbb0968abce4b91b966139fb7b3d386eJack Jansen
50182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def makeblacklisttypes(self):
51182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return [
52182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FMInput_ptr",  # Not needed for now
53182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FMOutPtr",             # Ditto
54182b5aca27d376b08a2904bed42b751496f932f3Tim Peters##                      "void_ptr",             # Don't know how to do this right now
55182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "FontInfo",             # Ditto
56182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ]
576259af9bbbb0968abce4b91b966139fb7b3d386eJack Jansen
58182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def makerepairinstructions(self):
59182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return [
60182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([('Str255', '*', 'InMode')], [('Str255', '*', 'OutMode')]),
61182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([('FMetricRecPtr', 'theMetrics', 'InMode')], [('FMetricRecPtr', 'theMetrics', 'OutMode')]),
62182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([('short', 'byteCount', 'InMode'), ('void_ptr', 'textAddr', 'InMode'),],
63182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [('TextBuffer', 'inText', 'InMode')]),
64182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ]
65182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
66182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def writeinitialdefs(self):
67182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
68182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.defsfile.write("kNilOptions = 0\n")
69b55e5f1b62534786cf7e5be9fe25473a78613b83Jack Jansen
706259af9bbbb0968abce4b91b966139fb7b3d386eJack Jansenif __name__ == "__main__":
71182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    main()
72