'new' : '_new',
'delete': '_delete'}
-_cardinal_types = ['CARD8', 'uint8_t',
- 'CARD16','uint16_t',
- 'CARD32','uint32_t',
- 'INT8', 'int8_t',
- 'INT16', 'int16_t',
- 'INT32', 'int32_t',
- 'BYTE',
- 'BOOL',
- 'char',
- 'void',
- 'float',
- 'double']
_hlines = []
_hlevel = 0
_clines = []
_ns = self.namespace
_ns.c_ext_global_name = _n(_ns.prefix + ('id',))
+ # Build the type-name collision avoidance table used by c_enum
+ build_collision_table()
+
_h_setlevel(0)
_c_setlevel(0)
cfile.write('\n')
cfile.close()
+def build_collision_table():
+ global namecount
+ namecount = {}
+
+ for v in module.types.values():
+ name = _t(v[0])
+ namecount[name] = (namecount.get(name) or 0) + 1
+
def c_enum(self, name):
'''
Exported function that handles enum declarations.
'''
+
+ tname = _t(name)
+ if namecount[tname] > 1:
+ tname = _t(name + ('enum',))
+
_h_setlevel(0)
_h('')
- _h('typedef enum %s {', _t(name))
+ _h('typedef enum %s {', tname)
count = len(self.values)
comma = ',' if count > 0 else ''
_h(' %s%s%s%s', _n(name + (enam,)).upper(), equals, eval, comma)
- _h('} %s;', _t(name))
+ _h('} %s;', tname)
def _c_type_setup(self, name, postfix):
'''
return _c_iterator_get_end(field.type.last_varsized_field, accum)
if field.type.is_list:
# XXX we can always use the first way
- if field.type.c_type in _cardinal_types:
+ if field.type.member.is_simple:
return field.c_end_name + '(' + accum + ')'
else:
return field.type.member.c_end_name + '(' + field.c_iterator_name + '(' + accum + '))'
'''
Declares the accessor functions for a non-list field that follows a variable-length field.
'''
- if field.field_type[0] in _cardinal_types:
+ if field.type.is_simple:
_hc('')
_hc('')
_hc('/*****************************************************************************')
_c(' return %s;', _c_accessor_get_expr(field.type.expr, 'R'))
_c('}')
- if field.field_type[0] in _cardinal_types:
+ if field.type.member.is_simple:
_hc('')
_hc('')
_hc('/*****************************************************************************')