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
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):
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':
--- /dev/null
+#!/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 "<!-- warning:", name, "has the following definitions:", names, "-->"