X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fsize.py;h=07e2f2797bbded127a9bf5fd0fcafd159fc17c3d;hb=b09b5306f2b67cb7a826be3702380bbdc045b9da;hp=907f2b52039ff23b6aefbbdb39c632342491a9de;hpb=7691c6e8351e083e9250c9dfb5e4a2665c94431d;p=free-sw%2Fxcb%2Fproto diff --git a/src/size.py b/src/size.py index 907f2b5..07e2f27 100755 --- a/src/size.py +++ b/src/size.py @@ -5,11 +5,10 @@ from xml.sax.xmlreader import AttributesImpl from xml.sax import make_parser import sys -class AttributesUnion(AttributesImpl): - def __init__(self, base, **values): - baseitems = dict(base) - baseitems.update(values) - AttributesImpl.__init__(self, baseitems) +def AttributesUnion(base, **values): + baseitems = dict(base) + baseitems.update(values) + return AttributesImpl(baseitems) class AnnotateSize(XMLFilterBase): types = { @@ -24,16 +23,16 @@ class AnnotateSize(XMLFilterBase): 'float': 4, 'double': 8, } - header = None + header = [] def setTypeSize(self, name, size): self.types[name] = size - self.types[self.header + ':' + name] = size + self.types[self.header[0] + ':' + name] = size struct = None union = None def startElement(self, name, attrs): if name == 'xcb': - self.header = attrs['header'] + self.header.insert(0, attrs['header']) elif name == 'field': size = self.types.get(attrs['type'], 0) if self.struct is not None: @@ -49,17 +48,29 @@ class AnnotateSize(XMLFilterBase): assert self.struct is None and self.union is None setattr(self, name, attrs['name']) self.totalsize = 0 - XMLFilterBase.startElement(self, name, attrs) + + if len(self.header) == 1: + XMLFilterBase.startElement(self, name, attrs) + + def characters(self, content): + if len(self.header) == 1: + XMLFilterBase.characters(self, content) def endElement(self, name): - if name == 'struct' or name == 'union': + if len(self.header) == 1: + XMLFilterBase.endElement(self, name) + + if name == 'xcb': + self.header.pop(0) + elif name == 'struct' or name == 'union': assert getattr(self, name) is not None self.setTypeSize(getattr(self, name), self.totalsize) setattr(self, name, None) del self.totalsize - XMLFilterBase.endElement(self, name) annotator = AnnotateSize(make_parser()) annotator.setContentHandler(XMLGenerator()) -for f in sys.argv[1:]: - annotator.parse(f) +if len(sys.argv) > 1: + annotator.parse(sys.argv[1]) +else: + annotator.parse(sys.stdin)