X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fc_client.py;h=299ad544c2dd2a29db89927456001c63a4206e4d;hb=9984b72888108a038d6b3f7dee374d17e26ef9e2;hp=db974e09f13464e75be8f36b3291db8b20ab2981;hpb=7e0674e76186ee4491a089350511fc0d22fb3af3;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/c_client.py b/src/c_client.py index db974e0..299ad54 100755 --- a/src/c_client.py +++ b/src/c_client.py @@ -17,18 +17,6 @@ _cplusplus_annoyances = {'class' : '_class', '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 = [] @@ -176,6 +164,12 @@ def c_open(self): for (n, h) in self.imports: _hc('#include "%s.h"', h) + _h('') + _h('#ifdef __cplusplus') + _h('extern "C" {') + _h('#endif') + + if _ns.is_ext: _h('') _h('#define XCB_%s_MAJOR_VERSION %s', _ns.ext_name.upper(), _ns.major_version) _h('#define XCB_%s_MINOR_VERSION %s', _ns.ext_name.upper(), _ns.minor_version) @@ -193,6 +187,12 @@ def c_close(self): _h_setlevel(2) _c_setlevel(2) _hc('') + + _h('') + _h('#ifdef __cplusplus') + _h('}') + _h('#endif') + _h('') _h('#endif') _h('') @@ -222,17 +222,15 @@ def c_enum(self, name): ''' _h_setlevel(0) _h('') - _h('typedef enum %s {', _t(name)) - count = len(self.values) + next = -1 for (enam, eval) in self.values: - count = count - 1 - equals = ' = ' if eval != '' else '' - comma = ',' if count > 0 else '' - _h(' %s%s%s%s', _n(name + (enam,)).upper(), equals, eval, comma) - - _h('} %s;', _t(name)) + if eval == '': + next += 1 + else: + next = int(eval) + _h('static const uint32_t %s = %d;', _n(name + (enam,)).upper(), next) def _c_type_setup(self, name, postfix): ''' @@ -307,7 +305,7 @@ def _c_iterator_get_end(field, accum): 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 + '))' @@ -443,7 +441,7 @@ def _c_accessors_field(self, field): ''' 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('/*****************************************************************************') @@ -535,7 +533,7 @@ def _c_accessors_list(self, field): _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('/*****************************************************************************') @@ -640,7 +638,7 @@ def _c_complex(self): if not field.type.fixed_size(): varfield = field.c_field_name continue - if varfield != None and not field.type.is_pad: + if varfield != None and not field.type.is_pad and field.wire: errmsg = '%s: warning: variable field %s followed by fixed field %s\n' % (self.c_type, varfield, field.c_field_name) sys.stderr.write(errmsg) # sys.exit(1)