projects
/
free-sw
/
xcb
/
proto
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Release xcb-proto 1.5
[free-sw/xcb/proto]
/
src
/
size.py
diff --git
a/src/size.py
b/src/size.py
index
907f2b5
..
5ead8b2
100755
(executable)
--- a/
src/size.py
+++ b/
src/size.py
@@
-5,35
+5,30
@@
from xml.sax.xmlreader import AttributesImpl
from xml.sax import make_parser
import sys
from xml.sax import make_parser
import sys
-class AttributesUnion(AttributesImpl):
- def __init__(self, base, **values):
- baseitems = dict(base)
- baseitems.update(values)
- AttributesImpl.__init__(self, baseitems)
+def AttributesUnion(base, **values):
+ baseitems = dict(base)
+ baseitems.update(values)
+ return AttributesImpl(baseitems)
class AnnotateSize(XMLFilterBase):
types = {
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):
def setTypeSize(self, name, size):
+ assert not self.types.has_key(name), "size of " + name + " declared as both " + str(size) + " and " + str(self.types[name])
self.types[name] = size
self.types[name] = size
- self.types[self.header + ':' + name] = size
struct = None
union = None
def startElement(self, name, attrs):
if name == 'xcb':
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:
elif name == 'field':
size = self.types.get(attrs['type'], 0)
if self.struct is not None:
@@
-41,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 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':
elif name == 'xidtype':
self.setTypeSize(attrs['name'], 4)
elif name == 'typedef':
@@
-49,17
+48,29
@@
class AnnotateSize(XMLFilterBase):
assert self.struct is None and self.union is None
setattr(self, name, attrs['name'])
self.totalsize = 0
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):
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
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())
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)