[Xcb-commit] xcbgen

Eamon Walsh ewalsh at kemper.freedesktop.org
Wed Jul 9 10:48:39 PDT 2008


 xcbgen/Makefile.am |    2 
 xcbgen/matcher.py  |    2 
 xcbgen/state.py    |    2 
 xcbgen/types.py    |  469 -----------------------------------------------------
 xcbgen/xtypes.py   |  469 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 472 insertions(+), 472 deletions(-)

New commits:
commit bf652a63fe0de259857ed174d7e921d645184634
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Wed Jul 9 13:41:10 2008 -0400

    Work around a Python bug involving the file name 'types.py'.

diff --git a/xcbgen/Makefile.am b/xcbgen/Makefile.am
index 44632fa..110a992 100644
--- a/xcbgen/Makefile.am
+++ b/xcbgen/Makefile.am
@@ -1,3 +1,3 @@
 pkgpythondir = $(pythondir)/xcbgen
 
-pkgpython_PYTHON = __init__.py error.py expr.py matcher.py state.py types.py
+pkgpython_PYTHON = __init__.py error.py expr.py matcher.py state.py xtypes.py
diff --git a/xcbgen/matcher.py b/xcbgen/matcher.py
index b2d9b8b..e7958fa 100644
--- a/xcbgen/matcher.py
+++ b/xcbgen/matcher.py
@@ -10,7 +10,7 @@ from os.path import join
 from xml.etree.cElementTree import parse
 
 import state
