Skip to content

Commit

Permalink
c: Add streaming
Browse files Browse the repository at this point in the history
Change callback ID type from uint8_t to int16_t because high-level
callbacks have a negative callback ID.
  • Loading branch information
photron committed May 9, 2017
1 parent 4457d65 commit cf5fce5
Show file tree
Hide file tree
Showing 5 changed files with 530 additions and 63 deletions.
66 changes: 51 additions & 15 deletions c/c_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,36 +31,72 @@
import common

class CPacket(common.Packet):
def get_c_parameter_list(self):
param = ''
def get_c_parameters(self, signature=True, high_level=False, callback_wrapper=False):
parameters = []

for element in self.get_elements():
for element in self.get_elements(high_level=high_level):
c_type = element.get_c_type(True)
modifier = ''
name = element.get_underscore_name()
pointer = ''
arr = ''
array = ''

if name == 'stream_chunk_written':
if high_level:
c_type = 'uint16_t' # FIXME: uint16_t is not always the correct type
name = 'written'
elif not signature:
modifier = '&'

if element.get_direction() == 'out' and self.get_type() == 'function':
if signature:
modifier = '*'
name = 'ret_{0}'.format(name)
elif name in ['stream_total_length', 'stream_chunk_offset']:
modifier = '&'
elif name not in ['stream_chunk_data', 'stream_chunk_written']:
name = 'ret_{0}'.format(name)

if element.get_cardinality() < 0 and signature and \
((element.get_direction() == 'in' and self.get_type() == 'function') or \
(element.get_direction() == 'out' and self.get_type() == 'callback')):
modifier = '*'

if element.get_direction() == 'out':
pointer = '*'
name = 'ret_{0}'.format(name)
if element.get_cardinality() > 1:
arr = '[{0}]'.format(element.get_cardinality())
pointer = ''
modifier = ''
array = '[{0}]'.format(element.get_cardinality())

if high_level and callback_wrapper and element.is_high_level() and element.get_cardinality() < 0:
name = 'low_level_callback->data'

parameters.append('({0} *){1}'.format(element.get_c_type(False), name))
elif signature:
parameters.append('{0} {1}{2}{3}'.format(c_type, modifier, name, array))
else:
parameters.append('{0}{1}'.format(modifier, name))

if high_level and element.is_high_level() and element.get_cardinality() < 0:
if signature:
if element.get_direction() == 'out' and self.get_type() == 'function':
modifier = '*'
else:
modifier = ''

param += ', {0} {1}{2}{3}'.format(c_type, pointer, name, arr)
parameters.append('uint16_t {0}{1}_length'.format(modifier, name)) # FIXME: uint16_t is not always the correct type
else:
parameters.append('{0}{1}_length'.format(modifier, name))

return param
return ', '.join(parameters)

class CElement(common.Element):
def get_c_type(self, is_in_signature, is_in_struct=False):
def get_c_type(self, signature, struct=False):
if self.get_type() == 'string':
if self.get_direction() == 'in' and is_in_signature:
if self.get_direction() == 'in' and signature:
return 'const char'
else:
return 'char'
elif self.get_type() in ('int8', 'int16', 'int32', 'int64', 'uint8', 'uint16', 'uint32', 'uint64'):
return '{0}_t'.format(self.get_type())
elif self.get_type() == 'bool' and is_in_struct:
elif self.get_type() == 'bool' and struct:
return 'uint8_t'
else:
return self.get_type()
Loading

0 comments on commit cf5fce5

Please sign in to comment.