X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fsize.py;h=8376833de1387501142a3345d7f1f82d1690d7b9;hb=4f1ff61d7906b3a27bb261564cf681a97154df18;hp=2e1c40347e0aed29594eaffc213ae373e6906ca6;hpb=1855f0671e282c55c023c80ce6ef28c446190b43;p=free-sw%2Fxcb%2Fproto diff --git a/src/size.py b/src/size.py index 2e1c403..8376833 100755 --- a/src/size.py +++ b/src/size.py @@ -12,27 +12,23 @@ def AttributesUnion(base, **values): 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) 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: @@ -40,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': @@ -48,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)