1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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, []).insert(0, 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, "-->"
|