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
7
8LONG = "Lists"
9SHORT = "list"
10OBJECT = "ListHandle"
11
12def main():
13    input = LONG + ".h"
14    output = SHORT + "gen.py"
15    defsoutput = TOOLBOXDIR + LONG + ".py"
16    scanner = MyScanner(input, output, defsoutput)
17    scanner.scan()
18    scanner.close()
19    print "=== Testing definitions output code ==="
20    execfile(defsoutput, {}, {})
21    print "=== Done scanning and generating, now importing the generated code... ==="
22    exec "import " + SHORT + "support"
23    print "=== Done.  It's up to you to compile it now! ==="
24
25class MyScanner(Scanner):
26
27    def destination(self, type, name, arglist):
28        classname = "Function"
29        listname = "functions"
30        if arglist:
31            t, n, m = arglist[-1]
32            # This is non-functional today
33            if t in ('ListHandle', 'ListRef') and m == "InMode":
34                classname = "Method"
35                listname = "methods"
36        return classname, listname
37
38    def makeblacklistnames(self):
39        return [
40                "LDispose",             # Done by removing the object
41                "LSearch",              # We don't want to handle procs just yet
42                "CreateCustomList",  # done manually
43                "SetListDefinitionProc",
44
45                # These have funny argument/return values
46                "GetListViewBounds",
47                "GetListCellIndent",
48                "GetListCellSize",
49                "GetListVisibleCells",
50                "GetListClickLocation",
51                "GetListMouseLocation",
52                "GetListDataBounds",
53                "SetListLastClick",
54                ]
55
56    def makeblacklisttypes(self):
57        return [
58                "ListClickLoopUPP",  # Too difficult for now
59                "ListDefSpecPtr", # later
60                ]
61
62    def makerepairinstructions(self):
63        return [
64                ([('ListBounds_ptr', '*', 'InMode')],
65                 [('Rect_ptr', '*', 'InMode')]),
66
67                ([("Cell", "theCell", "OutMode")],
68                 [("Cell", "theCell", "InOutMode")]),
69
70                ([("void_ptr", "*", "InMode"), ("short", "*", "InMode")],
71                 [("InBufferShortsize", "*", "*")]),
72
73                ([("void", "*", "OutMode"), ("short", "*", "OutMode")],
74                 [("VarOutBufferShortsize", "*", "InOutMode")]),
75
76                # SetListCellIndent doesn't have const
77                ([("Point", "indent", "OutMode")],
78                 [("Point_ptr", "indent", "InMode")]),
79
80                ]
81
82    def writeinitialdefs(self):
83        self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
84
85
86if __name__ == "__main__":
87    main()
88