3 from xml.sax.saxutils import XMLFilterBase, XMLGenerator
4 from xml.sax.xmlreader import AttributesImpl
5 from xml.sax import make_parser
8 def AttributesUnion(base, **values):
10 baseitems.update(values)
11 return AttributesImpl(baseitems)
13 class AnnotateType(XMLFilterBase):
15 map = dict([(name, [name]) for name in [
17 'CARD8', 'CARD16', 'CARD32',
18 'INT8', 'INT16', 'INT32',
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):
32 names = self.map.get(name, [])
37 def startElement(self, name, attrs):
40 self.startScope(attrs['header'])
41 elif name in ['struct', 'union', 'xidtype', 'enum', 'event', 'eventcopy', 'error', 'errorcopy']:
42 self.declareType(attrs['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'):
54 for attname in attnames:
55 newattrs[attname] = self.getQualifiedType(attrs[attname])
57 attrs = AttributesUnion(attrs, **newattrs)
58 XMLFilterBase.startElement(self, name, attrs)
60 def endElement(self, name):
61 XMLFilterBase.endElement(self, name)
65 annotator = AnnotateType(make_parser())
66 annotator.setContentHandler(XMLGenerator())
68 annotator.parse(sys.argv[1])
70 annotator.parse(sys.stdin)
72 for name,names in annotator.map.iteritems():
74 print "<!-- warning:", name, "has the following definitions:", names, "-->"