Skip to content

Commit

Permalink
Revamped type declaration so the basic routines return a list of stri…
Browse files Browse the repository at this point in the history
…ngs.

This allows variables to be declared as formal arguments. The bgenType.declare
method now simply outputs all declarations on separate lines ending
in semicolons.
  • Loading branch information
jackjansen committed Jun 22, 2005
1 parent 8ceeaba commit ab16c35
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 44 deletions.
56 changes: 29 additions & 27 deletions Tools/bgen/bgen/bgenBuffer.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,23 +38,25 @@ def __init__(self, size, datatype = 'char', sizetype = 'int', sizeformat = None)
self.sizeformat = sizeformat or type2format[sizetype]
self.label_needed = 0

def declare(self, name):
self.declareBuffer(name)
self.declareSize(name)
def getDeclarations(self, name, reference=False):
if reference:
raise RuntimeError, "Cannot pass buffer types by reference"
return self.getBufferDeclarations(name) + self.getSizeDeclarations(name)

def declareBuffer(self, name):
self.declareInputBuffer(name)
self.declareOutputBuffer(name)
def getBufferDeclarations(self, name):
return self.getInputBufferDeclarations(name) + self.getOutputBufferDeclarations(name)

def declareInputBuffer(self, name):
Output("%s *%s__in__;", self.datatype, name)
def getInputBufferDeclarations(self, name):
return ["%s *%s__in__" % (self.datatype, name)]

def declareOutputBuffer(self, name):
Output("%s %s__out__[%s];", self.datatype, name, self.size)
def getOutputBufferDeclarations(self, name):
return ["%s %s__out__[%s]" % (self.datatype, name, self.size)]

def declareSize(self, name):
Output("%s %s__len__;", self.sizetype, name)
Output("int %s__in_len__;", name)
def getSizeDeclarations(self, name):
return [
"%s %s__len__" %(self.sizetype, name),
"int %s__in_len__" %(name)
]

def getargsFormat(self):
return "s#"
Expand Down Expand Up @@ -102,14 +104,14 @@ def passOutput(self, name):

class InputOnlyBufferMixIn(InputOnlyMixIn):

def declareOutputBuffer(self, name):
pass
def getOutputBufferDeclarations(self, name):
return []


class OutputOnlyBufferMixIn(OutputOnlyMixIn):

def declareInputBuffer(self, name):
pass
def getInputBufferDeclarations(self, name):
return []

class OptionalInputBufferMixIn:

Expand Down Expand Up @@ -183,14 +185,14 @@ def __init__(self, type):
FixedInputOutputBufferType.__init__(self, "sizeof(%s)" % type)
self.typeName = self.type = type

def declareInputBuffer(self, name):
Output("%s *%s__in__;", self.type, name)
def getInputBufferDeclarations(self, name):
return ["%s *%s__in__" % (self.type, name)]

def declareSize(self, name):
Output("int %s__in_len__;", name)
def getSizeDeclarations(self, name):
return ["int %s__in_len__" % (name)]

def declareOutputBuffer(self, name):
Output("%s %s__out__;", self.type, name)
def getOutputBufferDeclarations(self, name):
return ["%s %s__out__" % (self.type, name)]

def getargsArgs(self, name):
return "(char **)&%s__in__, &%s__in_len__" % (name, name)
Expand Down Expand Up @@ -243,8 +245,8 @@ class StructOutputBufferType(OutputOnlyBufferMixIn, StructInputOutputBufferType)
Instantiate with the struct type as parameter.
"""

def declareSize(self, name):
pass
def getSizeDeclarations(self, name):
return []

def passOutput(self, name):
return "&%s__out__" % name
Expand All @@ -257,8 +259,8 @@ class ArrayOutputBufferType(OutputOnlyBufferMixIn, StructInputOutputBufferType):
Instantiate with the struct type as parameter.
"""

def declareSize(self, name):
pass
def getSizeDeclarations(self, name):
return []

def passOutput(self, name):
return "%s__out__" % name
8 changes: 4 additions & 4 deletions Tools/bgen/bgen/bgenHeapBuffer.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ class HeapInputOutputBufferType(FixedInputOutputBufferType):
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 getOutputBufferDeclarations(self, name):
return ["%s *%s__out__" % (self.datatype, name)]

def getargsCheck(self, name):
Output("if ((%s__out__ = malloc(%s__in_len__)) == NULL)", name, name)
Expand Down Expand Up @@ -74,8 +74,8 @@ class HeapOutputBufferType(OutputOnlyMixIn, HeapInputOutputBufferType):
Call from Python with buffer size.
"""

def declareInputBuffer(self, name):
pass
def getInputBufferDeclarations(self, name):
return []

def getargsFormat(self):
return "i"
Expand Down
4 changes: 2 additions & 2 deletions Tools/bgen/bgen/bgenStackBuffer.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ class VarStackOutputBufferType(StackOutputBufferType):
Instantiate with the buffer size as parameter.
"""

def declareSize(self, name):
Output("int %s__len__ = %s;", name, self.size)
def getSizeDeclarations(self, name):
return ["int %s__len__ = %s" % (name, self.size)]

def passOutput(self, name):
return "%s__out__, &%s__len__" % (name, name)
Expand Down
4 changes: 2 additions & 2 deletions Tools/bgen/bgen/bgenStringBuffer.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ class StringBufferMixIn:
less common. I'll write the classes when there is demand.)
"""

def declareSize(self, name):
pass
def getSizeDeclarations(self, name):
return []

def getargsFormat(self):
return "s"
Expand Down
15 changes: 8 additions & 7 deletions Tools/bgen/bgen/bgenType.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,16 @@ def declare(self, name, reference=False):
Example: int.declare('spam') prints "int spam;"
"""
Output("%s;", self.getDeclaration(name, reference))
for decl in self.getDeclarations(name, reference):
Output("%s;", decl)

def getDeclaration(self, name, reference=False):
def getDeclarations(self, name, reference=False):
"""Return a string declaring a variable or argument, without
any syntactic adornment"""
if reference:
return "%s& %s" % (self.typeName, name)
return ["%s& %s" % (self.typeName, name)]
else:
return "%s %s" % (self.typeName, name)
return ["%s %s" % (self.typeName, name)]

def getargs(self):
return self.getargsFormat(), self.getargsArgs()
Expand Down Expand Up @@ -185,9 +186,9 @@ class FakeType(InputOnlyType):
def __init__(self, substitute):
self.substitute = substitute
self.typeName = None # Don't show this argument in __doc__ string

def declare(self, name, reference=False):
pass
def getDeclarations(self, name, reference=False):
return []

def getargsFormat(self):
return ""
Expand Down
4 changes: 2 additions & 2 deletions Tools/bgen/bgen/bgenVariable.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,11 @@ def declare(self):
elif self.flags != SelfMode:
self.type.declare(self.name)

def getDeclaration(self):
def getDeclarations(self):
"""Return the unadorned declaration of the variable,
suitable for use in a formal parameter list."""
refmode = (self.flags & RefMode)
return self.type.getDeclaration(self.name, reference=refmode)
return self.type.getDeclarations(self.name, reference=refmode)

def getargsFormat(self):
"""Call the type's getargsFormatmethod."""
Expand Down

0 comments on commit ab16c35

Please sign in to comment.