summaryrefslogtreecommitdiffstats
path: root/Tools/bgen/bgen/bgenHeapBuffer.py
blob: 2c51695bf65731b32081e1244bcf45c55384e4c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# 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 declareOutputBuffer(self, name):
		Output("%s *%s__out__;", self.datatype, name)

	def getargsCheck(self, name):
		Output("if ((%s__out__ = malloc(%s__len__)) == NULL)", name, name)
		OutLbrace()
		Output('PyErr_NoMemory();')
		Output("goto %s__error__;", name)
		OutRbrace()

	def passOutput(self, name):
		return "%s__in__, %s__out__, %s__len__" % (name, name, name)

	def mkvalueArgs(self, name):
		return "%s__out__, %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 declareInputBuffer(self, name):
		pass
	
	def getargsFormat(self):
		return self.sizeformat
	
	def getargsArgs(self, name):
		return "&%s__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)