# 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) |