X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=xcbgen%2Fxtypes.py;h=8ecbaa209333b18c4e2cd7b852e8fb381018f244;hb=fffbd04d6344e2fa82f744935caf4be8a3b18a73;hp=e9596a9491127d6b01185c54a5667c3a975540c6;hpb=a05a5106354c62d0862f8ed4f90d75bbf51e593f;p=free-sw%2Fxcb%2Fproto diff --git a/xcbgen/xtypes.py b/xcbgen/xtypes.py index e9596a9..8ecbaa2 100644 --- a/xcbgen/xtypes.py +++ b/xcbgen/xtypes.py @@ -33,7 +33,9 @@ class Type(object): self.is_union = False self.is_pad = False self.is_switch = False + self.is_case_or_bitcase = False self.is_bitcase = False + self.is_case = False def resolve(self, module): ''' @@ -74,6 +76,7 @@ class Type(object): return complex_type.fields.append(new_field) + new_field.parent = complex_type def make_fd_of(self, module, complex_type, fd_name): ''' @@ -267,13 +270,17 @@ class PadType(Type): Type.__init__(self, tcard8.name) self.is_pad = True self.size = 1 - self.nmemb = 1 if (elt == None) else int(elt.get('bytes'), 0) + self.nmemb = 1 + self.align = 1 + if elt != None: + self.nmemb = int(elt.get('bytes', "1"), 0) + self.align = int(elt.get('align', "1"), 0) def resolve(self, module): self.resolved = True def fixed_size(self): - return True + return self.align <= 1 class ComplexType(Type): @@ -401,16 +408,20 @@ class SwitchType(ComplexType): # Resolve all of our field datatypes. for index, child in enumerate(list(self.elt)): - if child.tag == 'bitcase': + if child.tag == 'bitcase' or child.tag == 'case': field_name = child.get('name') if field_name is None: - field_type = self.name + ('bitcase%d' % index,) + field_type = self.name + ('%s%d' % ( child.tag, index ),) else: field_type = self.name + (field_name,) # use self.parent to indicate anchestor, # as switch does not contain named fields itself - type = BitcaseType(index, field_type, child, *parents) + if child.tag == 'bitcase': + type = BitcaseType(index, field_type, child, *parents) + else: + type = CaseType(index, field_type, child, *parents) + # construct the switch type name from the parent type and the field name if field_name is None: type.has_name = False @@ -493,9 +504,9 @@ class Union(ComplexType): out = __main__.output['union'] -class BitcaseType(ComplexType): +class CaseOrBitcaseType(ComplexType): ''' - Derived class representing a struct data type. + Derived class representing a case or bitcase. ''' def __init__(self, index, name, elt, *parent): elts = list(elt) @@ -511,7 +522,7 @@ class BitcaseType(ComplexType): self.index = 1 self.lenfield_parent = list(parent) + [self] self.parents = list(parent) - self.is_bitcase = True + self.is_case_or_bitcase = True def make_member_of(self, module, switch_type, field_type, field_name, visible, wire, auto, enum=None): ''' @@ -542,6 +553,23 @@ class BitcaseType(ComplexType): ComplexType.resolve(self, module) +class BitcaseType(CaseOrBitcaseType): + ''' + Derived class representing a bitcase. + ''' + def __init__(self, index, name, elt, *parent): + CaseOrBitcaseType.__init__(self, index, name, elt, *parent) + self.is_bitcase = True + +class CaseType(CaseOrBitcaseType): + ''' + Derived class representing a case. + ''' + def __init__(self, index, name, elt, *parent): + CaseOrBitcaseType.__init__(self, index, name, elt, *parent) + self.is_case = True + + class Reply(ComplexType): ''' Derived class representing a reply. Only found as a field of Request.