From 7a18a7256f3f206d2e45783759131f53ef09b2ac Mon Sep 17 00:00:00 2001 From: marha Date: Sat, 15 May 2010 16:36:39 +0000 Subject: xcb-proto git update 15/5/2010 --- libxcb/xcb-proto/xcbgen/expr.py | 183 +++++++++++++++++++++------------------- 1 file changed, 95 insertions(+), 88 deletions(-) (limited to 'libxcb/xcb-proto/xcbgen/expr.py') diff --git a/libxcb/xcb-proto/xcbgen/expr.py b/libxcb/xcb-proto/xcbgen/expr.py index 522e17d09..9b1855425 100644 --- a/libxcb/xcb-proto/xcbgen/expr.py +++ b/libxcb/xcb-proto/xcbgen/expr.py @@ -1,88 +1,95 @@ -''' -This module contains helper classes for structure fields and length expressions. -''' -class Field(object): - ''' - Represents a field of a structure. - - type is the datatype object for the field. - field_type is the name of the type (string tuple) - field_name is the name of the structure field. - visible is true iff the field should be in the request API. - wire is true iff the field should be in the request structure. - auto is true iff the field is on the wire but not in the request API (e.g. opcode) - ''' - def __init__(self, type, field_type, field_name, visible, wire, auto): - self.type = type - self.field_type = field_type - self.field_name = field_name - self.visible = visible - self.wire = wire - self.auto = auto - - -class Expression(object): - ''' - Represents a mathematical expression for a list length or exprfield. - - Public fields: - op is the operation (text +,*,/,<<) or None. - lhs and rhs are the sub-Expressions if op is set. - lenfield_name is the name of the length field, or None for request lists. - lenfield is the Field object for the length field, or None. - bitfield is True if the length field is a bitmask instead of a number. - nmemb is the fixed size (value)of the expression, or None - ''' - def __init__(self, elt, parent): - self.parent = parent - - self.nmemb = None - - self.lenfield_name = None - self.lenfield_type = None - self.lenfield = None - self.lenwire = False - self.bitfield = False - - self.op = None - self.lhs = None - self.rhs = None - - if elt.tag == 'list': - # List going into a request, which has no length field (inferred by server) - self.lenfield_name = elt.get('name') + '_len' - self.lenfield_type = 'CARD32' - - elif elt.tag == 'fieldref': - # Standard list with a fieldref - self.lenfield_name = elt.text - - elif elt.tag == 'valueparam': - # Value-mask. The length bitmask is described by attributes. - self.lenfield_name = elt.get('value-mask-name') - self.lenfield_type = elt.get('value-mask-type') - self.lenwire = True - self.bitfield = True - - elif elt.tag == 'op': - # Op field. Need to recurse. - self.op = elt.get('op') - self.lhs = Expression(list(elt)[0], parent) - self.rhs = Expression(list(elt)[1], parent) - - # Hopefully we don't have two separate length fields... - self.lenfield_name = self.lhs.lenfield_name - if self.lenfield_name == None: - self.lenfield_name = self.rhs.lenfield_name - - elif elt.tag == 'value': - # Constant expression - self.nmemb = int(elt.text) - - else: - # Notreached - raise Exception('XXX') - - - def fixed_size(self): - return self.nmemb != None +''' +This module contains helper classes for structure fields and length expressions. +''' +class Field(object): + ''' + Represents a field of a structure. + + type is the datatype object for the field. + field_type is the name of the type (string tuple) + field_name is the name of the structure field. + visible is true iff the field should be in the request API. + wire is true iff the field should be in the request structure. + auto is true iff the field is on the wire but not in the request API (e.g. opcode) + ''' + def __init__(self, type, field_type, field_name, visible, wire, auto): + self.type = type + self.field_type = field_type + self.field_name = field_name + self.visible = visible + self.wire = wire + self.auto = auto + + +class Expression(object): + ''' + Represents a mathematical expression for a list length or exprfield. + + Public fields: + op is the operation (text +,*,/,<<,~) or None. + lhs and rhs are the sub-Expressions if op is set. + lenfield_name is the name of the length field, or None for request lists. + lenfield is the Field object for the length field, or None. + bitfield is True if the length field is a bitmask instead of a number. + nmemb is the fixed size (value)of the expression, or None + ''' + def __init__(self, elt, parent): + self.parent = parent + + self.nmemb = None + + self.lenfield_name = None + self.lenfield_type = None + self.lenfield = None + self.lenwire = False + self.bitfield = False + + self.op = None + self.lhs = None + self.rhs = None + + if elt.tag == 'list': + # List going into a request, which has no length field (inferred by server) + self.lenfield_name = elt.get('name') + '_len' + self.lenfield_type = 'CARD32' + + elif elt.tag == 'fieldref': + # Standard list with a fieldref + self.lenfield_name = elt.text + + elif elt.tag == 'valueparam': + # Value-mask. The length bitmask is described by attributes. + self.lenfield_name = elt.get('value-mask-name') + self.lenfield_type = elt.get('value-mask-type') + self.lenwire = True + self.bitfield = True + + elif elt.tag == 'op': + # Op field. Need to recurse. + self.op = elt.get('op') + self.lhs = Expression(list(elt)[0], parent) + self.rhs = Expression(list(elt)[1], parent) + + # Hopefully we don't have two separate length fields... + self.lenfield_name = self.lhs.lenfield_name + if self.lenfield_name == None: + self.lenfield_name = self.rhs.lenfield_name + + elif elt.tag == 'unop': + # Op field. Need to recurse. + self.op = elt.get('op') + self.rhs = Expression(list(elt)[0], parent) + + self.lenfield_name = self.rhs.lenfield_name + + elif elt.tag == 'value': + # Constant expression + self.nmemb = int(elt.text, 0) + + else: + # Notreached + raise Exception('XXX') + + + def fixed_size(self): + return self.nmemb != None -- cgit v1.2.3