-from types import *
+from xtypes import *
 
 def import_(node, module, namespace):
     '''
diff --git a/xcbgen/state.py b/xcbgen/state.py
index 59b5608..51efc94 100644
--- a/xcbgen/state.py
+++ b/xcbgen/state.py
@@ -6,7 +6,7 @@ from xml.etree.cElementTree import parse
 
 import matcher
 from error import *
-from types import *
+from xtypes import *
 
 import __main__
 
diff --git a/xcbgen/types.py b/xcbgen/types.py
deleted file mode 100644
index d4b16e2..0000000
--- a/xcbgen/types.py
+++ /dev/null
@@ -1,469 +0,0 @@
-'''
-This module contains the classes which represent XCB data types.
-'''
-from expr import Field, Expression
-import __main__
-
-class Type(object):
-    '''
-    Abstract base class for all XCB data types.
-    Contains default fields, and some abstract methods.
-    '''
-    def __init__(self, name):
-        '''
-        Default structure initializer.  Sets up default fields.
-
-        Public fields:
-        name is a tuple of strings specifying the full type name.
-        size is the size of the datatype in bytes, or None if variable-sized.
-        nmemb is 1 for non-list types, None for variable-sized lists, otherwise number of elts.
-        booleans for identifying subclasses, because I can't figure out isinstance().
-        '''
-        self.name = name
-        self.size = None
-        self.nmemb = None
-        self.resolved = False
-
-        # Screw isinstance().
-        self.is_simple = False
-        self.is_list = False
-        self.is_expr = False
-        self.is_container = False
-        self.is_reply = False
-        self.is_union = False
-        self.is_pad = False
-
-    def resolve(self, module):
-        '''
-        Abstract method for resolving a type.
-        This should make sure any referenced types are already declared.
-        '''
-        raise Exception('abstract resolve method not overridden!')
-
-    def out(self, name):
-        '''
-        Abstract method for outputting code.
-        These are declared in the language-specific modules, and
-        there must be a dictionary containing them declared when this module is imported!
-        '''
-        raise Exception('abstract out method not overridden!')
-
-    def fixed_size(self):
-        '''
-        Abstract method for determining if the data type is fixed-size.
-        '''
-        raise Exception('abstract fixed_size method not overridden!')
-
-    def make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto):
-        '''
-        Default method for making a data type a member of a structure.
-        Extend this if the data type needs to add an additional length field or something.
-
-        module is the global module object.
-        complex_type is the structure object.
-        see Field for the meaning of the other parameters.
-        '''
-        new_field = Field(self, field_type, field_name, visible, wire, auto)
-
-        # We dump the _placeholder_byte if any fields are added.
-        for (idx, field) in enumerate(complex_type.fields):
-            if field == _placeholder_byte:
-                complex_type.fields[idx] = new_field
-                return
-
-        complex_type.fields.append(new_field)
-
-class SimpleType(Type):
-    '''
-    Derived class which represents a cardinal type like CARD32 or char.
-    Any type which is typedef'ed to cardinal will be one of these.
-
-    Public fields added:
-    none
-    '''
-    def __init__(self, name, size):
-        Type.__init__(self, name)
-        self.is_simple = True
-        self.size = size
-        self.nmemb = 1
-
-    def resolve(self, module):
-        self.resolved = True
-
-    def fixed_size(self):
-        return True
-
-    out = __main__.output['simple']
-
-
-# Cardinal datatype globals.  See module __init__ method.
-tcard8 = SimpleType(('uint8_t',), 1)
-tcard16 = SimpleType(('uint16_t',), 2)
-tcard32 = SimpleType(('uint32_t',), 4)
-tint8 =  SimpleType(('int8_t',), 1)
-tint16 = SimpleType(('int16_t',), 2)
-tint32 = SimpleType(('int32_t',), 4)
-tchar =  SimpleType(('char',), 1)
-tfloat = SimpleType(('float',), 4)
-tdouble = SimpleType(('double',), 8)
-
-
-class Enum(SimpleType):
-    '''
-    Derived class which represents an enum.  Fixed-size.
-
-    Public fields added:
-    values contains a list of (name, value) tuples.  value is empty, or a number.
-    '''
-    def __init__(self, name, elt):
-        SimpleType.__init__(self, name, 4)
-        self.values = []
-        for item in list(elt):
-            # First check if we're using a default value
-            if len(list(item)) == 0:
-                self.values.append((item.get('name'), ''))
-                continue
-
-            # An explicit value or bit was specified.
-            value = list(item)[0]
-            if value.tag == 'value':
-                self.values.append((item.get('name'), value.text))
-            elif value.tag == 'bit':
-                # XXX replace this with a simple number, please.
-                self.values.append((item.get('name'), '(1 << %s)' % value.text))
-
-    def resolve(self, module):
-        self.resolved = True
-
-    def fixed_size(self):
-        return True
-
-    out = __main__.output['enum']
-
-
-class ListType(Type):
-    '''
-    Derived class which represents a list of some other datatype.  Fixed- or variable-sized.
-
-    Public fields added:
-    member is the datatype of the list elements.
-    parent is the structure type containing the list.
-    expr is an Expression object containing the length information, for variable-sized lists.
-    '''
-    def __init__(self, elt, member, parent):
-        Type.__init__(self, member.name)
-        self.is_list = True
-        self.member = member
-        self.parent = parent
-
-        if elt.tag == 'list':
-            elts = list(elt)
-            self.expr = Expression(elts[0] if len(elts) else elt, self)
-        elif elt.tag == 'valueparam':
-            self.expr = Expression(elt, self)
-
-        self.size = member.size if member.fixed_size() else None
-        self.nmemb = self.expr.nmemb if self.expr.fixed_size() else None
-
-    def make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto):
-        if not self.fixed_size():
-            # We need a length field.
-            # Ask our Expression object for it's name, type, and whether it's on the wire.
-            lenfid = self.expr.lenfield_type
-            lenfield_name = self.expr.lenfield_name
-            lenwire = self.expr.lenwire
-            needlen = True
-
-            # See if the length field is already in the structure.
-            for field in self.parent.fields:
-                if field.field_name == lenfield_name:
-                    needlen = False
-
-            # It isn't, so we need to add it to the structure ourself.
-            if needlen:
-                type = module.get_type(lenfid)
-                lenfield_type = module.get_type_name(lenfid)
-                type.make_member_of(module, complex_type, lenfield_type, lenfield_name, True, lenwire, False)
-
-        # Add ourself to the structure by calling our original method.
-        Type.make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto)
-
-    def resolve(self, module):
-        if self.resolved:
-            return
-        self.member.resolve(module)
-
-        # Find my length field again.  We need the actual Field object in the expr.
-        # This is needed because we might have added it ourself above.
-        if not self.fixed_size():
-            for field in self.parent.fields:
-                if field.field_name == self.expr.lenfield_name and field.wire:
-                    self.expr.lenfield = field
-                    break
-            
-        self.resolved = True
-
-    def fixed_size(self):
-        return self.member.fixed_size() and self.expr.fixed_size()
-
-class ExprType(Type):
-    '''
-    Derived class which represents an exprfield.  Fixed size.
-
-    Public fields added:
-    expr is an Expression object containing the value of the field.
-    '''
-    def __init__(self, elt, member, parent):
-        Type.__init__(self, member.name)
-        self.is_expr = True
-        self.member = member
-        self.parent = parent
-
-        self.expr = Expression(list(elt)[0], self)
-
-        self.size = member.size
-        self.nmemb = 1
-
-    def resolve(self, module):
-        if self.resolved:
-            return
-        self.member.resolve(module)
-        self.resolved = True
-
-    def fixed_size(self):
-        return True
-
-class PadType(Type):
-    '''
-    Derived class which represents a padding field.
-    '''
-    def __init__(self, elt):
-        Type.__init__(self, tcard8.name)
-        self.is_pad = True
-        self.size = 1
-        self.nmemb = 1 if (elt == None) else int(elt.get('bytes'))
-
-    def resolve(self, module):
-        self.resolved = True
-
-    def fixed_size(self):
-        return True
-
-    
-class ComplexType(Type):
-    '''
-    Derived class which represents a structure.  Base type for all structure types.
-
-    Public fields added:
-    fields is an array of Field objects describing the structure fields.
-    '''
-    def __init__(self, name, elt):
-        Type.__init__(self, name)
-        self.is_container = True
-        self.elt = elt
-        self.fields = []
-        self.nmemb = 1
-        self.size = 0
-
-    def resolve(self, module):
-        if self.resolved:
-            return
-        pads = 0
-
-        # Resolve all of our field datatypes.
-        for child in list(self.elt):
-            if child.tag == 'pad':
-                field_name = 'pad' + str(pads)
-                fkey = 'CARD8'
-                type = PadType(child)
-                pads = pads + 1
-                visible = False
-            elif child.tag == 'field':
-                field_name = child.get('name')
-                fkey = child.get('type')
-                type = module.get_type(fkey)
-                visible = True
-            elif child.tag == 'exprfield':
-                field_name = child.get('name')
-                fkey = child.get('type')
-                type = ExprType(child, module.get_type(fkey), self)
-                visible = False
-            elif child.tag == 'list':
-                field_name = child.get('name')
-                fkey = child.get('type')
-                type = ListType(child, module.get_type(fkey), self)
-                visible = True
-            elif child.tag == 'valueparam':
-                field_name = child.get('value-list-name')
-                fkey = 'CARD32'
-                type = ListType(child, module.get_type(fkey), self)
-                visible = True
-            else:
-                # Hit this on Reply
-                continue 
-
-            # Get the full type name for the field
-            field_type = module.get_type_name(fkey)
-            # Add the field to ourself
-            type.make_member_of(module, self, field_type, field_name, visible, True, False)
-            # Recursively resolve the type (could be another structure, list)
-            type.resolve(module)
-
-        self.calc_size() # Figure out how big we are
-        self.resolved = True
-
-    def calc_size(self):
-        self.size = 0
-        for m in self.fields:
-            if not m.wire:
-                continue
-            if m.type.fixed_size():
-                self.size = self.size + (m.type.size * m.type.nmemb)
-            else:
-                self.size = None
-                break
-
-    def fixed_size(self):
-        for m in self.fields:
-            if not m.type.fixed_size():
-                return False
-        return True
-
-
-class Struct(ComplexType):
-    '''
-    Derived class representing a struct data type.
-    '''
-    out = __main__.output['struct']
-
-
-class Union(ComplexType):
-    '''
-    Derived class representing a union data type.
-    '''
-    def __init__(self, name, elt):
-        ComplexType.__init__(self, name, elt)
-        self.is_union = True
-
-    out = __main__.output['union']
-
-
-class Reply(ComplexType):
-    '''
-    Derived class representing a reply.  Only found as a field of Request.
-    '''
-    def __init__(self, name, elt):
-        ComplexType.__init__(self, name, elt)
-        self.is_reply = True
-
-    def resolve(self, module):
-        if self.resolved:
-            return
-        # Add the automatic protocol fields
-        self.fields.append(Field(tcard8, tcard8.name, 'response_type', False, True, True))
-        self.fields.append(_placeholder_byte)
-        self.fields.append(Field(tcard16, tcard16.name, 'sequence', False, True, True))
-        self.fields.append(Field(tcard32, tcard32.name, 'length', False, True, True))
-        ComplexType.resolve(self, module)
-        
-
-class Request(ComplexType):
-    '''
-    Derived class representing a request.
-
-    Public fields added:
-    reply contains the reply datatype or None for void requests.
-    opcode contains the request number.
-    '''
-    def __init__(self, name, elt):
-        ComplexType.__init__(self, name, elt)
-        self.reply = None
-        self.opcode = elt.get('opcode')
-
-        for child in list(elt):
-            if child.tag == 'reply':
-                self.reply = Reply(name, child)
-
-    def resolve(self, module):
-        if self.resolved:
-            return
-        # Add the automatic protocol fields
-        if module.namespace.is_ext:
-            self.fields.append(Field(tcard8, tcard8.name, 'major_opcode', False, True, True))
-            self.fields.append(Field(tcard8, tcard8.name, 'minor_opcode', False, True, True))
-            self.fields.append(Field(tcard16, tcard16.name, 'length', False, True, True))
-            ComplexType.resolve(self, module)
-        else:
-            self.fields.append(Field(tcard8, tcard8.name, 'major_opcode', False, True, True))
-            self.fields.append(_placeholder_byte)
-            self.fields.append(Field(tcard16, tcard16.name, 'length', False, True, True))
-            ComplexType.resolve(self, module)
-
-        if self.reply:
-            self.reply.resolve(module)
-
-    out = __main__.output['request']
-
-
-class Event(ComplexType):
-    '''
-    Derived class representing an event data type.
-
-    Public fields added:
-    opcodes is a dictionary of name -> opcode number, for eventcopies.
-    '''
-    def __init__(self, name, elt):
-        ComplexType.__init__(self, name, elt)
-        self.opcodes = {}
-
-        tmp = elt.get('no-sequence-number')
-        self.has_seq = (tmp == None or tmp.lower() == 'false' or tmp == '0')
-            
-    def add_opcode(self, opcode, name, main):
-        self.opcodes[name] = opcode
-        if main:
-            self.name = name
-
-    def resolve(self, module):
-        if self.resolved:
-            return
-
-        # Add the automatic protocol fields
-        self.fields.append(Field(tcard8, tcard8.name, 'response_type', False, True, True))
-        if self.has_seq:
-            self.fields.append(_placeholder_byte)
-            self.fields.append(Field(tcard16, tcard16.name, 'sequence', False, True, True))
-        ComplexType.resolve(self, module)
-
-    out = __main__.output['event']
-
-
-class Error(ComplexType):
-    '''
-    Derived class representing an error data type.
-
-    Public fields added:
-    opcodes is a dictionary of name -> opcode number, for errorcopies.
-    '''
-    def __init__(self, name, elt):
-        ComplexType.__init__(self, name, elt)
-        self.opcodes = {}
-
-    def add_opcode(self, opcode, name, main):
-        self.opcodes[name] = opcode
-        if main:
-            self.name = name
-
-    def resolve(self, module):
-        if self.resolved:
-            return
-
-        # Add the automatic protocol fields
-        self.fields.append(Field(tcard8, tcard8.name, 'response_type', False, True, True))
-        self.fields.append(Field(tcard8, tcard8.name, 'error_code', False, True, True))
-        self.fields.append(Field(tcard16, tcard16.name, 'sequence', False, True, True))
-        ComplexType.resolve(self, module)
-
-    out = __main__.output['error']
-
-_placeholder_byte = Field(PadType(None), tcard8.name, 'pad0', False, True, False)
diff --git a/xcbgen/xtypes.py b/xcbgen/xtypes.py
new file mode 100644
index 0000000..d4b16e2
--- /dev/null
+++ b/xcbgen/xtypes.py
@@ -0,0 +1,469 @@
+'''
+This module contains the classes which represent XCB data types.
+'''
+from expr import Field, Expression
+import __main__
+
+class Type(object):
+    '''
+    Abstract base class for all XCB data types.
+    Contains default fields, and some abstract methods.
+    '''
+    def __init__(self, name):
+        '''
+        Default structure initializer.  Sets up default fields.
+
+        Public fields:
+        name is a tuple of strings specifying the full type name.
+        size is the size of the datatype in bytes, or None if variable-sized.
+        nmemb is 1 for non-list types, None for variable-sized lists, otherwise number of elts.
+        booleans for identifying subclasses, because I can't figure out isinstance().
+        '''
+        self.name = name
+        self.size = None
+        self.nmemb = None
+        self.resolved = False
+
+        # Screw isinstance().
+        self.is_simple = False
+        self.is_list = False
+        self.is_expr = False
+        self.is_container = False
+        self.is_reply = False
+        self.is_union = False
+        self.is_pad = False
+
+    def resolve(self, module):
+        '''
+        Abstract method for resolving a type.
+        This should make sure any referenced types are already declared.
+        '''
+        raise Exception('abstract resolve method not overridden!')
+
+    def out(self, name):
+        '''
+        Abstract method for outputting code.
+        These are declared in the language-specific modules, and
+        there must be a dictionary containing them declared when this module is imported!
+        '''
+        raise Exception('abstract out method not overridden!')
+
+    def fixed_size(self):
+        '''
+        Abstract method for determining if the data type is fixed-size.
+        '''
+        raise Exception('abstract fixed_size method not overridden!')
+
+    def make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto):
+        '''
+        Default method for making a data type a member of a structure.
+        Extend this if the data type needs to add an additional length field or something.
+
+        module is the global module object.
+        complex_type is the structure object.
+        see Field for the meaning of the other parameters.
+        '''
+        new_field = Field(self, field_type, field_name, visible, wire, auto)
+
+        # We dump the _placeholder_byte if any fields are added.
+        for (idx, field) in enumerate(complex_type.fields):
+            if field == _placeholder_byte:
+                complex_type.fields[idx] = new_field
+                return
+
+        complex_type.fields.append(new_field)
+
+class SimpleType(Type):
+    '''
+    Derived class which represents a cardinal type like CARD32 or char.
+    Any type which is typedef'ed to cardinal will be one of these.
+
+    Public fields added:
+    none
+    '''
+    def __init__(self, name, size):
+        Type.__init__(self, name)
+        self.is_simple = True
+        self.size = size
+        self.nmemb = 1
+
+    def resolve(self, module):
+        self.resolved = True
+
+    def fixed_size(self):
+        return True
+
+    out = __main__.output['simple']
+
+
+# Cardinal datatype globals.  See module __init__ method.
+tcard8 = SimpleType(('uint8_t',), 1)
+tcard16 = SimpleType(('uint16_t',), 2)
+tcard32 = SimpleType(('uint32_t',), 4)
+tint8 =  SimpleType(('int8_t',), 1)
+tint16 = SimpleType(('int16_t',), 2)
+tint32 = SimpleType(('int32_t',), 4)
+tchar =  SimpleType(('char',), 1)
+tfloat = SimpleType(('float',), 4)
+tdouble = SimpleType(('double',), 8)
+
+
+class Enum(SimpleType):
+    '''
+    Derived class which represents an enum.  Fixed-size.
+
+    Public fields added:
+    values contains a list of (name, value) tuples.  value is empty, or a number.
+    '''
+    def __init__(self, name, elt):
+        SimpleType.__init__(self, name, 4)
+        self.values = []
+        for item in list(elt):
+            # First check if we're using a default value
+            if len(list(item)) == 0:
+                self.values.append((item.get('name'), ''))
+                continue
+
+            # An explicit value or bit was specified.
+            value = list(item)[0]
+            if value.tag == 'value':
+                self.values.append((item.get('name'), value.text))
+            elif value.tag == 'bit':
+                # XXX replace this with a simple number, please.
+                self.values.append((item.get('name'), '(1 << %s)' % value.text))
+
+    def resolve(self, module):
+        self.resolved = True
+
+    def fixed_size(self):
+        return True
+
+    out = __main__.output['enum']
+
+
+class ListType(Type):
+    '''
+    Derived class which represents a list of some other datatype.  Fixed- or variable-sized.
+
+    Public fields added:
+    member is the datatype of the list elements.
+    parent is the structure type containing the list.
+    expr is an Expression object containing the length information, for variable-sized lists.
+    '''
+    def __init__(self, elt, member, parent):
+        Type.__init__(self, member.name)
+        self.is_list = True
+        self.member = member
+        self.parent = parent
+
+        if elt.tag == 'list':
+            elts = list(elt)
+            self.expr = Expression(elts[0] if len(elts) else elt, self)
+        elif elt.tag == 'valueparam':
+            self.expr = Expression(elt, self)
+
+        self.size = member.size if member.fixed_size() else None
+        self.nmemb = self.expr.nmemb if self.expr.fixed_size() else None
+
+    def make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto):
+        if not self.fixed_size():
+            # We need a length field.
+            # Ask our Expression object for it's name, type, and whether it's on the wire.
+            lenfid = self.expr.lenfield_type
+            lenfield_name = self.expr.lenfield_name
+            lenwire = self.expr.lenwire
+            needlen = True
+
+            # See if the length field is already in the structure.
+            for field in self.parent.fields:
+                if field.field_name == lenfield_name:
+                    needlen = False
+
+            # It isn't, so we need to add it to the structure ourself.
+            if needlen:
+                type = module.get_type(lenfid)
+                lenfield_type = module.get_type_name(lenfid)
+                type.make_member_of(module, complex_type, lenfield_type, lenfield_name, True, lenwire, False)
+
+        # Add ourself to the structure by calling our original method.
+        Type.make_member_of(self, module, complex_type, field_type, field_name, visible, wire, auto)
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+        self.member.resolve(module)
+
+        # Find my length field again.  We need the actual Field object in the expr.
+        # This is needed because we might have added it ourself above.
+        if not self.fixed_size():
+            for field in self.parent.fields:
+                if field.field_name == self.expr.lenfield_name and field.wire:
+                    self.expr.lenfield = field
+                    break
+            
+        self.resolved = True
+
+    def fixed_size(self):
+        return self.member.fixed_size() and self.expr.fixed_size()
+
+class ExprType(Type):
+    '''
+    Derived class which represents an exprfield.  Fixed size.
+
+    Public fields added:
+    expr is an Expression object containing the value of the field.
+    '''
+    def __init__(self, elt, member, parent):
+        Type.__init__(self, member.name)
+        self.is_expr = True
+        self.member = member
+        self.parent = parent
+
+        self.expr = Expression(list(elt)[0], self)
+
+        self.size = member.size
+        self.nmemb = 1
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+        self.member.resolve(module)
+        self.resolved = True
+
+    def fixed_size(self):
+        return True
+
+class PadType(Type):
+    '''
+    Derived class which represents a padding field.
+    '''
+    def __init__(self, elt):
+        Type.__init__(self, tcard8.name)
+        self.is_pad = True
+        self.size = 1
+        self.nmemb = 1 if (elt == None) else int(elt.get('bytes'))
+
+    def resolve(self, module):
+        self.resolved = True
+
+    def fixed_size(self):
+        return True
+
+    
+class ComplexType(Type):
+    '''
+    Derived class which represents a structure.  Base type for all structure types.
+
+    Public fields added:
+    fields is an array of Field objects describing the structure fields.
+    '''
+    def __init__(self, name, elt):
+        Type.__init__(self, name)
+        self.is_container = True
+        self.elt = elt
+        self.fields = []
+        self.nmemb = 1
+        self.size = 0
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+        pads = 0
+
+        # Resolve all of our field datatypes.
+        for child in list(self.elt):
+            if child.tag == 'pad':
+                field_name = 'pad' + str(pads)
+                fkey = 'CARD8'
+                type = PadType(child)
+                pads = pads + 1
+                visible = False
+            elif child.tag == 'field':
+                field_name = child.get('name')
+                fkey = child.get('type')
+                type = module.get_type(fkey)
+                visible = True
+            elif child.tag == 'exprfield':
+                field_name = child.get('name')
+                fkey = child.get('type')
+                type = ExprType(child, module.get_type(fkey), self)
+                visible = False
+            elif child.tag == 'list':
+                field_name = child.get('name')
+                fkey = child.get('type')
+                type = ListType(child, module.get_type(fkey), self)
+                visible = True
+            elif child.tag == 'valueparam':
+                field_name = child.get('value-list-name')
+                fkey = 'CARD32'
+                type = ListType(child, module.get_type(fkey), self)
+                visible = True
+            else:
+                # Hit this on Reply
+                continue 
+
+            # Get the full type name for the field
+            field_type = module.get_type_name(fkey)
+            # Add the field to ourself
+            type.make_member_of(module, self, field_type, field_name, visible, True, False)
+            # Recursively resolve the type (could be another structure, list)
+            type.resolve(module)
+
+        self.calc_size() # Figure out how big we are
+        self.resolved = True
+
+    def calc_size(self):
+        self.size = 0
+        for m in self.fields:
+            if not m.wire:
+                continue
+            if m.type.fixed_size():
+                self.size = self.size + (m.type.size * m.type.nmemb)
+            else:
+                self.size = None
+                break
+
+    def fixed_size(self):
+        for m in self.fields:
+            if not m.type.fixed_size():
+                return False
+        return True
+
+
+class Struct(ComplexType):
+    '''
+    Derived class representing a struct data type.
+    '''
+    out = __main__.output['struct']
+
+
+class Union(ComplexType):
+    '''
+    Derived class representing a union data type.
+    '''
+    def __init__(self, name, elt):
+        ComplexType.__init__(self, name, elt)
+        self.is_union = True
+
+    out = __main__.output['union']
+
+
+class Reply(ComplexType):
+    '''
+    Derived class representing a reply.  Only found as a field of Request.
+    '''
+    def __init__(self, name, elt):
+        ComplexType.__init__(self, name, elt)
+        self.is_reply = True
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+        # Add the automatic protocol fields
+        self.fields.append(Field(tcard8, tcard8.name, 'response_type', False, True, True))
+        self.fields.append(_placeholder_byte)
+        self.fields.append(Field(tcard16, tcard16.name, 'sequence', False, True, True))
+        self.fields.append(Field(tcard32, tcard32.name, 'length', False, True, True))
+        ComplexType.resolve(self, module)
+        
+
+class Request(ComplexType):
+    '''
+    Derived class representing a request.
+
+    Public fields added:
+    reply contains the reply datatype or None for void requests.
+    opcode contains the request number.
+    '''
+    def __init__(self, name, elt):
+        ComplexType.__init__(self, name, elt)
+        self.reply = None
+        self.opcode = elt.get('opcode')
+
+        for child in list(elt):
+            if child.tag == 'reply':
+                self.reply = Reply(name, child)
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+        # Add the automatic protocol fields
+        if module.namespace.is_ext:
+            self.fields.append(Field(tcard8, tcard8.name, 'major_opcode', False, True, True))
+            self.fields.append(Field(tcard8, tcard8.name, 'minor_opcode', False, True, True))
+            self.fields.append(Field(tcard16, tcard16.name, 'length', False, True, True))
+            ComplexType.resolve(self, module)
+        else:
+            self.fields.append(Field(tcard8, tcard8.name, 'major_opcode', False, True, True))
+            self.fields.append(_placeholder_byte)
+            self.fields.append(Field(tcard16, tcard16.name, 'length', False, True, True))
+            ComplexType.resolve(self, module)
+
+        if self.reply:
+            self.reply.resolve(module)
+
+    out = __main__.output['request']
+
+
+class Event(ComplexType):
+    '''
+    Derived class representing an event data type.
+
+    Public fields added:
+    opcodes is a dictionary of name -> opcode number, for eventcopies.
+    '''
+    def __init__(self, name, elt):
+        ComplexType.__init__(self, name, elt)
+        self.opcodes = {}
+
+        tmp = elt.get('no-sequence-number')
+        self.has_seq = (tmp == None or tmp.lower() == 'false' or tmp == '0')
+            
+    def add_opcode(self, opcode, name, main):
+        self.opcodes[name] = opcode
+        if main:
+            self.name = name
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+
+        # Add the automatic protocol fields
+        self.fields.append(Field(tcard8, tcard8.name, 'response_type', False, True, True))
+        if self.has_seq:
+            self.fields.append(_placeholder_byte)
+            self.fields.append(Field(tcard16, tcard16.name, 'sequence', False, True, True))
+        ComplexType.resolve(self, module)
+
+    out = __main__.output['event']
+
+
+class Error(ComplexType):
+    '''
+    Derived class representing an error data type.
+
+    Public fields added:
+    opcodes is a dictionary of name -> opcode number, for errorcopies.
+    '''
+    def __init__(self, name, elt):
+        ComplexType.__init__(self, name, elt)
+        self.opcodes = {}
+
+    def add_opcode(self, opcode, name, main):
+        self.opcodes[name] = opcode
+        if main:
+            self.name = name
+
+    def resolve(self, module):
+        if self.resolved:
+            return
+
+        # Add the automatic protocol fields
+        self.fields.append(Field(tcard8, tcard8.name, 'response_type', False, True, True))
+        self.fields.append(Field(tcard8, tcard8.name, 'error_code', False, True, True))
+        self.fields.append(Field(tcard16, tcard16.name, 'sequence', False, True, True))
+        ComplexType.resolve(self, module)
+
+    out = __main__.output['error']
+
+_placeholder_byte = Field(PadType(None), tcard8.name, 'pad0', False, True, False)


More information about the xcb-commit mailing list