From: Jamey Sharp Date: Wed, 14 Jun 2006 21:18:49 +0000 (-0700) Subject: type.py qualifies all type names with the header in which they are defined. X-Git-Tag: 1.0_branch~165 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7aee7e35d3acdb6b68e27500f9d61cb15529f900;p=profile%2Fivi%2Fxcb-proto.git type.py qualifies all type names with the header in which they are defined. Update size.py to quit doing a bad job at the same task. Suggested usage is now: ./import.py extensions/composite.xml | ./type.py | ./size.py --- diff --git a/src/size.py b/src/size.py index 07e2f27..885c1ae 100755 --- a/src/size.py +++ b/src/size.py @@ -12,21 +12,17 @@ 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 = [] def setTypeSize(self, name, size): + assert not self.types.has_key(name) self.types[name] = size - self.types[self.header[0] + ':' + name] = size struct = None union = None @@ -49,7 +45,7 @@ class AnnotateSize(XMLFilterBase): setattr(self, name, attrs['name']) self.totalsize = 0 - if len(self.header) == 1: + if len(self.header) == 1 or name == 'xcb': XMLFilterBase.startElement(self, name, attrs) def characters(self, content): @@ -57,7 +53,7 @@ class AnnotateSize(XMLFilterBase): XMLFilterBase.characters(self, content) def endElement(self, name): - if len(self.header) == 1: + if len(self.header) == 1 or name == 'xcb': XMLFilterBase.endElement(self, name) if name == 'xcb': diff --git a/src/type.py b/src/type.py new file mode 100755 index 0000000..c2f3cdf --- /dev/null +++ b/src/type.py @@ -0,0 +1,74 @@ +#!/usr/bin/python + +from xml.sax.saxutils import XMLFilterBase, XMLGenerator +from xml.sax.xmlreader import AttributesImpl +from xml.sax import make_parser +import sys + +def AttributesUnion(base, **values): + baseitems = dict(base) + baseitems.update(values) + return AttributesImpl(baseitems) + +class AnnotateType(XMLFilterBase): + scopes = [] + map = dict([(name, [name]) for name in [ + 'BOOL', 'BYTE', + 'CARD8', 'CARD16', 'CARD32', + 'INT8', 'INT16', 'INT32', + 'char', 'void', + 'float', 'double', + 'XID', + ]]) + def startScope(self, name): + self.scopes.insert(0, name) + def declareType(self, name): + assert ':' not in name + qname = self.scopes[0] + ':' + name + self.map.setdefault(name, []).append(qname) + def getQualifiedType(self, name): + if ':' in name: + return name + names = self.map.get(name, []) + return names[0] + def endScope(self): + self.scopes.pop(0) + + def startElement(self, name, attrs): + attnames = [] + if name == 'xcb': + self.startScope(attrs['header']) + elif name in ['struct', 'union', 'xidtype', 'enum', 'event', 'eventcopy', 'error', 'errorcopy']: + self.declareType(attrs['name']) + attnames = ['name'] + if name.endswith('copy'): + attnames.append('ref') + elif name == 'typedef': + self.declareType(attrs['newname']) + attnames = ['oldname', 'newname'] + elif name == 'valueparam': + attnames = ['value-mask-type'] + elif attrs.has_key('type'): + attnames = ['type'] + newattrs = {} + for attname in attnames: + newattrs[attname] = self.getQualifiedType(attrs[attname]) + if newattrs: + attrs = AttributesUnion(attrs, **newattrs) + XMLFilterBase.startElement(self, name, attrs) + + def endElement(self, name): + XMLFilterBase.endElement(self, name) + if name == 'xcb': + self.endScope() + +annotator = AnnotateType(make_parser()) +annotator.setContentHandler(XMLGenerator()) +if len(sys.argv) > 1: + annotator.parse(sys.argv[1]) +else: + annotator.parse(sys.stdin) + +for name,names in annotator.map.iteritems(): + if len(names) != 1: + print ""