# Buffers allocated on the heap from bgenOutput import * from bgenType import OutputOnlyMixIn from bgenBuffer import FixedInputOutputBufferType class HeapInputOutputBufferType(FixedInputOutputBufferType): """Input-output buffer allocated on the heap -- passed as (inbuffer, outbuffer, size). Instantiate without parameters. Call from Python with input buffer. """ def __init__(self, datatype = 'char', sizetype = 'int', sizeformat = None): FixedInputOutputBufferType.__init__(self, "0", datatype, sizetype, sizeformat) def getOutputBufferDeclarations(self, name, constmode=False, outmode=False): if constmode: raise RuntimeError, "Cannot use const output buffer" if outmode: out = "*" else: out = "" return ["%s%s *%s__out__" % (self.datatype, out, name)] def getargsCheck(self, name): Output("if ((%s__out__ = malloc(%s__in_len__)) == NULL)", name, name) OutLbrace() Output('PyErr_NoMemory();') Output("goto %s__error__;", name) self.label_needed = 1 OutRbrace() Output("%s__len__ = %s__in_len__;", name, name) def passOutput(self, name): return "%s__in__, %s__out__, (%s)%s__len__" % \ (name, name, self.sizetype, name) def mkvalueArgs(self, name): return "%s__out__, (int)%s__len__" % (name, name) def cleanup(self, name): Output("free(%s__out__);", name) FixedInputOutputBufferType.cleanup(self, name) class VarHeapInputOutputBufferType(HeapInputOutputBufferType): """same as base class, but passed as (inbuffer, outbuffer, &size)""" def passOutput(self, name): return "%s__in__, %s__out__, &%s__len__" % (name, name, name) class HeapCombinedInputOutputBufferType(HeapInputOutputBufferType): """same as base class, but passed as (inoutbuffer, size)""" def passOutput(self, name): return "(%s *)memcpy(%s__out__, %s__in__, %s__len__)" % \ (self.datatype, name, name, name) class VarHeapCombinedInputOutputBufferType(HeapInputOutputBufferType): """same as base class, but passed as (inoutbuffer, &size)""" def passOutput(self, name): return "(%s *)memcpy(%s__out__, %s__in__, &%s__len__)" % \ (self.datatype, name, name, name) class HeapOutputBufferType(OutputOnlyMixIn, HeapInputOutputBufferType): """Output buffer allocated on the heap -- passed as (buffer, size). Instantiate without parameters. Call from Python with buffer size. """ def getInputBufferDeclarations(self, name, constmode=False): return [] def getargsFormat(self): return "i" def getargsArgs(self, name): return "&%s__in_len__" % name def passOutput(self, name): return "%s__out__, %s__len__" % (name, name) class VarHeapOutputBufferType(HeapOutputBufferType): """Output buffer allocated on the heap -- passed as (buffer, &size). Instantiate without parameters. Call from Python with buffer size. """ def passOutput(self, name): return "%s__out__, &%s__len__" % (name, name) class VarVarHeapOutputBufferType(VarHeapOutputBufferType): """Output buffer allocated on the heap -- passed as (buffer, size, &size). Instantiate without parameters. Call from Python with buffer size. """ def passOutput(self, name): return "%s__out__, %s__len__, &%s__len__" % (name, name, name) class MallocHeapOutputBufferType(HeapOutputBufferType): """Output buffer allocated by the called function -- passed as (&buffer, &size). Instantiate without parameters. Call from Python without parameters. """ def getargsCheck(self, name): Output("%s__out__ = NULL;", name) def getAuxDeclarations(self, name): return [] def passOutput(self, name): return "&%s__out__, &%s__len__" % (name, name) def getargsFormat(self): return "" def getargsArgs(self, name): return None def mkvalueFormat(self): return "z#" def cleanup(self, name): Output("if( %s__out__ ) free(%s__out__);", name, name)