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 AnnotateSize(XMLFilterBase):
16 'CARD8': 1, 'CARD16': 2, 'CARD32': 4,
17 'INT8': 1, 'INT16': 2, 'INT32': 4,
19 'float': 4, 'double': 8,
23 def setTypeSize(self, name, size):
24 assert not self.types.has_key(name)
25 self.types[name] = size
29 def startElement(self, name, attrs):
31 self.header.insert(0, attrs['header'])
33 size = self.types.get(attrs['type'], 0)
34 if self.struct is not None:
35 self.totalsize += size
36 elif self.union is not None:
37 self.totalsize = max(self.totalsize, size)
38 attrs = AttributesUnion(attrs, bytes=str(size))
40 assert self.union is None
41 if self.struct is not None:
42 self.totalsize += int(attrs['bytes'])
43 elif name == 'xidtype':
44 self.setTypeSize(attrs['name'], 4)
45 elif name == 'typedef':
46 self.setTypeSize(attrs['newname'], self.types[attrs['oldname']])
47 elif name == 'struct' or name == 'union':
48 assert self.struct is None and self.union is None
49 setattr(self, name, attrs['name'])
52 if len(self.header) == 1 or name == 'xcb':
53 XMLFilterBase.startElement(self, name, attrs)
55 def characters(self, content):
56 if len(self.header) == 1:
57 XMLFilterBase.characters(self, content)
59 def endElement(self, name):
60 if len(self.header) == 1 or name == 'xcb':
61 XMLFilterBase.endElement(self, name)
65 elif name == 'struct' or name == 'union':
66 assert getattr(self, name) is not None
67 self.setTypeSize(getattr(self, name), self.totalsize)
68 setattr(self, name, None)
71 annotator = AnnotateSize(make_parser())
72 annotator.setContentHandler(XMLGenerator())
74 annotator.parse(sys.argv[1])
76 annotator.parse(sys.stdin)