type.py qualifies all type names with the header in which they are defined.
authorJamey Sharp <jamey@minilop.net>
Wed, 14 Jun 2006 21:18:49 +0000 (14:18 -0700)
committerJamey Sharp <jamey@minilop.net>
Wed, 14 Jun 2006 21:18:49 +0000 (14:18 -0700)
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

src/size.py
src/type.py [new file with mode: 0755]

index 07e2f27..885c1ae 100755 (executable)
@@ -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 (executable)
index 0000000..c2f3cdf
--- /dev/null
@@ -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 "<!-- warning:", name, "has the following definitions:", names, "-->"