1 # -*- Mode: Python; py-indent-offset: 4 -*-
4 from definitions import BoxedDef, EnumDef, FlagsDef, FunctionDef, \
5 InterfaceDef, MethodDef, ObjectDef, MiniObjectDef, PointerDef, \
8 class IncludeParser(scmexpr.Parser):
9 """A simple parser that follows include statements automatically"""
10 def include(self, filename):
11 if not os.path.isabs(filename):
12 filename = os.path.join(os.path.dirname(self.filename), filename)
14 # set self.filename to the include name, to handle recursive includes
15 oldfile = self.filename
16 self.filename = filename
18 self.filename = oldfile
20 class DefsParser(IncludeParser):
21 def __init__(self, arg, defines={}):
22 IncludeParser.__init__(self, arg)
26 self.enums = [] # enums and flags
27 self.boxes = [] # boxed types
28 self.pointers = [] # pointer types
29 self.functions = [] # functions and methods
30 self.virtuals = [] # virtual methods
31 self.c_name = {} # hash of c names of functions
32 self.methods = {} # hash of methods of particular objects
33 self.defines = defines # -Dfoo=bar options, as dictionary
35 def define_object(self, *args):
36 odef = apply(ObjectDef, args)
37 self.objects.append(odef)
38 self.c_name[odef.c_name] = odef
39 # TODO: define_mini_object
40 def define_miniobject(self, *args):
41 odef = apply(MiniObjectDef, args)
42 self.miniobjects.append(odef)
43 self.c_name[odef.c_name] = odef
44 def define_interface(self, *args):
45 idef = apply(InterfaceDef, args)
46 self.interfaces.append(idef)
47 self.c_name[idef.c_name] = idef
48 def define_enum(self, *args):
49 edef = apply(EnumDef, args)
50 self.enums.append(edef)
51 self.c_name[edef.c_name] = edef
52 def define_flags(self, *args):
53 fdef = apply(FlagsDef, args)
54 self.enums.append(fdef)
55 self.c_name[fdef.c_name] = fdef
56 def define_boxed(self, *args):
57 bdef = apply(BoxedDef, args)
58 self.boxes.append(bdef)
59 self.c_name[bdef.c_name] = bdef
60 def define_pointer(self, *args):
61 pdef = apply(PointerDef, args)
62 self.pointers.append(pdef)
63 self.c_name[pdef.c_name] = pdef
64 def define_function(self, *args):
65 fdef = apply(FunctionDef, args)
66 self.functions.append(fdef)
67 self.c_name[fdef.c_name] = fdef
68 def define_method(self, *args):
69 mdef = apply(MethodDef, args)
70 self.functions.append(mdef)
71 self.c_name[mdef.c_name] = mdef
72 def define_virtual(self, *args):
73 vdef = apply(VirtualDef, args)
74 self.virtuals.append(vdef)
75 def merge(self, old, parmerge):
76 for obj in self.objects:
77 if old.c_name.has_key(obj.c_name):
78 obj.merge(old.c_name[obj.c_name])
79 for f in self.functions:
80 if old.c_name.has_key(f.c_name):
81 f.merge(old.c_name[f.c_name], parmerge)
83 def printMissing(self, old):
84 for obj in self.objects:
85 if not old.c_name.has_key(obj.c_name):
87 for f in self.functions:
88 if not old.c_name.has_key(f.c_name):
91 def write_defs(self, fp=sys.stdout):
92 for obj in self.objects:
94 # TODO: Add miniobject
95 for obj in self.miniobjects:
97 for enum in self.enums:
99 for boxed in self.boxes:
101 for pointer in self.pointers:
102 pointer.write_defs(fp)
103 for func in self.functions:
106 def find_object(self, c_name):
107 for obj in self.objects:
108 if obj.c_name == c_name:
111 raise ValueError, 'object not found'
113 def find_constructor(self, obj, overrides):
114 for func in self.functions:
115 if isinstance(func, FunctionDef) and \
116 func.is_constructor_of == obj.c_name and \
117 not overrides.is_ignored(func.c_name):
120 def find_methods(self, obj):
122 return filter(lambda func, on=objname: isinstance(func, MethodDef) and
123 func.of_object == on, self.functions)
125 def find_virtuals(self, obj):
127 retval = filter(lambda func, on=objname: isinstance(func, VirtualDef) and
128 func.of_object == on, self.virtuals)
131 def find_functions(self):
132 return filter(lambda func: isinstance(func, FunctionDef) and
133 not func.is_constructor_of, self.functions)
135 def ifdef(self, *args):
136 if args[0] in self.defines:
140 def ifndef(self, *args):
141 if args[0] not in self.defines: