117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# Scan an Apple header file, generating a Python file of generator calls.
217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
30c4d947eacfb360515a5ba58f1a6b96dddc6d265Jack Jansenimport sys
4aaebdd6a02dd4d650b14e2192e327336ecb62a98Jack Jansenfrom bgenlocations import TOOLBOXDIR, BGENDIR
50c4d947eacfb360515a5ba58f1a6b96dddc6d265Jack Jansensys.path.append(BGENDIR)
6ae8a68f40cd56aa952520260970ebd5b9d3fb95cJack Jansen
717448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumfrom scantools import Scanner
817448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
917448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van RossumLONG = "Dialogs"
1017448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van RossumSHORT = "dlg"
1117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van RossumOBJECT = "DialogPtr"
1217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
1317448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumdef main():
14182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    input = LONG + ".h"
15182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    output = SHORT + "gen.py"
16182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    defsoutput = TOOLBOXDIR + LONG + ".py"
17182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    scanner = MyScanner(input, output, defsoutput)
18182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    scanner.scan()
19182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    scanner.close()
20182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    print "=== Testing definitions output code ==="
21182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    execfile(defsoutput, {}, {})
22182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    print "=== Done scanning and generating, now importing the generated code... ==="
23182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    exec "import " + SHORT + "support"
24182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    print "=== Done.  It's up to you to compile it now! ==="
2517448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
2617448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumclass MyScanner(Scanner):
2717448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
28182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def destination(self, type, name, arglist):
29182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        classname = "Function"
30182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        listname = "functions"
31182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        if arglist:
32182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            t, n, m = arglist[0]
33182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            if t in ("DialogPtr", "DialogRef") and m == "InMode":
34182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                classname = "Method"
35182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                listname = "methods"
36182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return classname, listname
37182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
38182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def makeblacklistnames(self):
39182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return [
40182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'InitDialogs',
41182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'ErrorSound',
42182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # Dialogs are disposed when the object is deleted
43182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'CloseDialog',
44182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'DisposDialog',
45182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'DisposeDialog',
46182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'UpdtDialog',
47182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'CouldAlert',
48182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'FreeAlert',
49182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'CouldDialog',
50182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'FreeDialog',
51182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'GetStdFilterProc',
52182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'GetDialogParent',
53182b5aca27d376b08a2904bed42b751496f932f3Tim Peters##                      # Can't find these in the CW Pro 3 libraries
54182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'SetDialogMovableModal',
55182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'GetDialogControlNotificationProc',
56182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'SetGrafPortOfDialog', # Funny, and probably not useful
57182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # Can't find these:
58182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'CloseStandardSheet',
59182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'RunStandardAlert',
60182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ]
61182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
62182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def makeblacklisttypes(self):
63182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return [
64182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "AlertStdAlertParamPtr",        # Too much work, for now
65182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "AlertStdAlertParamRec",        # ditto
66182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "AlertStdAlertParamRec_ptr",    # ditto
67182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "AlertStdCFStringAlertParamPtr",        # ditto
68182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "AlertStdCFStringAlertParamRec",
69182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "AlertStdCFStringAlertParamRec_ptr",
70182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                "QTModelessCallbackProcPtr",
71182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ]
72182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
73182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def makerepairinstructions(self):
74182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return [
75182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([("Str255", "*", "InMode")],
76182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [("*", "*", "OutMode")]),
77182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
78182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([("void_ptr", "*", "InMode"), ("long", "*", "InMode")],
79182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [("InBuffer", "*", "*")]),
80182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
81182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([("void", "*", "OutMode"), ("long", "*", "InMode"),
82182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                                            ("long", "*", "OutMode")],
83182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [("VarVarOutBuffer", "*", "InOutMode")]),
84182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
85182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # GetDialogItem return handle is optional
86182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([("Handle", "item", "OutMode")],
87182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [("OptHandle", "item", "OutMode")]),
88182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
89182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # NewDialog ETC.
90182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([("void", "*", "OutMode")],
91182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [("NullStorage", "*", "InMode")]),
92182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
93182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([("DialogPtr", "*", "OutMode")],
94182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [("ExistingDialogPtr", "*", "*")]),
95182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([("DialogRef", "*", "OutMode")],
96182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [("ExistingDialogPtr", "*", "*")]),
97182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([("WindowPtr", "*", "OutMode")],
98182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [("ExistingWindowPtr", "*", "*")]),
99182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([("WindowPtr", "*", "ReturnMode")],
100182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [("ExistingWindowPtr", "*", "*")]),
101182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
102182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                # StdFilterProc
103182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ([('EventRecord', 'event', 'OutMode'),
104182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                  ('DialogItemIndex', 'itemHit', 'OutMode')],
105182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                 [('EventRecord', 'event', 'InOutMode'),
106182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                  ('DialogItemIndex', 'itemHit', 'InOutMode')])
107182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
108182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                ]
109182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
110182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def writeinitialdefs(self):
111182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
112a05ac607d720727bc0d3799b7bea7a81e02ea561Jack Jansen
113a05ac607d720727bc0d3799b7bea7a81e02ea561Jack Jansen
11417448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumif __name__ == "__main__":
115182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    main()
116