X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fsize.py;h=5ead8b23800d05e12adf5c09a26223d8668cd2e7;hb=57934caa3fb207320c33312646d8e98290950f51;hp=907f2b52039ff23b6aefbbdb39c632342491a9de;hpb=7691c6e8351e083e9250c9dfb5e4a2665c94431d;p=free-sw%2Fxcb%2Fproto diff --git a/src/size.py b/src/size.py index 907f2b5..5ead8b2 100755 --- a/src/size.py +++ b/src/size.py @@ -5,35 +5,30 @@ 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 = { - 'BYTE': 1, - 'BOOL': 1, - 'CARD8': 1, - 'CARD16': 2, - 'CARD32': 4, - 'INT8': 1, - 'INT16': 2, - 'INT32': 4, - 'float': 4, - 'double': 8, + 'BYTE': 1, 'BOOL': 1, + 'CARD8': 1, 'CARD16': 2, 'CARD32': 4, + 'INT8': 1, 'INT16': 2, 'INT32': 4, + 'char': 1, 'void': 1, + 'float': 4, 'double': 8, + 'XID': 4, } - header = None + header = [] def setTypeSize(self, name, size): + assert not self.types.has_key(name), "size of " + name + " declared as both " + str(size) + " and " + str(self.types[name]) self.types[name] = size - self.types[self.header + ':' + 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: @@ -41,6 +36,10 @@ class AnnotateSize(XMLFilterBase): elif self.union is not None: self.totalsize = max(self.totalsize, size) attrs = AttributesUnion(attrs, bytes=str(size)) + elif name == 'pad': + assert self.union is None + if self.struct is not None: + self.totalsize += int(attrs['bytes']) elif name == 'xidtype': self.setTypeSize(attrs['name'], 4) elif name == 'typedef': @@ -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 or name == 'xcb': + 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 or name == 'xcb': + 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)