made changes to support new value-mask-pad field of valueparam structures
[free-sw/xcb/proto] / src / type.py
1 #!/usr/bin/python
2
3 from xml.sax.saxutils import XMLFilterBase, XMLGenerator
4 from xml.sax.xmlreader import AttributesImpl
5 from xml.sax import make_parser
6 import sys
7
8 def AttributesUnion(base, **values):
9         baseitems = dict(base)
10         baseitems.update(values)
11         return AttributesImpl(baseitems)
12
13 class AnnotateType(XMLFilterBase):
14         scopes = []
15         map = dict([(name, [name]) for name in [
16                         'BOOL', 'BYTE',
17                         'CARD8', 'CARD16', 'CARD32',
18                         'INT8', 'INT16', 'INT32',
19                         'char', 'void',
20                         'float', 'double',
21                         'XID',
22                 ]])
23         def startScope(self, name):
24                 self.scopes.insert(0, name)
25         def declareType(self, name):
26                 assert ':' not in name
27                 qname = self.scopes[0] + ':' + name
28                 self.map.setdefault(name, []).insert(0, qname)
29         def getQualifiedType(self, name):
30                 if ':' in name:
31                         return name
32                 names = self.map.get(name, [])
33                 return names[0]
34         def endScope(self):
35                 self.scopes.pop(0)
36
37         def startElement(self, name, attrs):
38                 attnames = []
39                 if name == 'xcb':
40                         self.startScope(attrs['header'])
41                 elif name in ['struct', 'union', 'xidtype', 'enum', 'event', 'eventcopy', 'error', 'errorcopy']:
42                         self.declareType(attrs['name'])
43                         attnames = ['name']
44                         if name.endswith('copy'):
45                                 attnames.append('ref')
46                 elif name == 'typedef':
47                         self.declareType(attrs['newname'])
48                         attnames = ['oldname', 'newname']
49                 elif name == 'valueparam':
50                         attnames = ['value-mask-type', 'value-mask-pad']
51                 elif attrs.has_key('type'):
52                         attnames = ['type']
53                 newattrs = {}
54                 for attname in attnames:
55                         newattrs[attname] = self.getQualifiedType(attrs[attname])
56                 if newattrs:
57                         attrs = AttributesUnion(attrs, **newattrs)
58                 XMLFilterBase.startElement(self, name, attrs)
59
60         def endElement(self, name):
61                 XMLFilterBase.endElement(self, name)
62                 if name == 'xcb':
63                         self.endScope()
64
65 annotator = AnnotateType(make_parser())
66 annotator.setContentHandler(XMLGenerator())
67 if len(sys.argv) > 1:
68         annotator.parse(sys.argv[1])
69 else:
70         annotator.parse(sys.stdin)
71
72 for name,names in annotator.map.iteritems():
73         if len(names) != 1:
74                 print "<!-- warning:", name, "has the following definitions:", names, "-->"