Sigh, due to sloppiness on my part bgen has become pretty mixed up wrt. tabs
and spaces. Detabbed the lot.
diff --git a/Tools/bgen/bgen/bgenBuffer.py b/Tools/bgen/bgen/bgenBuffer.py
index ee4a128..4b888d7 100644
--- a/Tools/bgen/bgen/bgenBuffer.py
+++ b/Tools/bgen/bgen/bgenBuffer.py
@@ -12,14 +12,14 @@
 
 # Map common types to their format characters
 type2format = {
-	'long': 'l',
-	'int': 'i',
-	'short': 'h',
-	'char': 'b',
-	'unsigned long': 'l',
-	'unsigned int': 'i',
-	'unsigned short': 'h',
-	'unsigned char': 'b',
+    'long': 'l',
+    'int': 'i',
+    'short': 'h',
+    'char': 'b',
+    'unsigned long': 'l',
+    'unsigned int': 'i',
+    'unsigned short': 'h',
+    'unsigned char': 'b',
 }
 
 
@@ -27,238 +27,238 @@
 
 
 class FixedInputOutputBufferType(InputOnlyType):
-	
-	"""Fixed buffer -- passed as (inbuffer, outbuffer)."""
+    
+    """Fixed buffer -- passed as (inbuffer, outbuffer)."""
 
-	def __init__(self, size, datatype = 'char', sizetype = 'int', sizeformat = None):
-		self.typeName = "Buffer"
-		self.size = str(size)
-		self.datatype = datatype
-		self.sizetype = sizetype
-		self.sizeformat = sizeformat or type2format[sizetype]
-		self.label_needed = 0
+    def __init__(self, size, datatype = 'char', sizetype = 'int', sizeformat = None):
+        self.typeName = "Buffer"
+        self.size = str(size)
+        self.datatype = datatype
+        self.sizetype = sizetype
+        self.sizeformat = sizeformat or type2format[sizetype]
+        self.label_needed = 0
 
-	def declare(self, name):
-		self.declareBuffer(name)
-		self.declareSize(name)
-	
-	def declareBuffer(self, name):
-		self.declareInputBuffer(name)
-		self.declareOutputBuffer(name)
-	
-	def declareInputBuffer(self, name):
-		Output("%s *%s__in__;", self.datatype, name)
-	
-	def declareOutputBuffer(self, name):
-		Output("%s %s__out__[%s];", self.datatype, name, self.size)
+    def declare(self, name):
+        self.declareBuffer(name)
+        self.declareSize(name)
+    
+    def declareBuffer(self, name):
+        self.declareInputBuffer(name)
+        self.declareOutputBuffer(name)
+    
+    def declareInputBuffer(self, name):
+        Output("%s *%s__in__;", self.datatype, name)
+    
+    def declareOutputBuffer(self, name):
+        Output("%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 declareSize(self, name):
+        Output("%s %s__len__;", self.sizetype, name)
+        Output("int %s__in_len__;", name)
 
-	def getargsFormat(self):
-		return "s#"
+    def getargsFormat(self):
+        return "s#"
 
-	def getargsArgs(self, name):
-		return "&%s__in__, &%s__in_len__" % (name, name)
-	
-	def getargsCheck(self, name):
-		Output("if (%s__in_len__ != %s)", name, self.size)
-		OutLbrace()
-		Output('PyErr_SetString(PyExc_TypeError, "buffer length should be %s");',
-		       self.size)
-		Output("goto %s__error__;", name)
-		self.label_needed = 1
-		OutRbrace()
-		self.transferSize(name)
-	
-	def transferSize(self, name):
-		Output("%s__len__ = %s__in_len__;", name, name)
+    def getargsArgs(self, name):
+        return "&%s__in__, &%s__in_len__" % (name, name)
+    
+    def getargsCheck(self, name):
+        Output("if (%s__in_len__ != %s)", name, self.size)
+        OutLbrace()
+        Output('PyErr_SetString(PyExc_TypeError, "buffer length should be %s");',
+               self.size)
+        Output("goto %s__error__;", name)
+        self.label_needed = 1
+        OutRbrace()
+        self.transferSize(name)
+    
+    def transferSize(self, name):
+        Output("%s__len__ = %s__in_len__;", name, name)
 
-	def passOutput(self, name):
-		return "%s__in__, %s__out__" % (name, name)
-	
-	def mkvalueFormat(self):
-		return "s#"
+    def passOutput(self, name):
+        return "%s__in__, %s__out__" % (name, name)
+    
+    def mkvalueFormat(self):
+        return "s#"
 
-	def mkvalueArgs(self, name):
-		return "%s__out__, (int)%s" % (name, self.size)
-	
-	def cleanup(self, name):
-		if self.label_needed:
-			DedentLevel()
-			Output(" %s__error__: ;", name)
-			IndentLevel()
+    def mkvalueArgs(self, name):
+        return "%s__out__, (int)%s" % (name, self.size)
+    
+    def cleanup(self, name):
+        if self.label_needed:
+            DedentLevel()
+            Output(" %s__error__: ;", name)
+            IndentLevel()
 
 
 class FixedCombinedInputOutputBufferType(FixedInputOutputBufferType):
-	
-	"""Like fixed buffer -- but same parameter is input and output."""
-	
-	def passOutput(self, name):
-		return "(%s *)memcpy(%s__out__, %s__in__, %s)" % \
-			(self.datatype, name,   name,     self.size)
+    
+    """Like fixed buffer -- but same parameter is input and output."""
+    
+    def passOutput(self, name):
+        return "(%s *)memcpy(%s__out__, %s__in__, %s)" % \
+            (self.datatype, name,   name,     self.size)
 
 
 class InputOnlyBufferMixIn(InputOnlyMixIn):
 
-	def declareOutputBuffer(self, name):
-		pass
+    def declareOutputBuffer(self, name):
+        pass
 
 
 class OutputOnlyBufferMixIn(OutputOnlyMixIn):
 
-	def declareInputBuffer(self, name):
-		pass
+    def declareInputBuffer(self, name):
+        pass
 
 class OptionalInputBufferMixIn:
-	
-	"""Add to input buffers if the buffer may be omitted: pass None in Python
-	and the C code will get a NULL pointer and zero size"""
-	
-	def getargsFormat(self):
-		return "z#"
+    
+    """Add to input buffers if the buffer may be omitted: pass None in Python
+    and the C code will get a NULL pointer and zero size"""
+    
+    def getargsFormat(self):
+        return "z#"
 
 
 class FixedInputBufferType(InputOnlyBufferMixIn, FixedInputOutputBufferType):
 
-	"""Fixed size input buffer -- passed without size information.
+    """Fixed size input buffer -- passed without size information.
 
-	Instantiate with the size as parameter.
-	"""
+    Instantiate with the size as parameter.
+    """
 
-	def passInput(self, name):
-		return "%s__in__" % name
+    def passInput(self, name):
+        return "%s__in__" % name
 
 class OptionalFixedInputBufferType(OptionalInputBufferMixIn, FixedInputBufferType):
-	pass
+    pass
 
 class FixedOutputBufferType(OutputOnlyBufferMixIn, FixedInputOutputBufferType):
 
-	"""Fixed size output buffer -- passed without size information.
+    """Fixed size output buffer -- passed without size information.
 
-	Instantiate with the size as parameter.
-	"""
+    Instantiate with the size as parameter.
+    """
 
-	def passOutput(self, name):
-		return "%s__out__" % name
+    def passOutput(self, name):
+        return "%s__out__" % name
 
 
 class VarInputBufferType(FixedInputBufferType):
 
-	"""Variable size input buffer -- passed as (buffer, size).
-	
-	Instantiate without size parameter.
-	"""
-	
-	def __init__(self, datatype = 'char', sizetype = 'int', sizeformat = None):
-		FixedInputBufferType.__init__(self, "0", datatype, sizetype, sizeformat)
-	
-	def getargsCheck(self, name):
-		Output("%s__len__ = %s__in_len__;", name, name)
-	
-	def passInput(self, name):
-		return "%s__in__, %s__len__" % (name, name)
-		
+    """Variable size input buffer -- passed as (buffer, size).
+    
+    Instantiate without size parameter.
+    """
+    
+    def __init__(self, datatype = 'char', sizetype = 'int', sizeformat = None):
+        FixedInputBufferType.__init__(self, "0", datatype, sizetype, sizeformat)
+    
+    def getargsCheck(self, name):
+        Output("%s__len__ = %s__in_len__;", name, name)
+    
+    def passInput(self, name):
+        return "%s__in__, %s__len__" % (name, name)
+        
 class ReverseInputBufferMixin:
-	""" Mixin for input buffers that are passed as (size, buffer) """
-	
-	def passInput(self, name):
-		return "%s__len__, %s__in__" % (name, name)
-		
+    """ Mixin for input buffers that are passed as (size, buffer) """
+    
+    def passInput(self, name):
+        return "%s__len__, %s__in__" % (name, name)
+        
 class OptionalVarInputBufferType(OptionalInputBufferMixIn, VarInputBufferType):
-	pass
-	
+    pass
+    
 # ----- PART 2: Structure buffers -----
 
 
 class StructInputOutputBufferType(FixedInputOutputBufferType):
-	
-	"""Structure buffer -- passed as a structure pointer.
+    
+    """Structure buffer -- passed as a structure pointer.
 
-	Instantiate with the struct type as parameter.
-	"""
-	
-	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 declareSize(self, name):
-		Output("int %s__in_len__;", name)
-	
-	def declareOutputBuffer(self, name):
-		Output("%s %s__out__;", self.type, name)
-	
-	def getargsArgs(self, name):
-		return "(char **)&%s__in__, &%s__in_len__" % (name, name)
-	
-	def transferSize(self, name):
-		pass
-	
-	def passInput(self, name):
-		return "%s__in__" % name
-	
-	def passOutput(self, name):
-		return "%s__in__, &%s__out__" % (name, name)
-	
-	def mkvalueArgs(self, name):
-		return "(char *)&%s__out__, (int)%s" % (name, self.size)
+    Instantiate with the struct type as parameter.
+    """
+    
+    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 declareSize(self, name):
+        Output("int %s__in_len__;", name)
+    
+    def declareOutputBuffer(self, name):
+        Output("%s %s__out__;", self.type, name)
+    
+    def getargsArgs(self, name):
+        return "(char **)&%s__in__, &%s__in_len__" % (name, name)
+    
+    def transferSize(self, name):
+        pass
+    
+    def passInput(self, name):
+        return "%s__in__" % name
+    
+    def passOutput(self, name):
+        return "%s__in__, &%s__out__" % (name, name)
+    
+    def mkvalueArgs(self, name):
+        return "(char *)&%s__out__, (int)%s" % (name, self.size)
 
 
 class StructCombinedInputOutputBufferType(StructInputOutputBufferType):
 
-	"""Like structure buffer -- but same parameter is input and output."""
-	
-	def passOutput(self, name):
-		return "(%s *)memcpy((char *)%s__out__, (char *)%s__in__, %s)" % \
-			(self.type,          name,              name,     self.size)
+    """Like structure buffer -- but same parameter is input and output."""
+    
+    def passOutput(self, name):
+        return "(%s *)memcpy((char *)%s__out__, (char *)%s__in__, %s)" % \
+            (self.type,          name,              name,     self.size)
 
 
 class StructInputBufferType(InputOnlyBufferMixIn, StructInputOutputBufferType):
 
-	"""Fixed size input buffer -- passed as a pointer to a structure.
+    """Fixed size input buffer -- passed as a pointer to a structure.
 
-	Instantiate with the struct type as parameter.
-	"""
+    Instantiate with the struct type as parameter.
+    """
 
 
 class StructByValueBufferType(StructInputBufferType):
 
-	"""Fixed size input buffer -- passed as a structure BY VALUE.
+    """Fixed size input buffer -- passed as a structure BY VALUE.
 
-	Instantiate with the struct type as parameter.
-	"""
+    Instantiate with the struct type as parameter.
+    """
 
-	def passInput(self, name):
-		return "*%s__in__" % name
+    def passInput(self, name):
+        return "*%s__in__" % name
 
 
 class StructOutputBufferType(OutputOnlyBufferMixIn, StructInputOutputBufferType):
 
-	"""Fixed size output buffer -- passed as a pointer to a structure.
+    """Fixed size output buffer -- passed as a pointer to a structure.
 
-	Instantiate with the struct type as parameter.
-	"""
-	
-	def declareSize(self, name):
-		pass
+    Instantiate with the struct type as parameter.
+    """
+    
+    def declareSize(self, name):
+        pass
 
-	def passOutput(self, name):
-		return "&%s__out__" % name
+    def passOutput(self, name):
+        return "&%s__out__" % name
 
 
 class ArrayOutputBufferType(OutputOnlyBufferMixIn, StructInputOutputBufferType):
 
-	"""Fixed size output buffer -- declared as a typedef, passed as an array.
+    """Fixed size output buffer -- declared as a typedef, passed as an array.
 
-	Instantiate with the struct type as parameter.
-	"""
-	
-	def declareSize(self, name):
-		pass
+    Instantiate with the struct type as parameter.
+    """
+    
+    def declareSize(self, name):
+        pass
 
-	def passOutput(self, name):
-		return "%s__out__" % name
+    def passOutput(self, name):
+        return "%s__out__" % name
diff --git a/Tools/bgen/bgen/bgenGenerator.py b/Tools/bgen/bgen/bgenGenerator.py
index 1c19388..f3cdfce 100644
--- a/Tools/bgen/bgen/bgenGenerator.py
+++ b/Tools/bgen/bgen/bgenGenerator.py
@@ -15,260 +15,260 @@
 
 class BaseFunctionGenerator:
 
-	def __init__(self, name, condition=None):
-		if DEBUG: print "<--", name
-		self.name = name
-		self.prefix = name
-		self.objecttype = "PyObject" # Type of _self argument to function
-		self.condition = condition
+    def __init__(self, name, condition=None):
+        if DEBUG: print "<--", name
+        self.name = name
+        self.prefix = name
+        self.objecttype = "PyObject" # Type of _self argument to function
+        self.condition = condition
 
-	def setprefix(self, prefix):
-		self.prefix = prefix
+    def setprefix(self, prefix):
+        self.prefix = prefix
 
-	def generate(self):
-		if DEBUG: print "-->", self.name
-		if self.condition:
-			Output()
-			Output(self.condition)
-		self.functionheader()
-		self.functionbody()
-		self.functiontrailer()
-		if self.condition:
-			Output("#endif")
+    def generate(self):
+        if DEBUG: print "-->", self.name
+        if self.condition:
+            Output()
+            Output(self.condition)
+        self.functionheader()
+        self.functionbody()
+        self.functiontrailer()
+        if self.condition:
+            Output("#endif")
 
-	def functionheader(self):
-		Output()
-		Output("static PyObject *%s_%s(%s *_self, PyObject *_args)",
-		       self.prefix, self.name, self.objecttype)
-		OutLbrace()
-		Output("PyObject *_res = NULL;")
+    def functionheader(self):
+        Output()
+        Output("static PyObject *%s_%s(%s *_self, PyObject *_args)",
+               self.prefix, self.name, self.objecttype)
+        OutLbrace()
+        Output("PyObject *_res = NULL;")
 
-	def functionbody(self):
-		Output("/* XXX To be provided */")
+    def functionbody(self):
+        Output("/* XXX To be provided */")
 
-	def functiontrailer(self):
-		OutRbrace()
+    def functiontrailer(self):
+        OutRbrace()
 
-	def reference(self, name = None):
-		if name is None:
-			name = self.name
-		docstring = self.docstring()
-		if self.condition:
-			Output()
-			Output(self.condition)		
-		Output("{\"%s\", (PyCFunction)%s_%s, 1,", name, self.prefix, self.name)
-		Output(" PyDoc_STR(%s)},", stringify(docstring))
-		if self.condition:
-			Output("#endif")
+    def reference(self, name = None):
+        if name is None:
+            name = self.name
+        docstring = self.docstring()
+        if self.condition:
+            Output()
+            Output(self.condition)      
+        Output("{\"%s\", (PyCFunction)%s_%s, 1,", name, self.prefix, self.name)
+        Output(" PyDoc_STR(%s)},", stringify(docstring))
+        if self.condition:
+            Output("#endif")
 
-	def docstring(self):
-		return None
+    def docstring(self):
+        return None
 
-	def __cmp__(self, other):
-		if not hasattr(other, 'name'):
-			return cmp(id(self), id(other))
-		return cmp(self.name, other.name)
+    def __cmp__(self, other):
+        if not hasattr(other, 'name'):
+            return cmp(id(self), id(other))
+        return cmp(self.name, other.name)
 
 _stringify_map = {'\n': '\\n', '\t': '\\t', '\r': '\\r', '\b': '\\b',
                   '\e': '\\e', '\a': '\\a', '\f': '\\f', '"': '\\"'}
 def stringify(str):
-	if str is None: return "NULL"
-	res = '"'
-	map = _stringify_map
-	for c in str:
-		if map.has_key(c): res = res + map[c]
-		elif ' ' <= c <= '~': res = res + c
-		else: res = res + '\\%03o' % ord(c)
-	res = res + '"'
-	return res
+    if str is None: return "NULL"
+    res = '"'
+    map = _stringify_map
+    for c in str:
+        if map.has_key(c): res = res + map[c]
+        elif ' ' <= c <= '~': res = res + c
+        else: res = res + '\\%03o' % ord(c)
+    res = res + '"'
+    return res
 
 
 class ManualGenerator(BaseFunctionGenerator):
 
-	def __init__(self, name, body, condition=None):
-		BaseFunctionGenerator.__init__(self, name, condition=condition)
-		self.body = body
+    def __init__(self, name, body, condition=None):
+        BaseFunctionGenerator.__init__(self, name, condition=condition)
+        self.body = body
 
-	def functionbody(self):
-		Output("%s", self.body)
-		
-	def setselftype(self, selftype, itselftype):
-		self.objecttype = selftype
-		self.itselftype = itselftype
+    def functionbody(self):
+        Output("%s", self.body)
+        
+    def setselftype(self, selftype, itselftype):
+        self.objecttype = selftype
+        self.itselftype = itselftype
 
 
 class FunctionGenerator(BaseFunctionGenerator):
 
-	def __init__(self, returntype, name, *argumentList, **conditionlist):
-		BaseFunctionGenerator.__init__(self, name, **conditionlist)
-		self.returntype = returntype
-		self.argumentList = []
-		self.setreturnvar()
-		self.parseArgumentList(argumentList)
-		self.prefix     = "XXX"    # Will be changed by setprefix() call
-		self.itselftype = None     # Type of _self->ob_itself, if defined
+    def __init__(self, returntype, name, *argumentList, **conditionlist):
+        BaseFunctionGenerator.__init__(self, name, **conditionlist)
+        self.returntype = returntype
+        self.argumentList = []
+        self.setreturnvar()
+        self.parseArgumentList(argumentList)
+        self.prefix     = "XXX"    # Will be changed by setprefix() call
+        self.itselftype = None     # Type of _self->ob_itself, if defined
 
-	def setreturnvar(self):
-		if self.returntype:
-			self.rv = self.makereturnvar()
-			self.argumentList.append(self.rv)
-		else:
-			self.rv = None
-	
-	def makereturnvar(self):
-		return Variable(self.returntype, "_rv", OutMode)
+    def setreturnvar(self):
+        if self.returntype:
+            self.rv = self.makereturnvar()
+            self.argumentList.append(self.rv)
+        else:
+            self.rv = None
+    
+    def makereturnvar(self):
+        return Variable(self.returntype, "_rv", OutMode)
 
-	def setselftype(self, selftype, itselftype):
-		self.objecttype = selftype
-		self.itselftype = itselftype
+    def setselftype(self, selftype, itselftype):
+        self.objecttype = selftype
+        self.itselftype = itselftype
 
-	def parseArgumentList(self, argumentList):
-		iarg = 0
-		for type, name, mode in argumentList:
-			iarg = iarg + 1
-			if name is None: name = "_arg%d" % iarg
-			arg = Variable(type, name, mode)
-			self.argumentList.append(arg)
-	
-	def docstring(self):
-		input = []
-		output = []
-		for arg in self.argumentList:
-			if arg.flags == ErrorMode or arg.flags == SelfMode:
-				continue
-			if arg.type == None:
-				str = 'void'
-			else:
-				if hasattr(arg.type, 'typeName'):
-					typeName = arg.type.typeName
-					if typeName is None: # Suppressed type
-						continue
-				else:
-					typeName = "?"
-					print "Nameless type", arg.type
-					
-				str = typeName + ' ' + arg.name
-			if arg.mode in (InMode, InOutMode):
-				input.append(str)
-			if arg.mode in (InOutMode, OutMode):
-				output.append(str)
-		if not input:
-			instr = "()"
-		else:
-			instr = "(%s)" % ", ".join(input)
-		if not output or output == ["void"]:
-			outstr = "None"
-		else:
-			outstr = "(%s)" % ", ".join(output)
-		return instr + " -> " + outstr
-	
-	def functionbody(self):
-		self.declarations()
-		self.precheck()
-		self.getargs()
-		self.callit()
-		self.checkit()
-		self.returnvalue()
+    def parseArgumentList(self, argumentList):
+        iarg = 0
+        for type, name, mode in argumentList:
+            iarg = iarg + 1
+            if name is None: name = "_arg%d" % iarg
+            arg = Variable(type, name, mode)
+            self.argumentList.append(arg)
+    
+    def docstring(self):
+        input = []
+        output = []
+        for arg in self.argumentList:
+            if arg.flags == ErrorMode or arg.flags == SelfMode:
+                continue
+            if arg.type == None:
+                str = 'void'
+            else:
+                if hasattr(arg.type, 'typeName'):
+                    typeName = arg.type.typeName
+                    if typeName is None: # Suppressed type
+                        continue
+                else:
+                    typeName = "?"
+                    print "Nameless type", arg.type
+                    
+                str = typeName + ' ' + arg.name
+            if arg.mode in (InMode, InOutMode):
+                input.append(str)
+            if arg.mode in (InOutMode, OutMode):
+                output.append(str)
+        if not input:
+            instr = "()"
+        else:
+            instr = "(%s)" % ", ".join(input)
+        if not output or output == ["void"]:
+            outstr = "None"
+        else:
+            outstr = "(%s)" % ", ".join(output)
+        return instr + " -> " + outstr
+    
+    def functionbody(self):
+        self.declarations()
+        self.precheck()
+        self.getargs()
+        self.callit()
+        self.checkit()
+        self.returnvalue()
 
-	def declarations(self):
-		for arg in self.argumentList:
-			arg.declare()
+    def declarations(self):
+        for arg in self.argumentList:
+            arg.declare()
 
-	def getargs(self):
-		fmt = ""
-		lst = ""
-		sep = ",\n" + ' '*len("if (!PyArg_ParseTuple(")
-		for arg in self.argumentList:
-			if arg.flags == SelfMode:
-				continue
-			if arg.mode in (InMode, InOutMode):
-				fmt = fmt + arg.getargsFormat()
-				args = arg.getargsArgs()
-				if args:
-					lst = lst + sep + args
-		Output("if (!PyArg_ParseTuple(_args, \"%s\"%s))", fmt, lst)
-		IndentLevel()
-		Output("return NULL;")
-		DedentLevel()
-		for arg in self.argumentList:
-			if arg.flags == SelfMode:
-				continue
-			if arg.mode in (InMode, InOutMode):
-				arg.getargsCheck()
-	
-	def precheck(self):
-		pass
+    def getargs(self):
+        fmt = ""
+        lst = ""
+        sep = ",\n" + ' '*len("if (!PyArg_ParseTuple(")
+        for arg in self.argumentList:
+            if arg.flags == SelfMode:
+                continue
+            if arg.mode in (InMode, InOutMode):
+                fmt = fmt + arg.getargsFormat()
+                args = arg.getargsArgs()
+                if args:
+                    lst = lst + sep + args
+        Output("if (!PyArg_ParseTuple(_args, \"%s\"%s))", fmt, lst)
+        IndentLevel()
+        Output("return NULL;")
+        DedentLevel()
+        for arg in self.argumentList:
+            if arg.flags == SelfMode:
+                continue
+            if arg.mode in (InMode, InOutMode):
+                arg.getargsCheck()
+    
+    def precheck(self):
+        pass
 
-	def callit(self):
-		args = ""
-		if self.rv:
-			s = "%s = %s(" % (self.rv.name, self.name)
-		else:
-			s = "%s(" % self.name
-		sep = ",\n" + ' '*len(s)
-		for arg in self.argumentList:
-			if arg is self.rv:
-				continue
-			s = arg.passArgument()
-			if args: s = sep + s
-			args = args + s
-		if self.rv:
-			Output("%s = %s(%s);",
-			       self.rv.name, self.name, args)
-		else:
-			Output("%s(%s);", self.name, args)
+    def callit(self):
+        args = ""
+        if self.rv:
+            s = "%s = %s(" % (self.rv.name, self.name)
+        else:
+            s = "%s(" % self.name
+        sep = ",\n" + ' '*len(s)
+        for arg in self.argumentList:
+            if arg is self.rv:
+                continue
+            s = arg.passArgument()
+            if args: s = sep + s
+            args = args + s
+        if self.rv:
+            Output("%s = %s(%s);",
+                   self.rv.name, self.name, args)
+        else:
+            Output("%s(%s);", self.name, args)
 
-	def checkit(self):
-		for arg in self.argumentList:
-			arg.errorCheck()
+    def checkit(self):
+        for arg in self.argumentList:
+            arg.errorCheck()
 
-	def returnvalue(self):
-		fmt = ""
-		lst = ""
-		sep = ",\n" + ' '*len("return Py_BuildValue(")
-		for arg in self.argumentList:
-			if not arg: continue
-			if arg.flags == ErrorMode: continue
-			if arg.mode in (OutMode, InOutMode):
-				fmt = fmt + arg.mkvalueFormat()
-				lst = lst + sep + arg.mkvalueArgs()
-		if fmt == "":
-			Output("Py_INCREF(Py_None);")
-			Output("_res = Py_None;");
-		else:
-			Output("_res = Py_BuildValue(\"%s\"%s);", fmt, lst)
-		tmp = self.argumentList[:]
-		tmp.reverse()
-		for arg in tmp:
-			if not arg: continue
-			arg.cleanup()
-		Output("return _res;")
+    def returnvalue(self):
+        fmt = ""
+        lst = ""
+        sep = ",\n" + ' '*len("return Py_BuildValue(")
+        for arg in self.argumentList:
+            if not arg: continue
+            if arg.flags == ErrorMode: continue
+            if arg.mode in (OutMode, InOutMode):
+                fmt = fmt + arg.mkvalueFormat()
+                lst = lst + sep + arg.mkvalueArgs()
+        if fmt == "":
+            Output("Py_INCREF(Py_None);")
+            Output("_res = Py_None;");
+        else:
+            Output("_res = Py_BuildValue(\"%s\"%s);", fmt, lst)
+        tmp = self.argumentList[:]
+        tmp.reverse()
+        for arg in tmp:
+            if not arg: continue
+            arg.cleanup()
+        Output("return _res;")
 
 
 class MethodGenerator(FunctionGenerator):
 
-	def parseArgumentList(self, args):
-		a0, args = args[0], args[1:]
-		t0, n0, m0 = a0
-		if m0 != InMode:
-			raise ValueError, "method's 'self' must be 'InMode'"
-		self.itself = Variable(t0, "_self->ob_itself", SelfMode)
-		self.argumentList.append(self.itself)
-		FunctionGenerator.parseArgumentList(self, args)
+    def parseArgumentList(self, args):
+        a0, args = args[0], args[1:]
+        t0, n0, m0 = a0
+        if m0 != InMode:
+            raise ValueError, "method's 'self' must be 'InMode'"
+        self.itself = Variable(t0, "_self->ob_itself", SelfMode)
+        self.argumentList.append(self.itself)
+        FunctionGenerator.parseArgumentList(self, args)
 
 
 def _test():
-	void = None
-	eggs = FunctionGenerator(void, "eggs",
-				 (stringptr, 'cmd', InMode),
-				 (int, 'x', InMode),
-				 (double, 'y', InOutMode),
-				 (int, 'status', ErrorMode),
-				 )
-	eggs.setprefix("spam")
-	print "/* START */"
-	eggs.generate()
+    void = None
+    eggs = FunctionGenerator(void, "eggs",
+                 (stringptr, 'cmd', InMode),
+                 (int, 'x', InMode),
+                 (double, 'y', InOutMode),
+                 (int, 'status', ErrorMode),
+                 )
+    eggs.setprefix("spam")
+    print "/* START */"
+    eggs.generate()
 
 
 if __name__ == "__main__":
-	_test()
+    _test()
diff --git a/Tools/bgen/bgen/bgenGeneratorGroup.py b/Tools/bgen/bgen/bgenGeneratorGroup.py
index 784bf69..d82ab53 100644
--- a/Tools/bgen/bgen/bgenGeneratorGroup.py
+++ b/Tools/bgen/bgen/bgenGeneratorGroup.py
@@ -2,39 +2,39 @@
 
 class GeneratorGroup:
 
-	def __init__(self, prefix):
-		self.prefix = prefix
-		self.generators = []
+    def __init__(self, prefix):
+        self.prefix = prefix
+        self.generators = []
 
-	def add(self, g, dupcheck=0):
-		if dupcheck:
-			if g in self.generators:
-				print 'DUP', g.name
-				return
-		g.setprefix(self.prefix)
-		self.generators.append(g)
+    def add(self, g, dupcheck=0):
+        if dupcheck:
+            if g in self.generators:
+                print 'DUP', g.name
+                return
+        g.setprefix(self.prefix)
+        self.generators.append(g)
 
-	def generate(self):
-		for g in self.generators:
-			g.generate()
-		Output()
-		Output("static PyMethodDef %s_methods[] = {", self.prefix)
-		IndentLevel()
-		for g in self.generators:
-			g.reference()
-		Output("{NULL, NULL, 0}")
-		DedentLevel()
-		Output("};")
+    def generate(self):
+        for g in self.generators:
+            g.generate()
+        Output()
+        Output("static PyMethodDef %s_methods[] = {", self.prefix)
+        IndentLevel()
+        for g in self.generators:
+            g.reference()
+        Output("{NULL, NULL, 0}")
+        DedentLevel()
+        Output("};")
 
 
 def _test():
-	void = None
-	from bgenGenerator import FunctionGenerator
-	group = GeneratorGroup("spam")
-	eggs = FunctionGenerator(void, "eggs")
-	group.add(eggs)
-	print "/* START */"
-	group.generate()
+    void = None
+    from bgenGenerator import FunctionGenerator
+    group = GeneratorGroup("spam")
+    eggs = FunctionGenerator(void, "eggs")
+    group.add(eggs)
+    print "/* START */"
+    group.generate()
 
 if __name__ == "__main__":
-	_test()
+    _test()
diff --git a/Tools/bgen/bgen/bgenHeapBuffer.py b/Tools/bgen/bgen/bgenHeapBuffer.py
index 1b16d55..9bfc5a1 100644
--- a/Tools/bgen/bgen/bgenHeapBuffer.py
+++ b/Tools/bgen/bgen/bgenHeapBuffer.py
@@ -7,105 +7,105 @@
 
 class HeapInputOutputBufferType(FixedInputOutputBufferType):
 
-	"""Input-output buffer allocated on the heap -- passed as (inbuffer, outbuffer, size).
+    """Input-output buffer allocated on the heap -- passed as (inbuffer, outbuffer, size).
 
-	Instantiate without parameters.
-	Call from Python with input buffer.
-	"""
+    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 __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 declareOutputBuffer(self, name):
+        Output("%s *%s__out__;", self.datatype, 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 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 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 mkvalueArgs(self, name):
+        return "%s__out__, (int)%s__len__" % (name, name)
 
-	def cleanup(self, name):
-		Output("free(%s__out__);", name)
-		FixedInputOutputBufferType.cleanup(self, 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)
+    """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)
+    """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)
+    """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).
+    """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 "i"
-	
-	def getargsArgs(self, name):
-		return "&%s__in_len__" % name
-	
-	def passOutput(self, name):
-		return "%s__out__, %s__len__" % (name, name)
+    Instantiate without parameters.
+    Call from Python with buffer size.
+    """
+    
+    def declareInputBuffer(self, name):
+        pass
+    
+    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).
+    """Output buffer allocated on the heap -- passed as (buffer, &size).
 
-	Instantiate without parameters.
-	Call from Python with buffer size.
-	"""
+    Instantiate without parameters.
+    Call from Python with buffer size.
+    """
 
-	def passOutput(self, name):
-		return "%s__out__, &%s__len__" % (name, name)
+    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).
+    """Output buffer allocated on the heap -- passed as (buffer, size, &size).
 
-	Instantiate without parameters.
-	Call from Python with buffer size.
-	"""
+    Instantiate without parameters.
+    Call from Python with buffer size.
+    """
 
-	def passOutput(self, name):
-		return "%s__out__, %s__len__, &%s__len__" % (name, name, name)
+    def passOutput(self, name):
+        return "%s__out__, %s__len__, &%s__len__" % (name, name, name)
diff --git a/Tools/bgen/bgen/bgenModule.py b/Tools/bgen/bgen/bgenModule.py
index 1a182a7..3e26b16 100644
--- a/Tools/bgen/bgen/bgenModule.py
+++ b/Tools/bgen/bgen/bgenModule.py
@@ -3,92 +3,92 @@
 
 class Module(GeneratorGroup):
 
-	def __init__(self, name, prefix = None,
-		     includestuff = None,
-		     finalstuff = None,
-		     initstuff = None,
-		     variablestuff = None,
-		     longname = None):
-		GeneratorGroup.__init__(self, prefix or name)
-		self.name = name
-		if longname:
-			self.longname = longname
-		else:
-			self.longname = name
-		self.includestuff = includestuff
-		self.initstuff = initstuff
-		self.finalstuff = finalstuff
-		self.variablestuff = variablestuff
-		self.typeobjects = []
+    def __init__(self, name, prefix = None,
+             includestuff = None,
+             finalstuff = None,
+             initstuff = None,
+             variablestuff = None,
+             longname = None):
+        GeneratorGroup.__init__(self, prefix or name)
+        self.name = name
+        if longname:
+            self.longname = longname
+        else:
+            self.longname = name
+        self.includestuff = includestuff
+        self.initstuff = initstuff
+        self.finalstuff = finalstuff
+        self.variablestuff = variablestuff
+        self.typeobjects = []
 
-	def addobject(self, od):
-		self.generators.append(od)
-		self.typeobjects.append(od)
-		od.setmodulename(self.longname)
+    def addobject(self, od):
+        self.generators.append(od)
+        self.typeobjects.append(od)
+        od.setmodulename(self.longname)
 
-	def generate(self):
-		OutHeader1("Module " + self.name)
-		Output("#include \"Python.h\"")
-		Output()
+    def generate(self):
+        OutHeader1("Module " + self.name)
+        Output("#include \"Python.h\"")
+        Output()
 
-		if self.includestuff:
-			Output()
-			Output("%s", self.includestuff)
+        if self.includestuff:
+            Output()
+            Output("%s", self.includestuff)
 
-		self.declareModuleVariables()
+        self.declareModuleVariables()
 
-		GeneratorGroup.generate(self)
-		
-		if self.finalstuff:
-			Output()
-			Output("%s", self.finalstuff)
+        GeneratorGroup.generate(self)
+        
+        if self.finalstuff:
+            Output()
+            Output("%s", self.finalstuff)
 
-		Output()
-		Output("void init%s(void)", self.name)
-		OutLbrace()
-		Output("PyObject *m;")
-		Output("PyObject *d;")
-		Output()
+        Output()
+        Output("void init%s(void)", self.name)
+        OutLbrace()
+        Output("PyObject *m;")
+        Output("PyObject *d;")
+        Output()
 
-		if self.initstuff:
-			Output("%s", self.initstuff)
-			Output()
+        if self.initstuff:
+            Output("%s", self.initstuff)
+            Output()
 
-		Output("m = Py_InitModule(\"%s\", %s_methods);",
-		       self.name, self.prefix)
-		Output("d = PyModule_GetDict(m);")
-		self.createModuleVariables()
-		OutRbrace()
-		OutHeader1("End module " + self.name)
+        Output("m = Py_InitModule(\"%s\", %s_methods);",
+               self.name, self.prefix)
+        Output("d = PyModule_GetDict(m);")
+        self.createModuleVariables()
+        OutRbrace()
+        OutHeader1("End module " + self.name)
 
-	def declareModuleVariables(self):
-		self.errorname = self.prefix + "_Error"
-		Output("static PyObject *%s;", self.errorname)
+    def declareModuleVariables(self):
+        self.errorname = self.prefix + "_Error"
+        Output("static PyObject *%s;", self.errorname)
 
-	def createModuleVariables(self):
-		Output("""%s = %s;""", self.errorname, self.exceptionInitializer())
-		Output("""if (%s == NULL ||""", self.errorname)
-		Output("""    PyDict_SetItemString(d, "Error", %s) != 0)""",
-		                                               self.errorname)
-		IndentLevel()
-		Output("""return;""")
-		DedentLevel()
-		for tp in self.typeobjects:
-			tp.outputTypeObjectInitializer()
-		if self.variablestuff:
-			Output("%s", self.variablestuff)
-			Output()
+    def createModuleVariables(self):
+        Output("""%s = %s;""", self.errorname, self.exceptionInitializer())
+        Output("""if (%s == NULL ||""", self.errorname)
+        Output("""    PyDict_SetItemString(d, "Error", %s) != 0)""",
+                                                       self.errorname)
+        IndentLevel()
+        Output("""return;""")
+        DedentLevel()
+        for tp in self.typeobjects:
+            tp.outputTypeObjectInitializer()
+        if self.variablestuff:
+            Output("%s", self.variablestuff)
+            Output()
 
-	def exceptionInitializer(self):
-		return """PyErr_NewException("%s.Error", NULL, NULL)""" % self.name
+    def exceptionInitializer(self):
+        return """PyErr_NewException("%s.Error", NULL, NULL)""" % self.name
 
 
 def _test():
-	from bgenGenerator import FunctionGenerator
-	m = Module("spam", "", "#include <stdio.h>")
-	g = FunctionGenerator(None, "bacon")
-	m.add(g)
-	m.generate()
+    from bgenGenerator import FunctionGenerator
+    m = Module("spam", "", "#include <stdio.h>")
+    g = FunctionGenerator(None, "bacon")
+    m.add(g)
+    m.generate()
 
 if __name__ == "__main__":
-	_test()
+    _test()
diff --git a/Tools/bgen/bgen/bgenObjectDefinition.py b/Tools/bgen/bgen/bgenObjectDefinition.py
index 986b407..40435ad 100644
--- a/Tools/bgen/bgen/bgenObjectDefinition.py
+++ b/Tools/bgen/bgen/bgenObjectDefinition.py
@@ -2,485 +2,485 @@
 from bgenGeneratorGroup import GeneratorGroup
 
 class ObjectDefinition(GeneratorGroup):
-	"Spit out code that together defines a new Python object type"
-	basechain = "NULL"
-	tp_flags = "Py_TPFLAGS_DEFAULT"
-	basetype = None
+    "Spit out code that together defines a new Python object type"
+    basechain = "NULL"
+    tp_flags = "Py_TPFLAGS_DEFAULT"
+    basetype = None
 
-	def __init__(self, name, prefix, itselftype):
-		"""ObjectDefinition constructor.  May be extended, but do not override.
-		
-		- name: the object's official name, e.g. 'SndChannel'.
-		- prefix: the prefix used for the object's functions and data, e.g. 'SndCh'.
-		- itselftype: the C type actually contained in the object, e.g. 'SndChannelPtr'.
-		
-		XXX For official Python data types, rules for the 'Py' prefix are a problem.
-		"""
-		
-		GeneratorGroup.__init__(self, prefix or name)
-		self.name = name
-		self.itselftype = itselftype
-		self.objecttype = name + 'Object'
-		self.typename = name + '_Type'
-		self.argref = ""	# set to "*" if arg to <type>_New should be pointer
-		self.static = "static " # set to "" to make <type>_New and <type>_Convert public
-		self.modulename = None
-		if hasattr(self, "assertions"):
-			self.assertions()
+    def __init__(self, name, prefix, itselftype):
+        """ObjectDefinition constructor.  May be extended, but do not override.
+        
+        - name: the object's official name, e.g. 'SndChannel'.
+        - prefix: the prefix used for the object's functions and data, e.g. 'SndCh'.
+        - itselftype: the C type actually contained in the object, e.g. 'SndChannelPtr'.
+        
+        XXX For official Python data types, rules for the 'Py' prefix are a problem.
+        """
+        
+        GeneratorGroup.__init__(self, prefix or name)
+        self.name = name
+        self.itselftype = itselftype
+        self.objecttype = name + 'Object'
+        self.typename = name + '_Type'
+        self.argref = ""    # set to "*" if arg to <type>_New should be pointer
+        self.static = "static " # set to "" to make <type>_New and <type>_Convert public
+        self.modulename = None
+        if hasattr(self, "assertions"):
+            self.assertions()
 
-	def add(self, g, dupcheck=0):
-		g.setselftype(self.objecttype, self.itselftype)
-		GeneratorGroup.add(self, g, dupcheck)
+    def add(self, g, dupcheck=0):
+        g.setselftype(self.objecttype, self.itselftype)
+        GeneratorGroup.add(self, g, dupcheck)
 
-	def reference(self):
-		# In case we are referenced from a module
-		pass
-		
-	def setmodulename(self, name):
-		self.modulename = name
+    def reference(self):
+        # In case we are referenced from a module
+        pass
+        
+    def setmodulename(self, name):
+        self.modulename = name
 
-	def generate(self):
-		# XXX This should use long strings and %(varname)s substitution!
+    def generate(self):
+        # XXX This should use long strings and %(varname)s substitution!
 
-		OutHeader2("Object type " + self.name)
+        OutHeader2("Object type " + self.name)
 
-		sf = self.static and "static "
-		Output("%sPyTypeObject %s;", sf, self.typename)
-		Output()
-		Output("#define %s_Check(x) ((x)->ob_type == &%s || PyObject_TypeCheck((x), &%s))",
-		       self.prefix, self.typename, self.typename)
-		Output()
-		Output("typedef struct %s {", self.objecttype)
-		IndentLevel()
-		Output("PyObject_HEAD")
-		self.outputStructMembers()
-		DedentLevel()
-		Output("} %s;", self.objecttype)
+        sf = self.static and "static "
+        Output("%sPyTypeObject %s;", sf, self.typename)
+        Output()
+        Output("#define %s_Check(x) ((x)->ob_type == &%s || PyObject_TypeCheck((x), &%s))",
+               self.prefix, self.typename, self.typename)
+        Output()
+        Output("typedef struct %s {", self.objecttype)
+        IndentLevel()
+        Output("PyObject_HEAD")
+        self.outputStructMembers()
+        DedentLevel()
+        Output("} %s;", self.objecttype)
 
-		self.outputNew()
-		
-		self.outputConvert()
+        self.outputNew()
+        
+        self.outputConvert()
 
-		self.outputDealloc()
+        self.outputDealloc()
 
-		GeneratorGroup.generate(self)
+        GeneratorGroup.generate(self)
 
-		Output()
-		self.outputMethodChain()
+        Output()
+        self.outputMethodChain()
 
-		self.outputGetattr()
+        self.outputGetattr()
 
-		self.outputSetattr()
-		
-		self.outputCompare()
-		
-		self.outputRepr()
-		
-		self.outputHash()
-		
-		self.outputPEP253Hooks()
-		
-		self.outputTypeObject()
+        self.outputSetattr()
+        
+        self.outputCompare()
+        
+        self.outputRepr()
+        
+        self.outputHash()
+        
+        self.outputPEP253Hooks()
+        
+        self.outputTypeObject()
 
-		OutHeader2("End object type " + self.name)
-		
-	def outputMethodChain(self):
-		Output("%sPyMethodChain %s_chain = { %s_methods, %s };",
-		        self.static,    self.prefix, self.prefix, self.basechain)
+        OutHeader2("End object type " + self.name)
+        
+    def outputMethodChain(self):
+        Output("%sPyMethodChain %s_chain = { %s_methods, %s };",
+                self.static,    self.prefix, self.prefix, self.basechain)
 
-	def outputStructMembers(self):
-		Output("%s ob_itself;", self.itselftype)
+    def outputStructMembers(self):
+        Output("%s ob_itself;", self.itselftype)
 
-	def outputNew(self):
-		Output()
-		Output("%sPyObject *%s_New(%s %sitself)", self.static, self.prefix,
-				self.itselftype, self.argref)
-		OutLbrace()
-		Output("%s *it;", self.objecttype)
-		self.outputCheckNewArg()
-		Output("it = PyObject_NEW(%s, &%s);", self.objecttype, self.typename)
-		Output("if (it == NULL) return NULL;")
-		if self.basetype:
-			Output("/* XXXX Should we tp_init or tp_new our basetype? */")
-		self.outputInitStructMembers()
-		Output("return (PyObject *)it;")
-		OutRbrace()
+    def outputNew(self):
+        Output()
+        Output("%sPyObject *%s_New(%s %sitself)", self.static, self.prefix,
+                self.itselftype, self.argref)
+        OutLbrace()
+        Output("%s *it;", self.objecttype)
+        self.outputCheckNewArg()
+        Output("it = PyObject_NEW(%s, &%s);", self.objecttype, self.typename)
+        Output("if (it == NULL) return NULL;")
+        if self.basetype:
+            Output("/* XXXX Should we tp_init or tp_new our basetype? */")
+        self.outputInitStructMembers()
+        Output("return (PyObject *)it;")
+        OutRbrace()
 
-	def outputInitStructMembers(self):
-		Output("it->ob_itself = %sitself;", self.argref)
-	
-	def outputCheckNewArg(self):
-			"Override this method to apply additional checks/conversions"
-	
-	def outputConvert(self):
-		Output("%sint %s_Convert(PyObject *v, %s *p_itself)", self.static, self.prefix,
-				self.itselftype)
-		OutLbrace()
-		self.outputCheckConvertArg()
-		Output("if (!%s_Check(v))", self.prefix)
-		OutLbrace()
-		Output('PyErr_SetString(PyExc_TypeError, "%s required");', self.name)
-		Output("return 0;")
-		OutRbrace()
-		Output("*p_itself = ((%s *)v)->ob_itself;", self.objecttype)
-		Output("return 1;")
-		OutRbrace()
+    def outputInitStructMembers(self):
+        Output("it->ob_itself = %sitself;", self.argref)
+    
+    def outputCheckNewArg(self):
+            "Override this method to apply additional checks/conversions"
+    
+    def outputConvert(self):
+        Output("%sint %s_Convert(PyObject *v, %s *p_itself)", self.static, self.prefix,
+                self.itselftype)
+        OutLbrace()
+        self.outputCheckConvertArg()
+        Output("if (!%s_Check(v))", self.prefix)
+        OutLbrace()
+        Output('PyErr_SetString(PyExc_TypeError, "%s required");', self.name)
+        Output("return 0;")
+        OutRbrace()
+        Output("*p_itself = ((%s *)v)->ob_itself;", self.objecttype)
+        Output("return 1;")
+        OutRbrace()
 
-	def outputCheckConvertArg(self):
-		"Override this method to apply additional conversions"
+    def outputCheckConvertArg(self):
+        "Override this method to apply additional conversions"
 
-	def outputDealloc(self):
-		Output()
-		Output("static void %s_dealloc(%s *self)", self.prefix, self.objecttype)
-		OutLbrace()
-		self.outputCleanupStructMembers()
-		if self.basetype:
-			Output("%s.tp_dealloc(self)", self.basetype)
-		elif hasattr(self, 'output_tp_free'):
-			# This is a new-style object with tp_free slot
-			Output("self->ob_type->tp_free((PyObject *)self);")
-		else:
-			Output("PyObject_Free((PyObject *)self);")
-		OutRbrace()
+    def outputDealloc(self):
+        Output()
+        Output("static void %s_dealloc(%s *self)", self.prefix, self.objecttype)
+        OutLbrace()
+        self.outputCleanupStructMembers()
+        if self.basetype:
+            Output("%s.tp_dealloc(self)", self.basetype)
+        elif hasattr(self, 'output_tp_free'):
+            # This is a new-style object with tp_free slot
+            Output("self->ob_type->tp_free((PyObject *)self);")
+        else:
+            Output("PyObject_Free((PyObject *)self);")
+        OutRbrace()
 
-	def outputCleanupStructMembers(self):
-		self.outputFreeIt("self->ob_itself")
+    def outputCleanupStructMembers(self):
+        self.outputFreeIt("self->ob_itself")
 
-	def outputFreeIt(self, name):
-		Output("/* Cleanup of %s goes here */", name)
+    def outputFreeIt(self, name):
+        Output("/* Cleanup of %s goes here */", name)
 
-	def outputGetattr(self):
-		Output()
-		Output("static PyObject *%s_getattr(%s *self, char *name)", self.prefix, self.objecttype)
-		OutLbrace()
-		self.outputGetattrBody()
-		OutRbrace()
+    def outputGetattr(self):
+        Output()
+        Output("static PyObject *%s_getattr(%s *self, char *name)", self.prefix, self.objecttype)
+        OutLbrace()
+        self.outputGetattrBody()
+        OutRbrace()
 
-	def outputGetattrBody(self):
-		self.outputGetattrHook()
-		Output("return Py_FindMethodInChain(&%s_chain, (PyObject *)self, name);",
-		       self.prefix)
+    def outputGetattrBody(self):
+        self.outputGetattrHook()
+        Output("return Py_FindMethodInChain(&%s_chain, (PyObject *)self, name);",
+               self.prefix)
 
-	def outputGetattrHook(self):
-		pass
+    def outputGetattrHook(self):
+        pass
 
-	def outputSetattr(self):
-		Output()
-		Output("#define %s_setattr NULL", self.prefix)
+    def outputSetattr(self):
+        Output()
+        Output("#define %s_setattr NULL", self.prefix)
 
-	def outputCompare(self):
-		Output()
-		Output("#define %s_compare NULL", self.prefix)
+    def outputCompare(self):
+        Output()
+        Output("#define %s_compare NULL", self.prefix)
 
-	def outputRepr(self):
-		Output()
-		Output("#define %s_repr NULL", self.prefix)
+    def outputRepr(self):
+        Output()
+        Output("#define %s_repr NULL", self.prefix)
 
-	def outputHash(self):
-		Output()
-		Output("#define %s_hash NULL", self.prefix)
+    def outputHash(self):
+        Output()
+        Output("#define %s_hash NULL", self.prefix)
 
-	def outputTypeObject(self):
-		sf = self.static and "static "
-		Output()
-		Output("%sPyTypeObject %s = {", sf, self.typename)
-		IndentLevel()
-		Output("PyObject_HEAD_INIT(NULL)")
-		Output("0, /*ob_size*/")
-		if self.modulename:
-			Output("\"%s.%s\", /*tp_name*/", self.modulename, self.name)
-		else:
-			Output("\"%s\", /*tp_name*/", self.name)
-		Output("sizeof(%s), /*tp_basicsize*/", self.objecttype)
-		Output("0, /*tp_itemsize*/")
-		Output("/* methods */")
-		Output("(destructor) %s_dealloc, /*tp_dealloc*/", self.prefix)
-		Output("0, /*tp_print*/")
-		Output("(getattrfunc) %s_getattr, /*tp_getattr*/", self.prefix)
-		Output("(setattrfunc) %s_setattr, /*tp_setattr*/", self.prefix)
-		Output("(cmpfunc) %s_compare, /*tp_compare*/", self.prefix)
-		Output("(reprfunc) %s_repr, /*tp_repr*/", self.prefix)
-		Output("(PyNumberMethods *)0, /* tp_as_number */")
-		Output("(PySequenceMethods *)0, /* tp_as_sequence */")
-		Output("(PyMappingMethods *)0, /* tp_as_mapping */")
-		Output("(hashfunc) %s_hash, /*tp_hash*/", self.prefix)
-		DedentLevel()
-		Output("};")
-		
-	def outputTypeObjectInitializer(self):
-		Output("""%s.ob_type = &PyType_Type;""", self.typename)
-		if self.basetype:
-			Output("%s.tp_base = %s;", self.typename, self.basetype)
-		Output("if (PyType_Ready(&%s) < 0) return;", self.typename)
-		Output("""Py_INCREF(&%s);""", self.typename)
-		Output("PyModule_AddObject(m, \"%s\", (PyObject *)&%s);", self.name, self.typename);
-		Output("/* Backward-compatible name */")
-		Output("""Py_INCREF(&%s);""", self.typename);
-		Output("PyModule_AddObject(m, \"%sType\", (PyObject *)&%s);", self.name, self.typename);
+    def outputTypeObject(self):
+        sf = self.static and "static "
+        Output()
+        Output("%sPyTypeObject %s = {", sf, self.typename)
+        IndentLevel()
+        Output("PyObject_HEAD_INIT(NULL)")
+        Output("0, /*ob_size*/")
+        if self.modulename:
+            Output("\"%s.%s\", /*tp_name*/", self.modulename, self.name)
+        else:
+            Output("\"%s\", /*tp_name*/", self.name)
+        Output("sizeof(%s), /*tp_basicsize*/", self.objecttype)
+        Output("0, /*tp_itemsize*/")
+        Output("/* methods */")
+        Output("(destructor) %s_dealloc, /*tp_dealloc*/", self.prefix)
+        Output("0, /*tp_print*/")
+        Output("(getattrfunc) %s_getattr, /*tp_getattr*/", self.prefix)
+        Output("(setattrfunc) %s_setattr, /*tp_setattr*/", self.prefix)
+        Output("(cmpfunc) %s_compare, /*tp_compare*/", self.prefix)
+        Output("(reprfunc) %s_repr, /*tp_repr*/", self.prefix)
+        Output("(PyNumberMethods *)0, /* tp_as_number */")
+        Output("(PySequenceMethods *)0, /* tp_as_sequence */")
+        Output("(PyMappingMethods *)0, /* tp_as_mapping */")
+        Output("(hashfunc) %s_hash, /*tp_hash*/", self.prefix)
+        DedentLevel()
+        Output("};")
+        
+    def outputTypeObjectInitializer(self):
+        Output("""%s.ob_type = &PyType_Type;""", self.typename)
+        if self.basetype:
+            Output("%s.tp_base = %s;", self.typename, self.basetype)
+        Output("if (PyType_Ready(&%s) < 0) return;", self.typename)
+        Output("""Py_INCREF(&%s);""", self.typename)
+        Output("PyModule_AddObject(m, \"%s\", (PyObject *)&%s);", self.name, self.typename);
+        Output("/* Backward-compatible name */")
+        Output("""Py_INCREF(&%s);""", self.typename);
+        Output("PyModule_AddObject(m, \"%sType\", (PyObject *)&%s);", self.name, self.typename);
 
-	def outputPEP253Hooks(self):
-		pass
-		
+    def outputPEP253Hooks(self):
+        pass
+        
 class PEP252Mixin:
-	getsetlist = []
-	
-	def assertions(self):
-		# Check that various things aren't overridden. If they are it could
-		# signify a bgen-client that has been partially converted to PEP252.
-		assert self.outputGetattr.im_func == PEP252Mixin.outputGetattr.im_func
-		assert self.outputSetattr.im_func == PEP252Mixin.outputSetattr.im_func
-		assert self.outputGetattrBody == None
-		assert self.outputGetattrHook == None
-		assert self.basechain == "NULL"
-		
-	def outputGetattr(self):
-		pass
-		
-	outputGetattrBody = None
+    getsetlist = []
+    
+    def assertions(self):
+        # Check that various things aren't overridden. If they are it could
+        # signify a bgen-client that has been partially converted to PEP252.
+        assert self.outputGetattr.im_func == PEP252Mixin.outputGetattr.im_func
+        assert self.outputSetattr.im_func == PEP252Mixin.outputSetattr.im_func
+        assert self.outputGetattrBody == None
+        assert self.outputGetattrHook == None
+        assert self.basechain == "NULL"
+        
+    def outputGetattr(self):
+        pass
+        
+    outputGetattrBody = None
 
-	outputGetattrHook = None
+    outputGetattrHook = None
 
-	def outputSetattr(self):
-		pass
-	
-	def outputMethodChain(self):
-		# This is a good place to output the getters and setters
-		self.outputGetSetList()
-	
-	def outputHook(self, name):
-		methodname = "outputHook_" + name
-		if hasattr(self, methodname):
-			func = getattr(self, methodname)
-			func()
-		else:
-			Output("0, /*%s*/", name)
-	
-	def outputTypeObject(self):
-		sf = self.static and "static "
-		Output()
-		Output("%sPyTypeObject %s = {", sf, self.typename)
-		IndentLevel()
-		Output("PyObject_HEAD_INIT(NULL)")
-		Output("0, /*ob_size*/")
-		if self.modulename:
-			Output("\"%s.%s\", /*tp_name*/", self.modulename, self.name)
-		else:
-			Output("\"%s\", /*tp_name*/", self.name)
-		Output("sizeof(%s), /*tp_basicsize*/", self.objecttype)
-		Output("0, /*tp_itemsize*/")
-		
-		Output("/* methods */")
-		Output("(destructor) %s_dealloc, /*tp_dealloc*/", self.prefix)
-		Output("0, /*tp_print*/")
-		Output("(getattrfunc)0, /*tp_getattr*/")
-		Output("(setattrfunc)0, /*tp_setattr*/")
-		Output("(cmpfunc) %s_compare, /*tp_compare*/", self.prefix)
-		Output("(reprfunc) %s_repr, /*tp_repr*/", self.prefix)
-		
-		Output("(PyNumberMethods *)0, /* tp_as_number */")
-		Output("(PySequenceMethods *)0, /* tp_as_sequence */")
-		Output("(PyMappingMethods *)0, /* tp_as_mapping */")
-		
-		Output("(hashfunc) %s_hash, /*tp_hash*/", self.prefix)
-		self.outputHook("tp_call")
-		Output("0, /*tp_str*/")
-		Output("PyObject_GenericGetAttr, /*tp_getattro*/")
-		Output("PyObject_GenericSetAttr, /*tp_setattro */")
-		
-		self.outputHook("tp_as_buffer")
-		Output("%s, /* tp_flags */", self.tp_flags)
-		self.outputHook("tp_doc")
-		self.outputHook("tp_traverse")
-		self.outputHook("tp_clear")
-		self.outputHook("tp_richcompare")
-		self.outputHook("tp_weaklistoffset")
-		self.outputHook("tp_iter")
-		self.outputHook("tp_iternext")
-		Output("%s_methods, /* tp_methods */", self.prefix)
-		self.outputHook("tp_members")
-		Output("%s_getsetlist, /*tp_getset*/", self.prefix)
-		self.outputHook("tp_base")
-		self.outputHook("tp_dict")
-		self.outputHook("tp_descr_get")
-		self.outputHook("tp_descr_set")
-		self.outputHook("tp_dictoffset")
-		self.outputHook("tp_init")
-		self.outputHook("tp_alloc")
-		self.outputHook("tp_new")
-		self.outputHook("tp_free")
-		DedentLevel()
-		Output("};")
-		
-	def outputGetSetList(self):
-		if self.getsetlist:
-			for name, get, set, doc in self.getsetlist:
-				if get:
-					self.outputGetter(name, get)
-				else:
-					Output("#define %s_get_%s NULL", self.prefix, name)
-					Output()
-				if set:
-					self.outputSetter(name, set)
-				else:
-					Output("#define %s_set_%s NULL", self.prefix, name)
-					Output()
-					
-			Output("static PyGetSetDef %s_getsetlist[] = {", self.prefix)
-			IndentLevel()
-			for name, get, set, doc in self.getsetlist:
-				if doc:
-					doc = '"' + doc + '"'
-				else:
-					doc = "NULL"
-				Output("{\"%s\", (getter)%s_get_%s, (setter)%s_set_%s, %s},", 
-					name, self.prefix, name, self.prefix, name, doc)
-			Output("{NULL, NULL, NULL, NULL},")
-			DedentLevel()
-			Output("};")
-		else:
-			Output("#define %s_getsetlist NULL", self.prefix)
-		Output()
-			
-	def outputGetter(self, name, code):
-		Output("static PyObject *%s_get_%s(%s *self, void *closure)",
-			self.prefix, name, self.objecttype)
-		OutLbrace()
-		Output(code)
-		OutRbrace()
-		Output()
-		
-	def outputSetter(self, name, code):
-		Output("static int %s_set_%s(%s *self, PyObject *v, void *closure)",
-			self.prefix, name, self.objecttype)
-		OutLbrace()
-		Output(code)
-		Output("return 0;")
-		OutRbrace()
-		Output()
-		
+    def outputSetattr(self):
+        pass
+    
+    def outputMethodChain(self):
+        # This is a good place to output the getters and setters
+        self.outputGetSetList()
+    
+    def outputHook(self, name):
+        methodname = "outputHook_" + name
+        if hasattr(self, methodname):
+            func = getattr(self, methodname)
+            func()
+        else:
+            Output("0, /*%s*/", name)
+    
+    def outputTypeObject(self):
+        sf = self.static and "static "
+        Output()
+        Output("%sPyTypeObject %s = {", sf, self.typename)
+        IndentLevel()
+        Output("PyObject_HEAD_INIT(NULL)")
+        Output("0, /*ob_size*/")
+        if self.modulename:
+            Output("\"%s.%s\", /*tp_name*/", self.modulename, self.name)
+        else:
+            Output("\"%s\", /*tp_name*/", self.name)
+        Output("sizeof(%s), /*tp_basicsize*/", self.objecttype)
+        Output("0, /*tp_itemsize*/")
+        
+        Output("/* methods */")
+        Output("(destructor) %s_dealloc, /*tp_dealloc*/", self.prefix)
+        Output("0, /*tp_print*/")
+        Output("(getattrfunc)0, /*tp_getattr*/")
+        Output("(setattrfunc)0, /*tp_setattr*/")
+        Output("(cmpfunc) %s_compare, /*tp_compare*/", self.prefix)
+        Output("(reprfunc) %s_repr, /*tp_repr*/", self.prefix)
+        
+        Output("(PyNumberMethods *)0, /* tp_as_number */")
+        Output("(PySequenceMethods *)0, /* tp_as_sequence */")
+        Output("(PyMappingMethods *)0, /* tp_as_mapping */")
+        
+        Output("(hashfunc) %s_hash, /*tp_hash*/", self.prefix)
+        self.outputHook("tp_call")
+        Output("0, /*tp_str*/")
+        Output("PyObject_GenericGetAttr, /*tp_getattro*/")
+        Output("PyObject_GenericSetAttr, /*tp_setattro */")
+        
+        self.outputHook("tp_as_buffer")
+        Output("%s, /* tp_flags */", self.tp_flags)
+        self.outputHook("tp_doc")
+        self.outputHook("tp_traverse")
+        self.outputHook("tp_clear")
+        self.outputHook("tp_richcompare")
+        self.outputHook("tp_weaklistoffset")
+        self.outputHook("tp_iter")
+        self.outputHook("tp_iternext")
+        Output("%s_methods, /* tp_methods */", self.prefix)
+        self.outputHook("tp_members")
+        Output("%s_getsetlist, /*tp_getset*/", self.prefix)
+        self.outputHook("tp_base")
+        self.outputHook("tp_dict")
+        self.outputHook("tp_descr_get")
+        self.outputHook("tp_descr_set")
+        self.outputHook("tp_dictoffset")
+        self.outputHook("tp_init")
+        self.outputHook("tp_alloc")
+        self.outputHook("tp_new")
+        self.outputHook("tp_free")
+        DedentLevel()
+        Output("};")
+        
+    def outputGetSetList(self):
+        if self.getsetlist:
+            for name, get, set, doc in self.getsetlist:
+                if get:
+                    self.outputGetter(name, get)
+                else:
+                    Output("#define %s_get_%s NULL", self.prefix, name)
+                    Output()
+                if set:
+                    self.outputSetter(name, set)
+                else:
+                    Output("#define %s_set_%s NULL", self.prefix, name)
+                    Output()
+                    
+            Output("static PyGetSetDef %s_getsetlist[] = {", self.prefix)
+            IndentLevel()
+            for name, get, set, doc in self.getsetlist:
+                if doc:
+                    doc = '"' + doc + '"'
+                else:
+                    doc = "NULL"
+                Output("{\"%s\", (getter)%s_get_%s, (setter)%s_set_%s, %s},", 
+                    name, self.prefix, name, self.prefix, name, doc)
+            Output("{NULL, NULL, NULL, NULL},")
+            DedentLevel()
+            Output("};")
+        else:
+            Output("#define %s_getsetlist NULL", self.prefix)
+        Output()
+            
+    def outputGetter(self, name, code):
+        Output("static PyObject *%s_get_%s(%s *self, void *closure)",
+            self.prefix, name, self.objecttype)
+        OutLbrace()
+        Output(code)
+        OutRbrace()
+        Output()
+        
+    def outputSetter(self, name, code):
+        Output("static int %s_set_%s(%s *self, PyObject *v, void *closure)",
+            self.prefix, name, self.objecttype)
+        OutLbrace()
+        Output(code)
+        Output("return 0;")
+        OutRbrace()
+        Output()
+        
 class PEP253Mixin(PEP252Mixin):
-	tp_flags = "Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE"
-	
-	def outputHook_tp_init(self):
-		Output("%s_tp_init, /* tp_init */", self.prefix)
-		
-	def outputHook_tp_alloc(self):
-		Output("%s_tp_alloc, /* tp_alloc */", self.prefix)
-	
-	def outputHook_tp_new(self):
-		Output("%s_tp_new, /* tp_new */", self.prefix)
-		
-	def outputHook_tp_free(self):
-		Output("%s_tp_free, /* tp_free */", self.prefix)
-		
-	output_tp_initBody = None
-	
-	def output_tp_init(self):
-		if self.output_tp_initBody:
-			Output("static int %s_tp_init(PyObject *self, PyObject *args, PyObject *kwds)", self.prefix)
-			OutLbrace()
-			self.output_tp_initBody()
-			OutRbrace()
-		else:
-			Output("#define %s_tp_init 0", self.prefix)
-		Output()
-		
-	output_tp_allocBody = None
-	
-	def output_tp_alloc(self):
-		if self.output_tp_allocBody:
-			Output("static PyObject *%s_tp_alloc(PyTypeObject *type, int nitems)",
-				self.prefix)
-			OutLbrace()
-			self.output_tp_allocBody()
-			OutRbrace()
-		else:
-			Output("#define %s_tp_alloc PyType_GenericAlloc", self.prefix)
-		Output()
-		
-	def output_tp_newBody(self):
-		Output("PyObject *self;");
-		Output("%s itself;", self.itselftype);
-		Output("char *kw[] = {\"itself\", 0};")
-		Output()
-		Output("if (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&\", kw, %s_Convert, &itself)) return NULL;",
-			self.prefix);
-		Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
-		Output("((%s *)self)->ob_itself = itself;", self.objecttype)
-		Output("return self;")
-	
-	def output_tp_new(self):
-		if self.output_tp_newBody:
-			Output("static PyObject *%s_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)", self.prefix)
-			OutLbrace()
-			self.output_tp_newBody()
-			OutRbrace()
-		else:
-			Output("#define %s_tp_new PyType_GenericNew", self.prefix)
-		Output()
-	
-	output_tp_freeBody = None
-	
-	def output_tp_free(self):
-		if self.output_tp_freeBody:
-			Output("static void %s_tp_free(PyObject *self)", self.prefix)
-			OutLbrace()
-			self.output_tp_freeBody()
-			OutRbrace()
-		else:
-			Output("#define %s_tp_free PyObject_Del", self.prefix)
-		Output()
-		
-	def outputPEP253Hooks(self):
-		self.output_tp_init()
-		self.output_tp_alloc()
-		self.output_tp_new()
-		self.output_tp_free()
+    tp_flags = "Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE"
+    
+    def outputHook_tp_init(self):
+        Output("%s_tp_init, /* tp_init */", self.prefix)
+        
+    def outputHook_tp_alloc(self):
+        Output("%s_tp_alloc, /* tp_alloc */", self.prefix)
+    
+    def outputHook_tp_new(self):
+        Output("%s_tp_new, /* tp_new */", self.prefix)
+        
+    def outputHook_tp_free(self):
+        Output("%s_tp_free, /* tp_free */", self.prefix)
+        
+    output_tp_initBody = None
+    
+    def output_tp_init(self):
+        if self.output_tp_initBody:
+            Output("static int %s_tp_init(PyObject *self, PyObject *args, PyObject *kwds)", self.prefix)
+            OutLbrace()
+            self.output_tp_initBody()
+            OutRbrace()
+        else:
+            Output("#define %s_tp_init 0", self.prefix)
+        Output()
+        
+    output_tp_allocBody = None
+    
+    def output_tp_alloc(self):
+        if self.output_tp_allocBody:
+            Output("static PyObject *%s_tp_alloc(PyTypeObject *type, int nitems)",
+                self.prefix)
+            OutLbrace()
+            self.output_tp_allocBody()
+            OutRbrace()
+        else:
+            Output("#define %s_tp_alloc PyType_GenericAlloc", self.prefix)
+        Output()
+        
+    def output_tp_newBody(self):
+        Output("PyObject *self;");
+        Output("%s itself;", self.itselftype);
+        Output("char *kw[] = {\"itself\", 0};")
+        Output()
+        Output("if (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&\", kw, %s_Convert, &itself)) return NULL;",
+            self.prefix);
+        Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
+        Output("((%s *)self)->ob_itself = itself;", self.objecttype)
+        Output("return self;")
+    
+    def output_tp_new(self):
+        if self.output_tp_newBody:
+            Output("static PyObject *%s_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)", self.prefix)
+            OutLbrace()
+            self.output_tp_newBody()
+            OutRbrace()
+        else:
+            Output("#define %s_tp_new PyType_GenericNew", self.prefix)
+        Output()
+    
+    output_tp_freeBody = None
+    
+    def output_tp_free(self):
+        if self.output_tp_freeBody:
+            Output("static void %s_tp_free(PyObject *self)", self.prefix)
+            OutLbrace()
+            self.output_tp_freeBody()
+            OutRbrace()
+        else:
+            Output("#define %s_tp_free PyObject_Del", self.prefix)
+        Output()
+        
+    def outputPEP253Hooks(self):
+        self.output_tp_init()
+        self.output_tp_alloc()
+        self.output_tp_new()
+        self.output_tp_free()
 
 class GlobalObjectDefinition(ObjectDefinition):
-	"""Like ObjectDefinition but exports some parts.
-	
-	XXX Should also somehow generate a .h file for them.
-	"""
+    """Like ObjectDefinition but exports some parts.
+    
+    XXX Should also somehow generate a .h file for them.
+    """
 
-	def __init__(self, name, prefix = None, itselftype = None):
-		ObjectDefinition.__init__(self, name, prefix or name, itselftype or name)
-		self.static = ""
+    def __init__(self, name, prefix = None, itselftype = None):
+        ObjectDefinition.__init__(self, name, prefix or name, itselftype or name)
+        self.static = ""
 
 class ObjectIdentityMixin:
-	"""A mixin class for objects that makes the identity of ob_itself
-	govern comparisons and dictionary lookups. Useful if the C object can
-	be returned by library calls and it is difficult (or impossible) to find
-	the corresponding Python objects. With this you can create Python object
-	wrappers on the fly"""
-	
-	def outputCompare(self):
-		Output()
-		Output("static int %s_compare(%s *self, %s *other)", self.prefix, self.objecttype,
-				self.objecttype)
-		OutLbrace()
-		Output("unsigned long v, w;")
-		Output()
-		Output("if (!%s_Check((PyObject *)other))", self.prefix)
-		OutLbrace()
-		Output("v=(unsigned long)self;")
-		Output("w=(unsigned long)other;")
-		OutRbrace()
-		Output("else")
-		OutLbrace()
-		Output("v=(unsigned long)self->ob_itself;")
-		Output("w=(unsigned long)other->ob_itself;")
-		OutRbrace()
-		Output("if( v < w ) return -1;")
-		Output("if( v > w ) return 1;")
-		Output("return 0;")
-		OutRbrace()
-		
-	def outputHash(self):
-		Output()
-		Output("static long %s_hash(%s *self)", self.prefix, self.objecttype)
-		OutLbrace()
-		Output("return (long)self->ob_itself;")
-		OutRbrace()
-		
+    """A mixin class for objects that makes the identity of ob_itself
+    govern comparisons and dictionary lookups. Useful if the C object can
+    be returned by library calls and it is difficult (or impossible) to find
+    the corresponding Python objects. With this you can create Python object
+    wrappers on the fly"""
+    
+    def outputCompare(self):
+        Output()
+        Output("static int %s_compare(%s *self, %s *other)", self.prefix, self.objecttype,
+                self.objecttype)
+        OutLbrace()
+        Output("unsigned long v, w;")
+        Output()
+        Output("if (!%s_Check((PyObject *)other))", self.prefix)
+        OutLbrace()
+        Output("v=(unsigned long)self;")
+        Output("w=(unsigned long)other;")
+        OutRbrace()
+        Output("else")
+        OutLbrace()
+        Output("v=(unsigned long)self->ob_itself;")
+        Output("w=(unsigned long)other->ob_itself;")
+        OutRbrace()
+        Output("if( v < w ) return -1;")
+        Output("if( v > w ) return 1;")
+        Output("return 0;")
+        OutRbrace()
+        
+    def outputHash(self):
+        Output()
+        Output("static long %s_hash(%s *self)", self.prefix, self.objecttype)
+        OutLbrace()
+        Output("return (long)self->ob_itself;")
+        OutRbrace()
+        
 
diff --git a/Tools/bgen/bgen/bgenOutput.py b/Tools/bgen/bgen/bgenOutput.py
index c7e560c..7ba5de3 100644
--- a/Tools/bgen/bgen/bgenOutput.py
+++ b/Tools/bgen/bgen/bgenOutput.py
@@ -9,211 +9,211 @@
 _NeedClose = 0
 
 def SetOutputFile(file = None, needclose = 0):
-	"""Call this with an open file object to make it the output file.
+    """Call this with an open file object to make it the output file.
 
-	Call it without arguments to close the current file (if necessary)
-	and reset it to sys.stdout.
-	If the second argument is true, the new file will be explicitly closed
-	on a subsequence call.
-	"""
-	global _File, _NeedClose
-	if _NeedClose:
-		tmp = _File
-		_NeedClose = 0
-		_File = None
-		tmp.close()
-	if file is None:
-		import sys
-		file = sys.stdout
-	_File = file
-	_NeedClose = file and needclose
+    Call it without arguments to close the current file (if necessary)
+    and reset it to sys.stdout.
+    If the second argument is true, the new file will be explicitly closed
+    on a subsequence call.
+    """
+    global _File, _NeedClose
+    if _NeedClose:
+        tmp = _File
+        _NeedClose = 0
+        _File = None
+        tmp.close()
+    if file is None:
+        import sys
+        file = sys.stdout
+    _File = file
+    _NeedClose = file and needclose
 
 def SetOutputFileName(filename = None):
-	"""Call this with a filename to make it the output file.
-	
-	Call it without arguments to close the current file (if necessary)
-	and reset it to sys.stdout.
-	"""
-	SetOutputFile()
-	if filename:
-		SetOutputFile(open(filename, 'w'), 1)
+    """Call this with a filename to make it the output file.
+    
+    Call it without arguments to close the current file (if necessary)
+    and reset it to sys.stdout.
+    """
+    SetOutputFile()
+    if filename:
+        SetOutputFile(open(filename, 'w'), 1)
 
-SetOutputFile()	# Initialize _File
+SetOutputFile() # Initialize _File
 
-_Level = 0		# Indentation level
+_Level = 0      # Indentation level
 
 def GetLevel():
-	"""Return the current indentation level."""
-	return _Level
+    """Return the current indentation level."""
+    return _Level
 
 def SetLevel(level):
-	"""Set the current indentation level.
+    """Set the current indentation level.
 
-	This does no type or range checking -- use at own risk.
-	"""
-	global _Level
-	_Level = level
+    This does no type or range checking -- use at own risk.
+    """
+    global _Level
+    _Level = level
 
 def Output(format = "", *args):
-	VaOutput(format, args)
+    VaOutput(format, args)
 
 def VaOutput(format, args):
-	"""Call this with a format string and and argument tuple for the format.
+    """Call this with a format string and and argument tuple for the format.
 
-	A newline is always added.  Each line in the output is indented
-	to the proper indentation level -- even if the result of the
-	format expansion contains embedded newlines.  Exception: lines
-	beginning with '#' are not indented -- these are assumed to be
-	C preprprocessor lines.
-	"""
-	text = format % args
-	if _Level > 0:
-		indent = '\t' * _Level
-		lines = text.split('\n')
-		for i in range(len(lines)):
-			if lines[i] and lines[i][0] != '#':
-				lines[i] = indent + lines[i]
-		text = '\n'.join(lines)
-	_File.write(text + '\n')
+    A newline is always added.  Each line in the output is indented
+    to the proper indentation level -- even if the result of the
+    format expansion contains embedded newlines.  Exception: lines
+    beginning with '#' are not indented -- these are assumed to be
+    C preprprocessor lines.
+    """
+    text = format % args
+    if _Level > 0:
+        indent = '\t' * _Level
+        lines = text.split('\n')
+        for i in range(len(lines)):
+            if lines[i] and lines[i][0] != '#':
+                lines[i] = indent + lines[i]
+        text = '\n'.join(lines)
+    _File.write(text + '\n')
 
 def IndentLevel(by = 1):
-	"""Increment the indentation level by one.
+    """Increment the indentation level by one.
 
-	When called with an argument, adds it to the indentation level.
-	"""
-	global _Level
-	if _Level+by < 0:
-		raise Error, "indentation underflow (internal error)"
-	_Level = _Level + by
+    When called with an argument, adds it to the indentation level.
+    """
+    global _Level
+    if _Level+by < 0:
+        raise Error, "indentation underflow (internal error)"
+    _Level = _Level + by
 
 def DedentLevel(by = 1):
-	"""Decrement the indentation level by one.
+    """Decrement the indentation level by one.
 
-	When called with an argument, subtracts it from the indentation level.
-	"""
-	IndentLevel(-by)
+    When called with an argument, subtracts it from the indentation level.
+    """
+    IndentLevel(-by)
 
 def OutIndent(format = "", *args):
-	"""Combine Output() followed by IndentLevel().
-	
-	If no text is given, acts like lone IndentLevel().
-	"""
-	if format: VaOutput(format, args)
-	IndentLevel()
+    """Combine Output() followed by IndentLevel().
+    
+    If no text is given, acts like lone IndentLevel().
+    """
+    if format: VaOutput(format, args)
+    IndentLevel()
 
 def OutDedent(format = "", *args):
-	"""Combine Output() followed by DedentLevel().
-	
-	If no text is given, acts like loneDedentLevel().
-	"""
-	if format: VaOutput(format, args)
-	DedentLevel()
+    """Combine Output() followed by DedentLevel().
+    
+    If no text is given, acts like loneDedentLevel().
+    """
+    if format: VaOutput(format, args)
+    DedentLevel()
 
 def OutLbrace(format = "", *args):
-	"""Like Output, but add a '{' and increase the indentation level.
-	
-	If no text is given a lone '{' is output.
-	"""
-	if format:
-		format = format + " {"
-	else:
-		format = "{"
-	VaOutput(format, args)
-	IndentLevel()
+    """Like Output, but add a '{' and increase the indentation level.
+    
+    If no text is given a lone '{' is output.
+    """
+    if format:
+        format = format + " {"
+    else:
+        format = "{"
+    VaOutput(format, args)
+    IndentLevel()
 
 def OutRbrace():
-	"""Decrease the indentation level and output a '}' on a line by itself."""
-	DedentLevel()
-	Output("}")
+    """Decrease the indentation level and output a '}' on a line by itself."""
+    DedentLevel()
+    Output("}")
 
 def OutHeader(text, dash):
-	"""Output a header comment using a given dash character."""
-	n = 64 - len(text)
-	Output()
-	Output("/* %s %s %s */", dash * (n/2), text, dash * (n - n/2))
-	Output()
+    """Output a header comment using a given dash character."""
+    n = 64 - len(text)
+    Output()
+    Output("/* %s %s %s */", dash * (n/2), text, dash * (n - n/2))
+    Output()
 
 def OutHeader1(text):
-	"""Output a level 1 header comment (uses '=' dashes)."""
-	OutHeader(text, "=")
+    """Output a level 1 header comment (uses '=' dashes)."""
+    OutHeader(text, "=")
 
 def OutHeader2(text):
-	"""Output a level 2 header comment (uses '-' dashes)."""
-	OutHeader(text, "-")
+    """Output a level 2 header comment (uses '-' dashes)."""
+    OutHeader(text, "-")
 
 def Out(text):
-	"""Output multiline text that's internally indented.
-	
-	Pass this a multiline character string.  The whitespace before the
-	first nonblank line of the string will be subtracted from all lines.
-	The lines are then output using Output(), but without interpretation
-	of formatting (if you need formatting you can do it before the call).
-	Recommended use:
-	
-		Out('''
-			int main(argc, argv)
-				int argc;
-				char *argv;
-			{
-				printf("Hello, world\\n");
-				exit(0);
-			}
-		''')
-	
-	Caveat: the indentation must be consistent -- if you use three tabs
-	in the first line, (up to) three tabs are removed from following lines,
-	but a line beginning with 24 spaces is not trimmed at all.  Don't use
-	this as a feature.
-	"""
-	# (Don't you love using triple quotes *inside* triple quotes? :-)
-	
-	lines = text.split('\n')
-	indent = ""
-	for line in lines:
-		if line.strip():
-			for c in line:
-				if not c.isspace():
-					break
-				indent = indent + c
-			break
-	n = len(indent)
-	for line in lines:
-		if line[:n] == indent:
-			line = line[n:]
-		else:
-			for c in indent:
-				if line[:1] <> c: break
-				line = line[1:]
-		VaOutput("%s", line)
+    """Output multiline text that's internally indented.
+    
+    Pass this a multiline character string.  The whitespace before the
+    first nonblank line of the string will be subtracted from all lines.
+    The lines are then output using Output(), but without interpretation
+    of formatting (if you need formatting you can do it before the call).
+    Recommended use:
+    
+        Out('''
+            int main(argc, argv)
+                int argc;
+                char *argv;
+            {
+                printf("Hello, world\\n");
+                exit(0);
+            }
+        ''')
+    
+    Caveat: the indentation must be consistent -- if you use three tabs
+    in the first line, (up to) three tabs are removed from following lines,
+    but a line beginning with 24 spaces is not trimmed at all.  Don't use
+    this as a feature.
+    """
+    # (Don't you love using triple quotes *inside* triple quotes? :-)
+    
+    lines = text.split('\n')
+    indent = ""
+    for line in lines:
+        if line.strip():
+            for c in line:
+                if not c.isspace():
+                    break
+                indent = indent + c
+            break
+    n = len(indent)
+    for line in lines:
+        if line[:n] == indent:
+            line = line[n:]
+        else:
+            for c in indent:
+                if line[:1] <> c: break
+                line = line[1:]
+        VaOutput("%s", line)
 
 
 def _test():
-	"""Test program.  Run when the module is run as a script."""
-	OutHeader1("test bgenOutput")
-	Out("""
-		#include <Python.h>
-		#include <stdio.h>
-	
-		main(argc, argv)
-			int argc;
-			char **argv;
-		{
-			int i;
-	""")
-	IndentLevel()
-	Output("""\
+    """Test program.  Run when the module is run as a script."""
+    OutHeader1("test bgenOutput")
+    Out("""
+        #include <Python.h>
+        #include <stdio.h>
+    
+        main(argc, argv)
+            int argc;
+            char **argv;
+        {
+            int i;
+    """)
+    IndentLevel()
+    Output("""\
 /* Here are a few comment lines.
    Just to test indenting multiple lines.
 
    End of the comment lines. */
 """)
-	Output("for (i = 0; i < argc; i++)")
-	OutLbrace()
-	Output('printf("argv[%%d] = %%s\\n", i, argv[i]);')
-	OutRbrace()
-	Output("exit(0)")
-	OutRbrace()
-	OutHeader2("end test")
+    Output("for (i = 0; i < argc; i++)")
+    OutLbrace()
+    Output('printf("argv[%%d] = %%s\\n", i, argv[i]);')
+    OutRbrace()
+    Output("exit(0)")
+    OutRbrace()
+    OutHeader2("end test")
 
 if __name__ == '__main__':
-	_test()
+    _test()
diff --git a/Tools/bgen/bgen/bgenStackBuffer.py b/Tools/bgen/bgen/bgenStackBuffer.py
index 1b6350a..9669607 100644
--- a/Tools/bgen/bgen/bgenStackBuffer.py
+++ b/Tools/bgen/bgen/bgenStackBuffer.py
@@ -6,54 +6,54 @@
 
 class StackOutputBufferType(FixedOutputBufferType):
 
-	"""Fixed output buffer allocated on the stack -- passed as (buffer, size).
+    """Fixed output buffer allocated on the stack -- passed as (buffer, size).
 
-	Instantiate with the buffer size as parameter.
-	"""
+    Instantiate with the buffer size as parameter.
+    """
 
-	def passOutput(self, name):
-		return "%s__out__, %s" % (name, self.size)
+    def passOutput(self, name):
+        return "%s__out__, %s" % (name, self.size)
 
 
 class VarStackOutputBufferType(StackOutputBufferType):
 
-	"""Output buffer allocated on the stack -- passed as (buffer, &size).
+    """Output buffer allocated on the stack -- passed as (buffer, &size).
 
-	Instantiate with the buffer size as parameter.
-	"""
+    Instantiate with the buffer size as parameter.
+    """
 
-	def declareSize(self, name):
-		Output("int %s__len__ = %s;", name, self.size)
+    def declareSize(self, name):
+        Output("int %s__len__ = %s;", name, self.size)
 
-	def passOutput(self, name):
-		return "%s__out__, &%s__len__" % (name, name)
+    def passOutput(self, name):
+        return "%s__out__, &%s__len__" % (name, name)
 
-	def mkvalueArgs(self, name):
-		return "%s__out__, (int)%s__len__" % (name, name)
+    def mkvalueArgs(self, name):
+        return "%s__out__, (int)%s__len__" % (name, name)
 
 
 class VarVarStackOutputBufferType(VarStackOutputBufferType):
 
-	"""Output buffer allocated on the stack -- passed as (buffer, size, &size).
+    """Output buffer allocated on the stack -- passed as (buffer, size, &size).
 
-	Instantiate with the buffer size as parameter.
-	"""
+    Instantiate with the buffer size as parameter.
+    """
 
-	def passOutput(self, name):
-		return "%s__out__, %s__len__, &%s__len__" % (name, name, name)
+    def passOutput(self, name):
+        return "%s__out__, %s__len__, &%s__len__" % (name, name, name)
 
 
 class ReturnVarStackOutputBufferType(VarStackOutputBufferType):
 
-	"""Output buffer allocated on the stack -- passed as (buffer, size) -> size.
+    """Output buffer allocated on the stack -- passed as (buffer, size) -> size.
 
-	Instantiate with the buffer size as parameter.
-	The function's return value is the size.
-	(XXX Should have a way to suppress returning it separately, too.)
-	"""
+    Instantiate with the buffer size as parameter.
+    The function's return value is the size.
+    (XXX Should have a way to suppress returning it separately, too.)
+    """
 
-	def passOutput(self, name):
-		return "%s__out__, %s__len__" % (name, name)
+    def passOutput(self, name):
+        return "%s__out__, %s__len__" % (name, name)
 
-	def mkvalueArgs(self, name):
-		return "%s__out__, (int)_rv" % name
+    def mkvalueArgs(self, name):
+        return "%s__out__, (int)_rv" % name
diff --git a/Tools/bgen/bgen/bgenStringBuffer.py b/Tools/bgen/bgen/bgenStringBuffer.py
index 7d9c77e..39c8cf9 100644
--- a/Tools/bgen/bgen/bgenStringBuffer.py
+++ b/Tools/bgen/bgen/bgenStringBuffer.py
@@ -8,57 +8,57 @@
 
 class StringBufferMixIn:
 
-	"""Mix-in class to create various string buffer types.
+    """Mix-in class to create various string buffer types.
 
-	Strings are character arrays terminated by a null byte.
-	(For input, this is also covered by stringptr.)
-	For output, there are again three variants:
-	- Fixed: size is a constant given in the documentation; or
-	- Stack: size is passed to the C function but we decide on a size at
-	  code generation time so we can still allocate on the heap); or
-	- Heap: size is passed to the C function and we let the Python caller
-	  pass a size.
-	(Note that this doesn't cover output parameters in which a string
-	pointer is returned.  These are actually easier (no allocation) but far
-	less common.  I'll write the classes when there is demand.)
-	"""
-	
-	def declareSize(self, name):
-		pass
-	
-	def getargsFormat(self):
-		return "s"
-	
-	def getargsArgs(self, name):
-		return "&%s__in__" % name
+    Strings are character arrays terminated by a null byte.
+    (For input, this is also covered by stringptr.)
+    For output, there are again three variants:
+    - Fixed: size is a constant given in the documentation; or
+    - Stack: size is passed to the C function but we decide on a size at
+      code generation time so we can still allocate on the heap); or
+    - Heap: size is passed to the C function and we let the Python caller
+      pass a size.
+    (Note that this doesn't cover output parameters in which a string
+    pointer is returned.  These are actually easier (no allocation) but far
+    less common.  I'll write the classes when there is demand.)
+    """
+    
+    def declareSize(self, name):
+        pass
+    
+    def getargsFormat(self):
+        return "s"
+    
+    def getargsArgs(self, name):
+        return "&%s__in__" % name
 
-	def mkvalueFormat(self):
-		return "s"
+    def mkvalueFormat(self):
+        return "s"
 
-	def mkvalueArgs(self, name):
-		return "%s__out__" % name
+    def mkvalueArgs(self, name):
+        return "%s__out__" % name
 
 
 class FixedOutputStringType(StringBufferMixIn, FixedOutputBufferType):
 
-	"""Null-terminated output string -- passed without size.
+    """Null-terminated output string -- passed without size.
 
-	Instantiate with buffer size as parameter.
-	"""
+    Instantiate with buffer size as parameter.
+    """
 
 
 class StackOutputStringType(StringBufferMixIn, StackOutputBufferType):
 
-	"""Null-terminated output string -- passed as (buffer, size).
+    """Null-terminated output string -- passed as (buffer, size).
 
-	Instantiate with buffer size as parameter.
-	"""
+    Instantiate with buffer size as parameter.
+    """
 
 
 class HeapOutputStringType(StringBufferMixIn, HeapOutputBufferType):
 
-	"""Null-terminated output string -- passed as (buffer, size).
+    """Null-terminated output string -- passed as (buffer, size).
 
-	Instantiate without parameters.
-	Call from Python with buffer size.
-	"""
+    Instantiate without parameters.
+    Call from Python with buffer size.
+    """
diff --git a/Tools/bgen/bgen/bgenType.py b/Tools/bgen/bgen/bgenType.py
index 51f5844..8ac3ac3 100644
--- a/Tools/bgen/bgen/bgenType.py
+++ b/Tools/bgen/bgen/bgenType.py
@@ -6,105 +6,105 @@
 
 class Type:
 
-	"""Define the various things you can do with a C type.
+    """Define the various things you can do with a C type.
 
-	Most methods are intended to be extended or overridden.
-	"""
+    Most methods are intended to be extended or overridden.
+    """
 
-	def __init__(self, typeName, fmt):
-		"""Call with the C name and getargs format for the type.
+    def __init__(self, typeName, fmt):
+        """Call with the C name and getargs format for the type.
 
-		Example: int = Type("int", "i")
-		"""
-		self.typeName = typeName
-		self.fmt = fmt
+        Example: int = Type("int", "i")
+        """
+        self.typeName = typeName
+        self.fmt = fmt
 
-	def declare(self, name):
-		"""Declare a variable of the type with a given name.
+    def declare(self, name):
+        """Declare a variable of the type with a given name.
 
-		Example: int.declare('spam') prints "int spam;"
-		"""
-		Output("%s %s;", self.typeName, name)
+        Example: int.declare('spam') prints "int spam;"
+        """
+        Output("%s %s;", self.typeName, name)
 
-	def getargs(self):
-		return self.getargsFormat(), self.getargsArgs()
+    def getargs(self):
+        return self.getargsFormat(), self.getargsArgs()
 
-	def getargsFormat(self):
-		"""Return the format for this type for use with [new]getargs().
+    def getargsFormat(self):
+        """Return the format for this type for use with [new]getargs().
 
-		Example: int.getargsFormat() returns the string "i".
-		"""
-		return self.fmt
+        Example: int.getargsFormat() returns the string "i".
+        """
+        return self.fmt
 
-	def getargsArgs(self, name):
-		"""Return an argument for use with [new]getargs().
+    def getargsArgs(self, name):
+        """Return an argument for use with [new]getargs().
 
-		Example: int.getargsArgs("spam") returns the string "&spam".
-		"""
-		return "&" + name
+        Example: int.getargsArgs("spam") returns the string "&spam".
+        """
+        return "&" + name
 
-	def getargsCheck(self, name):
-		"""Perform any needed post-[new]getargs() checks.
+    def getargsCheck(self, name):
+        """Perform any needed post-[new]getargs() checks.
 
-		This is type-dependent; the default does not check for errors.
-		An example would be a check for a maximum string length."""
+        This is type-dependent; the default does not check for errors.
+        An example would be a check for a maximum string length."""
 
-	def passInput(self, name):
-		"""Return an argument for passing a variable into a call.
+    def passInput(self, name):
+        """Return an argument for passing a variable into a call.
 
-		Example: int.passInput("spam") returns the string "spam".
-		"""
-		return name
+        Example: int.passInput("spam") returns the string "spam".
+        """
+        return name
 
-	def passOutput(self, name):
-		"""Return an argument for returning a variable out of a call.
+    def passOutput(self, name):
+        """Return an argument for returning a variable out of a call.
 
-		Example: int.passOutput("spam") returns the string "&spam".
-		"""
-		return "&" + name
+        Example: int.passOutput("spam") returns the string "&spam".
+        """
+        return "&" + name
 
-	def errorCheck(self, name):
-		"""Check for an error returned in the variable.
+    def errorCheck(self, name):
+        """Check for an error returned in the variable.
 
-		This is type-dependent; the default does not check for errors.
-		An example would be a check for a NULL pointer.
-		If an error is found, the generated routine should
-		raise an exception and return NULL.
+        This is type-dependent; the default does not check for errors.
+        An example would be a check for a NULL pointer.
+        If an error is found, the generated routine should
+        raise an exception and return NULL.
 
-		XXX There should be a way to add error clean-up code.
-		"""
-		Output("/* XXX no err check for %s %s */", self.typeName, name)
+        XXX There should be a way to add error clean-up code.
+        """
+        Output("/* XXX no err check for %s %s */", self.typeName, name)
 
-	def mkvalue(self):
-		return self.mkvalueFormat(), self.mkvalueArgs()
+    def mkvalue(self):
+        return self.mkvalueFormat(), self.mkvalueArgs()
 
-	def mkvalueFormat(self):
-		"""Return the format for this type for use with mkvalue().
+    def mkvalueFormat(self):
+        """Return the format for this type for use with mkvalue().
 
-		This is normally the same as getargsFormat() but it is
-		a separate function to allow future divergence.
-		"""
-		return self.getargsFormat()
+        This is normally the same as getargsFormat() but it is
+        a separate function to allow future divergence.
+        """
+        return self.getargsFormat()
 
-	def mkvalueArgs(self, name):
-		"""Return an argument for use with mkvalue().
+    def mkvalueArgs(self, name):
+        """Return an argument for use with mkvalue().
 
-		Example: int.mkvalueArgs("spam") returns the string "spam".
-		"""
-		return name
+        Example: int.mkvalueArgs("spam") returns the string "spam".
+        """
+        return name
 
-	def cleanup(self, name):
-		"""Clean up if necessary.
+    def cleanup(self, name):
+        """Clean up if necessary.
 
-		This is normally empty; it may deallocate buffers etc.
-		"""
-		pass
+        This is normally empty; it may deallocate buffers etc.
+        """
+        pass
 
 class ByAddressType(Type):
-	"Simple type that is also passed by address for input"
+    "Simple type that is also passed by address for input"
 
-	def passInput(self, name):
-		return "&%s" % name
+    def passInput(self, name):
+        return "&%s" % name
 
 
 
@@ -112,25 +112,25 @@
 
 class InputOnlyMixIn:
 
-	"Mix-in class to boobytrap passOutput"
+    "Mix-in class to boobytrap passOutput"
 
-	def passOutput(self, name):
-		raise RuntimeError, "Type '%s' can only be used for input parameters" % self.typeName
+    def passOutput(self, name):
+        raise RuntimeError, "Type '%s' can only be used for input parameters" % self.typeName
 
 class InputOnlyType(InputOnlyMixIn, Type):
 
-	"Same as Type, but only usable for input parameters -- passOutput is boobytrapped"
+    "Same as Type, but only usable for input parameters -- passOutput is boobytrapped"
 
 class OutputOnlyMixIn:
 
-	"Mix-in class to boobytrap passInput"
+    "Mix-in class to boobytrap passInput"
 
-	def passInput(self, name):
-		raise RuntimeError, "Type '%s' can only be used for output parameters" % self.typeName
+    def passInput(self, name):
+        raise RuntimeError, "Type '%s' can only be used for output parameters" % self.typeName
 
 class OutputOnlyType(OutputOnlyMixIn, Type):
 
-	"Same as Type, but only usable for output parameters -- passInput is boobytrapped"
+    "Same as Type, but only usable for output parameters -- passInput is boobytrapped"
 
 
 # A modest collection of standard C types.
@@ -160,99 +160,99 @@
 
 class FakeType(InputOnlyType):
 
-	"""A type that is not represented in the Python version of the interface.
+    """A type that is not represented in the Python version of the interface.
 
-	Instantiate with a value to pass in the call.
-	"""
+    Instantiate with a value to pass in the call.
+    """
 
-	def __init__(self, substitute):
-		self.substitute = substitute
-		self.typeName = None	# Don't show this argument in __doc__ string
+    def __init__(self, substitute):
+        self.substitute = substitute
+        self.typeName = None    # Don't show this argument in __doc__ string
 
-	def declare(self, name):
-		pass
+    def declare(self, name):
+        pass
 
-	def getargsFormat(self):
-		return ""
+    def getargsFormat(self):
+        return ""
 
-	def getargsArgs(self, name):
-		return None
+    def getargsArgs(self, name):
+        return None
 
-	def passInput(self, name):
-		return self.substitute
+    def passInput(self, name):
+        return self.substitute
 
 
 class OpaqueType(Type):
 
-	"""A type represented by an opaque object type, always passed by address.
+    """A type represented by an opaque object type, always passed by address.
 
-	Instantiate with the type name and the names of the new and convert procs.
-	If fewer than three arguments are passed, the second argument is used
-	to derive the new and convert procs by appending _New and _Convert; it
-	defaults to the first argument.
-	"""
+    Instantiate with the type name and the names of the new and convert procs.
+    If fewer than three arguments are passed, the second argument is used
+    to derive the new and convert procs by appending _New and _Convert; it
+    defaults to the first argument.
+    """
 
-	def __init__(self, name, arg = None, extra = None):
-		self.typeName = name
-		if extra is None:
-			 # Two arguments (name, usetype) or one (name)
-			arg = arg or name
-			self.new = arg + '_New'
-			self.convert = arg + '_Convert'
-		else:
-			# Three arguments (name, new, convert)
-			self.new = arg 
-			self.convert = extra 
+    def __init__(self, name, arg = None, extra = None):
+        self.typeName = name
+        if extra is None:
+             # Two arguments (name, usetype) or one (name)
+            arg = arg or name
+            self.new = arg + '_New'
+            self.convert = arg + '_Convert'
+        else:
+            # Three arguments (name, new, convert)
+            self.new = arg 
+            self.convert = extra 
 
-	def getargsFormat(self):
-		return "O&"
+    def getargsFormat(self):
+        return "O&"
 
-	def getargsArgs(self, name):
-		return "%s, &%s" % (self.convert, name)
+    def getargsArgs(self, name):
+        return "%s, &%s" % (self.convert, name)
 
-	def passInput(self, name):
-		return "&%s" % name
+    def passInput(self, name):
+        return "&%s" % name
 
-	def mkvalueFormat(self):
-		return "O&"
+    def mkvalueFormat(self):
+        return "O&"
 
-	def mkvalueArgs(self, name):
-		return "%s, &%s" % (self.new, name)
+    def mkvalueArgs(self, name):
+        return "%s, &%s" % (self.new, name)
 
 
 class OpaqueByValueType(OpaqueType):
 
-	"""A type represented by an opaque object type, on input passed BY VALUE.
+    """A type represented by an opaque object type, on input passed BY VALUE.
 
-	Instantiate with the type name, and optionally an object type name whose
-	New/Convert functions will be used.
-	"""
+    Instantiate with the type name, and optionally an object type name whose
+    New/Convert functions will be used.
+    """
 
-	def passInput(self, name):
-		return name
+    def passInput(self, name):
+        return name
 
-	def mkvalueArgs(self, name):
-		return "%s, %s" % (self.new, name)
-		
+    def mkvalueArgs(self, name):
+        return "%s, %s" % (self.new, name)
+        
 class OpaqueByValueStructType(OpaqueByValueType):
-	"""Similar to OpaqueByValueType, but we also pass this to mkvalue by
-	address, in stead of by value.
-	"""
+    """Similar to OpaqueByValueType, but we also pass this to mkvalue by
+    address, in stead of by value.
+    """
 
-	def mkvalueArgs(self, name):
-		return "%s, &%s" % (self.new, name)
+    def mkvalueArgs(self, name):
+        return "%s, &%s" % (self.new, name)
 
 
 class OpaqueArrayType(OpaqueByValueType):
 
-	"""A type represented by an opaque object type, with ARRAY passing semantics.
+    """A type represented by an opaque object type, with ARRAY passing semantics.
 
-	Instantiate with the type name, and optional an object type name whose
-	New/Convert functions will be used.
-	"""
+    Instantiate with the type name, and optional an object type name whose
+    New/Convert functions will be used.
+    """
 
-	def getargsArgs(self, name):
-		return "%s, %s" % (self.convert, name)
+    def getargsArgs(self, name):
+        return "%s, %s" % (self.convert, name)
 
-	def passOutput(self, name):
-		return name
+    def passOutput(self, name):
+        return name
diff --git a/Tools/bgen/bgen/bgenVariable.py b/Tools/bgen/bgen/bgenVariable.py
index 310cc8f..7b947ab 100644
--- a/Tools/bgen/bgen/bgenVariable.py
+++ b/Tools/bgen/bgen/bgenVariable.py
@@ -17,72 +17,72 @@
 
 class Variable:
 
-	"""A Variable holds a type, a name, a transfer mode and flags.
+    """A Variable holds a type, a name, a transfer mode and flags.
 
-	Most of its methods call the correponding type method with the
-	variable name.
-	"""
+    Most of its methods call the correponding type method with the
+    variable name.
+    """
 
-	def __init__(self, type, name = None, flags = InMode):
-		"""Call with a type, a name and flags.
+    def __init__(self, type, name = None, flags = InMode):
+        """Call with a type, a name and flags.
 
-		If name is None, it muse be set later.
-		flags defaults to InMode.
-		"""
-		self.type = type
-		self.name = name
-		self.flags = flags
-		self.mode = flags & ModeMask
+        If name is None, it muse be set later.
+        flags defaults to InMode.
+        """
+        self.type = type
+        self.name = name
+        self.flags = flags
+        self.mode = flags & ModeMask
 
-	def declare(self):
-		"""Declare the variable if necessary.
+    def declare(self):
+        """Declare the variable if necessary.
 
-		If it is "self", it is not declared.
-		"""
-		if self.flags != SelfMode:
-			self.type.declare(self.name)
+        If it is "self", it is not declared.
+        """
+        if self.flags != SelfMode:
+            self.type.declare(self.name)
 
-	def getargsFormat(self):
-		"""Call the type's getargsFormatmethod."""
-		return self.type.getargsFormat()
+    def getargsFormat(self):
+        """Call the type's getargsFormatmethod."""
+        return self.type.getargsFormat()
 
-	def getargsArgs(self):
-		"""Call the type's getargsArgsmethod."""
-		return self.type.getargsArgs(self.name)
+    def getargsArgs(self):
+        """Call the type's getargsArgsmethod."""
+        return self.type.getargsArgs(self.name)
 
-	def getargsCheck(self):
-		return self.type.getargsCheck(self.name)
+    def getargsCheck(self):
+        return self.type.getargsCheck(self.name)
 
-	def passArgument(self):
-		"""Return the string required to pass the variable as argument.
+    def passArgument(self):
+        """Return the string required to pass the variable as argument.
 
-		For "in" arguments, return the variable name.
-		For "out" and "in out" arguments,
-		return its name prefixed with "&".
-		"""
-		if self.mode == InMode:
-			return self.type.passInput(self.name)
-		if self.mode in (OutMode, InOutMode):
-			return self.type.passOutput(self.name)
-		# XXX Shouldn't get here
-		return "/*mode?*/" + self.type.passInput(self.name)
+        For "in" arguments, return the variable name.
+        For "out" and "in out" arguments,
+        return its name prefixed with "&".
+        """
+        if self.mode == InMode:
+            return self.type.passInput(self.name)
+        if self.mode in (OutMode, InOutMode):
+            return self.type.passOutput(self.name)
+        # XXX Shouldn't get here
+        return "/*mode?*/" + self.type.passInput(self.name)
 
-	def errorCheck(self):
-		"""Check for an error if necessary.
+    def errorCheck(self):
+        """Check for an error if necessary.
 
-		This only generates code if the variable's mode is ErrorMode.
-		"""
-		if self.flags == ErrorMode:
-			self.type.errorCheck(self.name)
+        This only generates code if the variable's mode is ErrorMode.
+        """
+        if self.flags == ErrorMode:
+            self.type.errorCheck(self.name)
 
-	def mkvalueFormat (self):
-		"""Call the type's mkvalueFormat method."""
-		return self.type.mkvalueFormat()
+    def mkvalueFormat (self):
+        """Call the type's mkvalueFormat method."""
+        return self.type.mkvalueFormat()
 
-	def mkvalueArgs(self):
-		"""Call the type's mkvalueArgs method."""
-		return self.type.mkvalueArgs(self.name)
+    def mkvalueArgs(self):
+        """Call the type's mkvalueArgs method."""
+        return self.type.mkvalueArgs(self.name)
 
-	def cleanup(self):
-		"""Call the type's cleanup method."""
-		return self.type.cleanup(self.name)
+    def cleanup(self):
+        """Call the type's cleanup method."""
+        return self.type.cleanup(self.name)
diff --git a/Tools/bgen/bgen/macsupport.py b/Tools/bgen/bgen/macsupport.py
index 049354a..b4885ad 100644
--- a/Tools/bgen/bgen/macsupport.py
+++ b/Tools/bgen/bgen/macsupport.py
@@ -52,7 +52,7 @@
 
 # OSType and ResType: 4-byte character strings
 def OSTypeType(typename):
-	return OpaqueByValueType(typename, "PyMac_BuildOSType", "PyMac_GetOSType")
+    return OpaqueByValueType(typename, "PyMac_BuildOSType", "PyMac_GetOSType")
 OSType = OSTypeType("OSType")
 ResType = OSTypeType("ResType")
 FourCharCode = OSTypeType("FourCharCode")
@@ -104,35 +104,35 @@
 # OSErr is special because it is turned into an exception
 # (Could do this with less code using a variant of mkvalue("O&")?)
 class OSErrType(Type):
-	def errorCheck(self, name):
-		Output("if (%s != noErr) return PyMac_Error(%s);", name, name)
-		self.used = 1
+    def errorCheck(self, name):
+        Output("if (%s != noErr) return PyMac_Error(%s);", name, name)
+        self.used = 1
 OSErr = OSErrType("OSErr", 'h')
 OSStatus = OSErrType("OSStatus", 'l')
 
 
 # Various buffer types
 
-InBuffer = VarInputBufferType('char', 'long', 'l')		# (buf, len)
-UcharInBuffer  = VarInputBufferType('unsigned char', 'long', 'l')		# (buf, len)
-OptionalInBuffer = OptionalVarInputBufferType('char', 'long', 'l')		# (buf, len)
+InBuffer = VarInputBufferType('char', 'long', 'l')      # (buf, len)
+UcharInBuffer  = VarInputBufferType('unsigned char', 'long', 'l')       # (buf, len)
+OptionalInBuffer = OptionalVarInputBufferType('char', 'long', 'l')      # (buf, len)
 
-InOutBuffer = HeapInputOutputBufferType('char', 'long', 'l')	# (inbuf, outbuf, len)
+InOutBuffer = HeapInputOutputBufferType('char', 'long', 'l')    # (inbuf, outbuf, len)
 VarInOutBuffer = VarHeapInputOutputBufferType('char', 'long', 'l') # (inbuf, outbuf, &len)
 
-OutBuffer = HeapOutputBufferType('char', 'long', 'l')		# (buf, len)
-VarOutBuffer = VarHeapOutputBufferType('char', 'long', 'l')	# (buf, &len)
+OutBuffer = HeapOutputBufferType('char', 'long', 'l')       # (buf, len)
+VarOutBuffer = VarHeapOutputBufferType('char', 'long', 'l') # (buf, &len)
 VarVarOutBuffer = VarVarHeapOutputBufferType('char', 'long', 'l') # (buf, len, &len)
 
 # Unicode arguments sometimes have reversed len, buffer (don't understand why Apple did this...)
 class VarUnicodeInputBufferType(VarInputBufferType):
 
-	def getargsFormat(self):
-		return "u#"
-		
+    def getargsFormat(self):
+        return "u#"
+        
 class VarUnicodeReverseInputBufferType(ReverseInputBufferMixin, VarUnicodeInputBufferType):
-	pass
-	
+    pass
+    
 UnicodeInBuffer = VarUnicodeInputBufferType('UniChar', 'UniCharCount', 'l')
 UnicodeReverseInBuffer = VarUnicodeReverseInputBufferType('UniChar', 'UniCharCount', 'l')
 UniChar_ptr = InputOnlyType("UniCharPtr", "u")
@@ -151,9 +151,9 @@
 
 /* Macro to test whether a weak-loaded CFM function exists */
 #define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL )  {\\
-    	PyErr_SetString(PyExc_NotImplementedError, \\
-    	"Not available in this shared library/OS version"); \\
-    	return NULL; \\
+        PyErr_SetString(PyExc_NotImplementedError, \\
+        "Not available in this shared library/OS version"); \\
+        return NULL; \\
     }} while(0)
 
 """
@@ -173,23 +173,23 @@
 # This requires that the OSErr type (defined above) has a non-trivial
 # errorCheck method.
 class OSErrMixIn:
-	"Mix-in class to treat OSErr/OSStatus return values special"
-	def makereturnvar(self):
-		if self.returntype.__class__ == OSErrType:
-			return Variable(self.returntype, "_err", ErrorMode)
-		else:
-			return Variable(self.returntype, "_rv", OutMode)
+    "Mix-in class to treat OSErr/OSStatus return values special"
+    def makereturnvar(self):
+        if self.returntype.__class__ == OSErrType:
+            return Variable(self.returntype, "_err", ErrorMode)
+        else:
+            return Variable(self.returntype, "_rv", OutMode)
 
 class OSErrFunctionGenerator(OSErrMixIn, FunctionGenerator): pass
 class OSErrMethodGenerator(OSErrMixIn, MethodGenerator): pass
 
 class WeakLinkMixIn:
-	"Mix-in to test the function actually exists (!= NULL) before calling"
-	
-	def precheck(self):
-		Output('#ifndef %s', self.name)
-		Output('PyMac_PRECHECK(%s);', self.name)
-		Output('#endif')
+    "Mix-in to test the function actually exists (!= NULL) before calling"
+    
+    def precheck(self):
+        Output('#ifndef %s', self.name)
+        Output('PyMac_PRECHECK(%s);', self.name)
+        Output('#endif')
 
 class WeakLinkFunctionGenerator(WeakLinkMixIn, FunctionGenerator): pass
 class WeakLinkMethodGenerator(WeakLinkMixIn, MethodGenerator): pass
@@ -197,14 +197,14 @@
 class OSErrWeakLinkMethodGenerator(OSErrMixIn, WeakLinkMixIn, MethodGenerator): pass
 
 class MacModule(Module):
-	"Subclass which gets the exception initializer from macglue.c"
-	def exceptionInitializer(self):
-		return "PyMac_GetOSErrException()"
+    "Subclass which gets the exception initializer from macglue.c"
+    def exceptionInitializer(self):
+        return "PyMac_GetOSErrException()"
 
 _SetOutputFileName = SetOutputFileName # Save original
 def SetOutputFileName(file = None):
-	"Set the output file name and set its creator&type to CWIE&TEXT"
-	_SetOutputFileName(file)
-	if file:
-		import MacOS
-		MacOS.SetCreatorAndType(file, 'CWIE', 'TEXT')
+    "Set the output file name and set its creator&type to CWIE&TEXT"
+    _SetOutputFileName(file)
+    if file:
+        import MacOS
+        MacOS.SetCreatorAndType(file, 'CWIE', 'TEXT')
diff --git a/Tools/bgen/bgen/scantools.py b/Tools/bgen/bgen/scantools.py
index 61c2f37..b9b6854 100644
--- a/Tools/bgen/bgen/scantools.py
+++ b/Tools/bgen/bgen/scantools.py
@@ -20,650 +20,650 @@
 import fnmatch
 from types import *
 try:
-	import MacOS
+    import MacOS
 except ImportError:
-	MacOS = None
+    MacOS = None
 
 try:
-	from bgenlocations import CREATOR, INCLUDEDIR
+    from bgenlocations import CREATOR, INCLUDEDIR
 except ImportError:
-	CREATOR = None
-	INCLUDEDIR = os.curdir
+    CREATOR = None
+    INCLUDEDIR = os.curdir
 
 Error = "scantools.Error"
 
 class Scanner:
 
-	# Set to 1 in subclass to debug your scanner patterns.
-	debug = 0
+    # Set to 1 in subclass to debug your scanner patterns.
+    debug = 0
 
-	def __init__(self, input = None, output = None, defsoutput = None):
-		self.initsilent()
-		self.initblacklists()
-		self.initrepairinstructions()
-		self.initpaths()
-		self.initfiles()
-		self.initpatterns()
-		self.compilepatterns()
-		self.initosspecifics()
-		self.initusedtypes()
-		if output:
-			self.setoutput(output, defsoutput)
-		if input:
-			self.setinput(input)
-	
-	def initusedtypes(self):
-		self.usedtypes = {}
-	
-	def typeused(self, type, mode):
-		if not self.usedtypes.has_key(type):
-			self.usedtypes[type] = {}
-		self.usedtypes[type][mode] = None
-	
-	def reportusedtypes(self):
-		types = self.usedtypes.keys()
-		types.sort()
-		for type in types:
-			modes = self.usedtypes[type].keys()
-			modes.sort()
-			self.report("%s %s", type, " ".join(modes))
+    def __init__(self, input = None, output = None, defsoutput = None):
+        self.initsilent()
+        self.initblacklists()
+        self.initrepairinstructions()
+        self.initpaths()
+        self.initfiles()
+        self.initpatterns()
+        self.compilepatterns()
+        self.initosspecifics()
+        self.initusedtypes()
+        if output:
+            self.setoutput(output, defsoutput)
+        if input:
+            self.setinput(input)
+    
+    def initusedtypes(self):
+        self.usedtypes = {}
+    
+    def typeused(self, type, mode):
+        if not self.usedtypes.has_key(type):
+            self.usedtypes[type] = {}
+        self.usedtypes[type][mode] = None
+    
+    def reportusedtypes(self):
+        types = self.usedtypes.keys()
+        types.sort()
+        for type in types:
+            modes = self.usedtypes[type].keys()
+            modes.sort()
+            self.report("%s %s", type, " ".join(modes))
 
-	def gentypetest(self, file):
-		fp = open(file, "w")
-		fp.write("types=[\n")
-		types = self.usedtypes.keys()
-		types.sort()
-		for type in types:
-			fp.write("\t'%s',\n"%type)
-		fp.write("]\n")
-		fp.write("""missing=0
+    def gentypetest(self, file):
+        fp = open(file, "w")
+        fp.write("types=[\n")
+        types = self.usedtypes.keys()
+        types.sort()
+        for type in types:
+            fp.write("\t'%s',\n"%type)
+        fp.write("]\n")
+        fp.write("""missing=0
 for t in types:
-	try:
-		tt = eval(t)
-	except NameError:
-		print "** Missing type:", t
-		missing = 1
+    try:
+        tt = eval(t)
+    except NameError:
+        print "** Missing type:", t
+        missing = 1
 if missing: raise "Missing Types"
 """)
-		fp.close()
+        fp.close()
 
-	def initsilent(self):
-		self.silent = 1
+    def initsilent(self):
+        self.silent = 1
 
-	def error(self, format, *args):
-		if self.silent >= 0:
-			print format%args
+    def error(self, format, *args):
+        if self.silent >= 0:
+            print format%args
 
-	def report(self, format, *args):
-		if not self.silent:
-			print format%args
+    def report(self, format, *args):
+        if not self.silent:
+            print format%args
 
-	def writeinitialdefs(self):
-		pass
-		
-	def initblacklists(self):
-		self.blacklistnames = self.makeblacklistnames()
-		self.blacklisttypes = ["unknown", "-"] + self.makeblacklisttypes()
-		self.greydictnames = self.greylist2dict(self.makegreylist())
-		
-	def greylist2dict(self, list):
-		rv = {}
-		for define, namelist in list:
-			for name in namelist:
-				rv[name] = define
-		return rv
+    def writeinitialdefs(self):
+        pass
+        
+    def initblacklists(self):
+        self.blacklistnames = self.makeblacklistnames()
+        self.blacklisttypes = ["unknown", "-"] + self.makeblacklisttypes()
+        self.greydictnames = self.greylist2dict(self.makegreylist())
+        
+    def greylist2dict(self, list):
+        rv = {}
+        for define, namelist in list:
+            for name in namelist:
+                rv[name] = define
+        return rv
 
-	def makeblacklistnames(self):
-		return []
+    def makeblacklistnames(self):
+        return []
 
-	def makeblacklisttypes(self):
-		return []
-		
-	def makegreylist(self):
-		return []
+    def makeblacklisttypes(self):
+        return []
+        
+    def makegreylist(self):
+        return []
 
-	def initrepairinstructions(self):
-		self.repairinstructions = self.makerepairinstructions()
-		self.inherentpointertypes = self.makeinherentpointertypes()
+    def initrepairinstructions(self):
+        self.repairinstructions = self.makerepairinstructions()
+        self.inherentpointertypes = self.makeinherentpointertypes()
 
-	def makerepairinstructions(self):
-		"""Parse the repair file into repair instructions.
-		
-		The file format is simple:
-		1) use \ to split a long logical line in multiple physical lines
-		2) everything after the first # on a line is ignored (as comment)
-		3) empty lines are ignored
-		4) remaining lines must have exactly 3 colon-separated fields:
-		   functionpattern : argumentspattern : argumentsreplacement
-		5) all patterns use shell style pattern matching
-		6) an empty functionpattern means the same as *
-		7) the other two fields are each comma-separated lists of triples
-		8) a triple is a space-separated list of 1-3 words
-		9) a triple with less than 3 words is padded at the end with "*" words
-		10) when used as a pattern, a triple matches the type, name, and mode
-		    of an argument, respectively
-		11) when used as a replacement, the words of a triple specify
-		    replacements for the corresponding words of the argument,
-		    with "*" as a word by itself meaning leave the original word
-		    (no other uses of "*" is allowed)
-		12) the replacement need not have the same number of triples
-		    as the pattern
-		"""
-		f = self.openrepairfile()
-		if not f: return []
-		print "Reading repair file", `f.name`, "..."
-		list = []
-		lineno = 0
-		while 1:
-			line = f.readline()
-			if not line: break
-			lineno = lineno + 1
-			startlineno = lineno
-			while line[-2:] == '\\\n':
-				line = line[:-2] + ' ' + f.readline()
-				lineno = lineno + 1
-			i = line.find('#')
-			if i >= 0: line = line[:i]
-			words = [s.strip() for s in line.split(':')]
-			if words == ['']: continue
-			if len(words) <> 3:
-				print "Line", startlineno,
-				print ": bad line (not 3 colon-separated fields)"
-				print `line`
-				continue
-			[fpat, pat, rep] = words
-			if not fpat: fpat = "*"
-			if not pat:
-				print "Line", startlineno,
-				print "Empty pattern"
-				print `line`
-				continue
-			patparts = [s.strip() for s in pat.split(',')]
-			repparts = [s.strip() for s in rep.split(',')]
-			patterns = []
-			for p in patparts:
-				if not p:
-					print "Line", startlineno,
-					print "Empty pattern part"
-					print `line`
-					continue
-				pattern = p.split()
-				if len(pattern) > 3:
-					print "Line", startlineno,
-					print "Pattern part has > 3 words"
-					print `line`
-					pattern = pattern[:3]
-				else:
-					while len(pattern) < 3:
-						pattern.append("*")
-				patterns.append(pattern)
-			replacements = []
-			for p in repparts:
-				if not p:
-					print "Line", startlineno,
-					print "Empty replacement part"
-					print `line`
-					continue
-				replacement = p.split()
-				if len(replacement) > 3:
-					print "Line", startlineno,
-					print "Pattern part has > 3 words"
-					print `line`
-					replacement = replacement[:3]
-				else:
-					while len(replacement) < 3:
-						replacement.append("*")
-				replacements.append(replacement)
-			list.append((fpat, patterns, replacements))
-		return list
-		
-	def makeinherentpointertypes(self):
-		return []
-	
-	def openrepairfile(self, filename = "REPAIR"):
-		try:
-			return open(filename, "rU")
-		except IOError, msg:
-			print `filename`, ":", msg
-			print "Cannot open repair file -- assume no repair needed"
-			return None
+    def makerepairinstructions(self):
+        """Parse the repair file into repair instructions.
+        
+        The file format is simple:
+        1) use \ to split a long logical line in multiple physical lines
+        2) everything after the first # on a line is ignored (as comment)
+        3) empty lines are ignored
+        4) remaining lines must have exactly 3 colon-separated fields:
+           functionpattern : argumentspattern : argumentsreplacement
+        5) all patterns use shell style pattern matching
+        6) an empty functionpattern means the same as *
+        7) the other two fields are each comma-separated lists of triples
+        8) a triple is a space-separated list of 1-3 words
+        9) a triple with less than 3 words is padded at the end with "*" words
+        10) when used as a pattern, a triple matches the type, name, and mode
+            of an argument, respectively
+        11) when used as a replacement, the words of a triple specify
+            replacements for the corresponding words of the argument,
+            with "*" as a word by itself meaning leave the original word
+            (no other uses of "*" is allowed)
+        12) the replacement need not have the same number of triples
+            as the pattern
+        """
+        f = self.openrepairfile()
+        if not f: return []
+        print "Reading repair file", `f.name`, "..."
+        list = []
+        lineno = 0
+        while 1:
+            line = f.readline()
+            if not line: break
+            lineno = lineno + 1
+            startlineno = lineno
+            while line[-2:] == '\\\n':
+                line = line[:-2] + ' ' + f.readline()
+                lineno = lineno + 1
+            i = line.find('#')
+            if i >= 0: line = line[:i]
+            words = [s.strip() for s in line.split(':')]
+            if words == ['']: continue
+            if len(words) <> 3:
+                print "Line", startlineno,
+                print ": bad line (not 3 colon-separated fields)"
+                print `line`
+                continue
+            [fpat, pat, rep] = words
+            if not fpat: fpat = "*"
+            if not pat:
+                print "Line", startlineno,
+                print "Empty pattern"
+                print `line`
+                continue
+            patparts = [s.strip() for s in pat.split(',')]
+            repparts = [s.strip() for s in rep.split(',')]
+            patterns = []
+            for p in patparts:
+                if not p:
+                    print "Line", startlineno,
+                    print "Empty pattern part"
+                    print `line`
+                    continue
+                pattern = p.split()
+                if len(pattern) > 3:
+                    print "Line", startlineno,
+                    print "Pattern part has > 3 words"
+                    print `line`
+                    pattern = pattern[:3]
+                else:
+                    while len(pattern) < 3:
+                        pattern.append("*")
+                patterns.append(pattern)
+            replacements = []
+            for p in repparts:
+                if not p:
+                    print "Line", startlineno,
+                    print "Empty replacement part"
+                    print `line`
+                    continue
+                replacement = p.split()
+                if len(replacement) > 3:
+                    print "Line", startlineno,
+                    print "Pattern part has > 3 words"
+                    print `line`
+                    replacement = replacement[:3]
+                else:
+                    while len(replacement) < 3:
+                        replacement.append("*")
+                replacements.append(replacement)
+            list.append((fpat, patterns, replacements))
+        return list
+        
+    def makeinherentpointertypes(self):
+        return []
+    
+    def openrepairfile(self, filename = "REPAIR"):
+        try:
+            return open(filename, "rU")
+        except IOError, msg:
+            print `filename`, ":", msg
+            print "Cannot open repair file -- assume no repair needed"
+            return None
 
-	def initfiles(self):
-		self.specmine = 0
-		self.defsmine = 0
-		self.scanmine = 0
-		self.specfile = sys.stdout
-		self.defsfile = None
-		self.scanfile = sys.stdin
-		self.lineno = 0
-		self.line = ""
+    def initfiles(self):
+        self.specmine = 0
+        self.defsmine = 0
+        self.scanmine = 0
+        self.specfile = sys.stdout
+        self.defsfile = None
+        self.scanfile = sys.stdin
+        self.lineno = 0
+        self.line = ""
 
-	def initpaths(self):
-		self.includepath = [os.curdir, INCLUDEDIR]
+    def initpaths(self):
+        self.includepath = [os.curdir, INCLUDEDIR]
 
-	def initpatterns(self):
-		self.head_pat = r"^EXTERN_API[^_]"
-		self.tail_pat = r"[;={}]"
-		self.type_pat = r"EXTERN_API" + \
-						r"[ \t\n]*\([ \t\n]*" + \
-						r"(?P<type>[a-zA-Z0-9_* \t]*[a-zA-Z0-9_*])" + \
-						r"[ \t\n]*\)[ \t\n]*"
-		self.name_pat = r"(?P<name>[a-zA-Z0-9_]+)[ \t\n]*"
-		self.args_pat = r"\((?P<args>([^\(;=\)]+|\([^\(;=\)]*\))*)\)"
-		self.whole_pat = self.type_pat + self.name_pat + self.args_pat
-		self.sym_pat = r"^[ \t]*(?P<name>[a-zA-Z0-9_]+)[ \t]*=" + \
-		               r"[ \t]*(?P<defn>[-0-9_a-zA-Z'\"\(][^\t\n,;}]*),?"
-		self.asplit_pat = r"^(?P<type>.*[^a-zA-Z0-9_])(?P<name>[a-zA-Z0-9_]+)(?P<array>\[\])?$"
-		self.comment1_pat = r"(?P<rest>.*)//.*"
-		# note that the next pattern only removes comments that are wholly within one line
-		self.comment2_pat = r"(?P<rest1>.*)/\*.*\*/(?P<rest2>.*)"
+    def initpatterns(self):
+        self.head_pat = r"^EXTERN_API[^_]"
+        self.tail_pat = r"[;={}]"
+        self.type_pat = r"EXTERN_API" + \
+                        r"[ \t\n]*\([ \t\n]*" + \
+                        r"(?P<type>[a-zA-Z0-9_* \t]*[a-zA-Z0-9_*])" + \
+                        r"[ \t\n]*\)[ \t\n]*"
+        self.name_pat = r"(?P<name>[a-zA-Z0-9_]+)[ \t\n]*"
+        self.args_pat = r"\((?P<args>([^\(;=\)]+|\([^\(;=\)]*\))*)\)"
+        self.whole_pat = self.type_pat + self.name_pat + self.args_pat
+        self.sym_pat = r"^[ \t]*(?P<name>[a-zA-Z0-9_]+)[ \t]*=" + \
+                       r"[ \t]*(?P<defn>[-0-9_a-zA-Z'\"\(][^\t\n,;}]*),?"
+        self.asplit_pat = r"^(?P<type>.*[^a-zA-Z0-9_])(?P<name>[a-zA-Z0-9_]+)(?P<array>\[\])?$"
+        self.comment1_pat = r"(?P<rest>.*)//.*"
+        # note that the next pattern only removes comments that are wholly within one line
+        self.comment2_pat = r"(?P<rest1>.*)/\*.*\*/(?P<rest2>.*)"
 
-	def compilepatterns(self):
-		for name in dir(self):
-			if name[-4:] == "_pat":
-				pat = getattr(self, name)
-				prog = re.compile(pat)
-				setattr(self, name[:-4], prog)
+    def compilepatterns(self):
+        for name in dir(self):
+            if name[-4:] == "_pat":
+                pat = getattr(self, name)
+                prog = re.compile(pat)
+                setattr(self, name[:-4], prog)
 
-	def initosspecifics(self):
-		if MacOS and CREATOR:
-			self.filetype = 'TEXT'
-			self.filecreator = CREATOR
-		else:
-			self.filetype = self.filecreator = None
+    def initosspecifics(self):
+        if MacOS and CREATOR:
+            self.filetype = 'TEXT'
+            self.filecreator = CREATOR
+        else:
+            self.filetype = self.filecreator = None
 
-	def setfiletype(self, filename):
-		if MacOS and (self.filecreator or self.filetype):
-			creator, type = MacOS.GetCreatorAndType(filename)
-			if self.filecreator: creator = self.filecreator
-			if self.filetype: type = self.filetype
-			MacOS.SetCreatorAndType(filename, creator, type)
+    def setfiletype(self, filename):
+        if MacOS and (self.filecreator or self.filetype):
+            creator, type = MacOS.GetCreatorAndType(filename)
+            if self.filecreator: creator = self.filecreator
+            if self.filetype: type = self.filetype
+            MacOS.SetCreatorAndType(filename, creator, type)
 
-	def close(self):
-		self.closefiles()
+    def close(self):
+        self.closefiles()
 
-	def closefiles(self):
-		self.closespec()
-		self.closedefs()
-		self.closescan()
+    def closefiles(self):
+        self.closespec()
+        self.closedefs()
+        self.closescan()
 
-	def closespec(self):
-		tmp = self.specmine and self.specfile
-		self.specfile = None
-		if tmp: tmp.close()
+    def closespec(self):
+        tmp = self.specmine and self.specfile
+        self.specfile = None
+        if tmp: tmp.close()
 
-	def closedefs(self):
-		tmp = self.defsmine and self.defsfile
-		self.defsfile = None
-		if tmp: tmp.close()
+    def closedefs(self):
+        tmp = self.defsmine and self.defsfile
+        self.defsfile = None
+        if tmp: tmp.close()
 
-	def closescan(self):
-		tmp = self.scanmine and self.scanfile
-		self.scanfile = None
-		if tmp: tmp.close()
+    def closescan(self):
+        tmp = self.scanmine and self.scanfile
+        self.scanfile = None
+        if tmp: tmp.close()
 
-	def setoutput(self, spec, defs = None):
-		self.closespec()
-		self.closedefs()
-		if spec:
-			if type(spec) == StringType:
-				file = self.openoutput(spec)
-				mine = 1
-			else:
-				file = spec
-				mine = 0
-			self.specfile = file
-			self.specmine = mine
-		if defs:
-			if type(defs) == StringType:
-				file = self.openoutput(defs)
-				mine = 1
-			else:
-				file = defs
-				mine = 0
-			self.defsfile = file
-			self.defsmine = mine
+    def setoutput(self, spec, defs = None):
+        self.closespec()
+        self.closedefs()
+        if spec:
+            if type(spec) == StringType:
+                file = self.openoutput(spec)
+                mine = 1
+            else:
+                file = spec
+                mine = 0
+            self.specfile = file
+            self.specmine = mine
+        if defs:
+            if type(defs) == StringType:
+                file = self.openoutput(defs)
+                mine = 1
+            else:
+                file = defs
+                mine = 0
+            self.defsfile = file
+            self.defsmine = mine
 
-	def openoutput(self, filename):
-		try:
-			file = open(filename, 'w')
-		except IOError, arg:
-			raise IOError, (filename, arg)
-		self.setfiletype(filename)
-		return file
+    def openoutput(self, filename):
+        try:
+            file = open(filename, 'w')
+        except IOError, arg:
+            raise IOError, (filename, arg)
+        self.setfiletype(filename)
+        return file
 
-	def setinput(self, scan = sys.stdin):
-		if not type(scan) in (TupleType, ListType):
-			scan = [scan]
-		self.allscaninputs = scan
-		self._nextinput()
-		
-	def _nextinput(self):
-		if not self.allscaninputs:
-			return 0
-		scan = self.allscaninputs[0]
-		self.allscaninputs = self.allscaninputs[1:]
-		self.closescan()
-		if scan:
-			if type(scan) == StringType:
-				file = self.openinput(scan)
-				mine = 1
-			else:
-				file = scan
-				mine = 0
-			self.scanfile = file
-			self.scanmine = mine
-		self.lineno = 0
-		return 1
+    def setinput(self, scan = sys.stdin):
+        if not type(scan) in (TupleType, ListType):
+            scan = [scan]
+        self.allscaninputs = scan
+        self._nextinput()
+        
+    def _nextinput(self):
+        if not self.allscaninputs:
+            return 0
+        scan = self.allscaninputs[0]
+        self.allscaninputs = self.allscaninputs[1:]
+        self.closescan()
+        if scan:
+            if type(scan) == StringType:
+                file = self.openinput(scan)
+                mine = 1
+            else:
+                file = scan
+                mine = 0
+            self.scanfile = file
+            self.scanmine = mine
+        self.lineno = 0
+        return 1
 
-	def openinput(self, filename):
-		if not os.path.isabs(filename):
-			for dir in self.includepath:
-				fullname = os.path.join(dir, filename)
-				#self.report("trying full name %s", `fullname`)
-				try:
-					return open(fullname, 'rU')
-				except IOError:
-					pass
-		# If not on the path, or absolute, try default open()
-		try:
-			return open(filename, 'rU')
-		except IOError, arg:
-			raise IOError, (arg, filename)
+    def openinput(self, filename):
+        if not os.path.isabs(filename):
+            for dir in self.includepath:
+                fullname = os.path.join(dir, filename)
+                #self.report("trying full name %s", `fullname`)
+                try:
+                    return open(fullname, 'rU')
+                except IOError:
+                    pass
+        # If not on the path, or absolute, try default open()
+        try:
+            return open(filename, 'rU')
+        except IOError, arg:
+            raise IOError, (arg, filename)
 
-	def getline(self):
-		if not self.scanfile:
-			raise Error, "input file not set"
-		self.line = self.scanfile.readline()
-		if not self.line:
-			if self._nextinput():
-				return self.getline()
-			raise EOFError
-		self.lineno = self.lineno + 1
-		return self.line
+    def getline(self):
+        if not self.scanfile:
+            raise Error, "input file not set"
+        self.line = self.scanfile.readline()
+        if not self.line:
+            if self._nextinput():
+                return self.getline()
+            raise EOFError
+        self.lineno = self.lineno + 1
+        return self.line
 
-	def scan(self):
-		if not self.scanfile:
-			self.error("No input file has been specified")
-			return
-		inputname = self.scanfile.name
-		self.report("scanfile = %s", `inputname`)
-		if not self.specfile:
-			self.report("(No interface specifications will be written)")
-		else:
-			self.report("specfile = %s", `self.specfile.name`)
-			self.specfile.write("# Generated from %s\n\n" % `inputname`)
-		if not self.defsfile:
-			self.report("(No symbol definitions will be written)")
-		else:
-			self.report("defsfile = %s", `self.defsfile.name`)
-			self.defsfile.write("# Generated from %s\n\n" % `os.path.split(inputname)[1]`)
-			self.writeinitialdefs()
-		self.alreadydone = []
-		try:
-			while 1:
-				try: line = self.getline()
-				except EOFError: break
-				if self.debug:
-					self.report("LINE: %s" % `line`)
-				match = self.comment1.match(line)
-				if match:
-					line = match.group('rest')
-					if self.debug:
-						self.report("\tafter comment1: %s" % `line`)
-				match = self.comment2.match(line)
-				while match:
-					line = match.group('rest1')+match.group('rest2')
-					if self.debug:
-						self.report("\tafter comment2: %s" % `line`)
-					match = self.comment2.match(line)
-				if self.defsfile:
-					match = self.sym.match(line)
-					if match:
-						if self.debug:
-							self.report("\tmatches sym.")
-						self.dosymdef(match)
-						continue
-				match = self.head.match(line)
-				if match:
-					if self.debug:
-						self.report("\tmatches head.")
-					self.dofuncspec()
-					continue
-		except EOFError:
-			self.error("Uncaught EOF error")
-		self.reportusedtypes()
+    def scan(self):
+        if not self.scanfile:
+            self.error("No input file has been specified")
+            return
+        inputname = self.scanfile.name
+        self.report("scanfile = %s", `inputname`)
+        if not self.specfile:
+            self.report("(No interface specifications will be written)")
+        else:
+            self.report("specfile = %s", `self.specfile.name`)
+            self.specfile.write("# Generated from %s\n\n" % `inputname`)
+        if not self.defsfile:
+            self.report("(No symbol definitions will be written)")
+        else:
+            self.report("defsfile = %s", `self.defsfile.name`)
+            self.defsfile.write("# Generated from %s\n\n" % `os.path.split(inputname)[1]`)
+            self.writeinitialdefs()
+        self.alreadydone = []
+        try:
+            while 1:
+                try: line = self.getline()
+                except EOFError: break
+                if self.debug:
+                    self.report("LINE: %s" % `line`)
+                match = self.comment1.match(line)
+                if match:
+                    line = match.group('rest')
+                    if self.debug:
+                        self.report("\tafter comment1: %s" % `line`)
+                match = self.comment2.match(line)
+                while match:
+                    line = match.group('rest1')+match.group('rest2')
+                    if self.debug:
+                        self.report("\tafter comment2: %s" % `line`)
+                    match = self.comment2.match(line)
+                if self.defsfile:
+                    match = self.sym.match(line)
+                    if match:
+                        if self.debug:
+                            self.report("\tmatches sym.")
+                        self.dosymdef(match)
+                        continue
+                match = self.head.match(line)
+                if match:
+                    if self.debug:
+                        self.report("\tmatches head.")
+                    self.dofuncspec()
+                    continue
+        except EOFError:
+            self.error("Uncaught EOF error")
+        self.reportusedtypes()
 
-	def dosymdef(self, match):
-		name, defn = match.group('name', 'defn')
-		defn = escape8bit(defn)
-		if self.debug:
-			self.report("\tsym: name=%s, defn=%s" % (`name`, `defn`))
-		if not name in self.blacklistnames:
-			self.defsfile.write("%s = %s\n" % (name, defn))
-		else:
-			self.defsfile.write("# %s = %s\n" % (name, defn))
-		# XXXX No way to handle greylisted names
+    def dosymdef(self, match):
+        name, defn = match.group('name', 'defn')
+        defn = escape8bit(defn)
+        if self.debug:
+            self.report("\tsym: name=%s, defn=%s" % (`name`, `defn`))
+        if not name in self.blacklistnames:
+            self.defsfile.write("%s = %s\n" % (name, defn))
+        else:
+            self.defsfile.write("# %s = %s\n" % (name, defn))
+        # XXXX No way to handle greylisted names
 
-	def dofuncspec(self):
-		raw = self.line
-		while not self.tail.search(raw):
-			line = self.getline()
-			if self.debug:
-				self.report("* CONTINUATION LINE: %s" % `line`)
-			match = self.comment1.match(line)
-			if match:
-				line = match.group('rest')
-				if self.debug:
-					self.report("\tafter comment1: %s" % `line`)
-			match = self.comment2.match(line)
-			while match:
-				line = match.group('rest1')+match.group('rest2')
-				if self.debug:
-					self.report("\tafter comment1: %s" % `line`)
-				match = self.comment2.match(line)
-			raw = raw + line
-		if self.debug:
-			self.report("* WHOLE LINE: %s" % `raw`)
-		self.processrawspec(raw)
+    def dofuncspec(self):
+        raw = self.line
+        while not self.tail.search(raw):
+            line = self.getline()
+            if self.debug:
+                self.report("* CONTINUATION LINE: %s" % `line`)
+            match = self.comment1.match(line)
+            if match:
+                line = match.group('rest')
+                if self.debug:
+                    self.report("\tafter comment1: %s" % `line`)
+            match = self.comment2.match(line)
+            while match:
+                line = match.group('rest1')+match.group('rest2')
+                if self.debug:
+                    self.report("\tafter comment1: %s" % `line`)
+                match = self.comment2.match(line)
+            raw = raw + line
+        if self.debug:
+            self.report("* WHOLE LINE: %s" % `raw`)
+        self.processrawspec(raw)
 
-	def processrawspec(self, raw):
-		match = self.whole.search(raw)
-		if not match:
-			self.report("Bad raw spec: %s", `raw`)
-			if self.debug:
-				if not self.type.search(raw):
-					self.report("(Type already doesn't match)")
-				else:
-					self.report("(but type matched)")
-			return
-		type, name, args = match.group('type', 'name', 'args')
-		type = re.sub("\*", " ptr", type)
-		type = re.sub("[ \t]+", "_", type)
-		if name in self.alreadydone:
-			self.report("Name has already been defined: %s", `name`)
-			return
-		self.report("==> %s %s <==", type, name)
-		if self.blacklisted(type, name):
-			self.report("*** %s %s blacklisted", type, name)
-			return
-		returnlist = [(type, name, 'ReturnMode')]
-		returnlist = self.repairarglist(name, returnlist)
-		[(type, name, returnmode)] = returnlist
-		arglist = self.extractarglist(args)
-		arglist = self.repairarglist(name, arglist)
-		if self.unmanageable(type, name, arglist):
-			##for arg in arglist:
-			##	self.report("    %s", `arg`)
-			self.report("*** %s %s unmanageable", type, name)
-			return
-		self.alreadydone.append(name)
-		self.generate(type, name, arglist)
+    def processrawspec(self, raw):
+        match = self.whole.search(raw)
+        if not match:
+            self.report("Bad raw spec: %s", `raw`)
+            if self.debug:
+                if not self.type.search(raw):
+                    self.report("(Type already doesn't match)")
+                else:
+                    self.report("(but type matched)")
+            return
+        type, name, args = match.group('type', 'name', 'args')
+        type = re.sub("\*", " ptr", type)
+        type = re.sub("[ \t]+", "_", type)
+        if name in self.alreadydone:
+            self.report("Name has already been defined: %s", `name`)
+            return
+        self.report("==> %s %s <==", type, name)
+        if self.blacklisted(type, name):
+            self.report("*** %s %s blacklisted", type, name)
+            return
+        returnlist = [(type, name, 'ReturnMode')]
+        returnlist = self.repairarglist(name, returnlist)
+        [(type, name, returnmode)] = returnlist
+        arglist = self.extractarglist(args)
+        arglist = self.repairarglist(name, arglist)
+        if self.unmanageable(type, name, arglist):
+            ##for arg in arglist:
+            ##  self.report("    %s", `arg`)
+            self.report("*** %s %s unmanageable", type, name)
+            return
+        self.alreadydone.append(name)
+        self.generate(type, name, arglist)
 
-	def extractarglist(self, args):
-		args = args.strip()
-		if not args or args == "void":
-			return []
-		parts = [s.strip() for s in args.split(",")]
-		arglist = []
-		for part in parts:
-			arg = self.extractarg(part)
-			arglist.append(arg)
-		return arglist
+    def extractarglist(self, args):
+        args = args.strip()
+        if not args or args == "void":
+            return []
+        parts = [s.strip() for s in args.split(",")]
+        arglist = []
+        for part in parts:
+            arg = self.extractarg(part)
+            arglist.append(arg)
+        return arglist
 
-	def extractarg(self, part):
-		mode = "InMode"
-		part = part.strip()
-		match = self.asplit.match(part)
-		if not match:
-			self.error("Indecipherable argument: %s", `part`)
-			return ("unknown", part, mode)
-		type, name, array = match.group('type', 'name', 'array')
-		if array:
-			# array matches an optional [] after the argument name
-			type = type + " ptr "
-		type = re.sub("\*", " ptr ", type)
-		type = type.strip()
-		type = re.sub("[ \t]+", "_", type)
-		return self.modifyarg(type, name, mode)
-	
-	def modifyarg(self, type, name, mode):
-		if type[:6] == "const_":
-			type = type[6:]
-		elif type[-4:] == "_ptr":
-			type = type[:-4]
-			mode = "OutMode"
-		elif type in self.inherentpointertypes:
-			mode = "OutMode"
-		if type[-4:] == "_far":
-			type = type[:-4]
-		return type, name, mode
+    def extractarg(self, part):
+        mode = "InMode"
+        part = part.strip()
+        match = self.asplit.match(part)
+        if not match:
+            self.error("Indecipherable argument: %s", `part`)
+            return ("unknown", part, mode)
+        type, name, array = match.group('type', 'name', 'array')
+        if array:
+            # array matches an optional [] after the argument name
+            type = type + " ptr "
+        type = re.sub("\*", " ptr ", type)
+        type = type.strip()
+        type = re.sub("[ \t]+", "_", type)
+        return self.modifyarg(type, name, mode)
+    
+    def modifyarg(self, type, name, mode):
+        if type[:6] == "const_":
+            type = type[6:]
+        elif type[-4:] == "_ptr":
+            type = type[:-4]
+            mode = "OutMode"
+        elif type in self.inherentpointertypes:
+            mode = "OutMode"
+        if type[-4:] == "_far":
+            type = type[:-4]
+        return type, name, mode
 
-	def repairarglist(self, functionname, arglist):
-		arglist = arglist[:]
-		i = 0
-		while i < len(arglist):
-			for item in self.repairinstructions:
-				if len(item) == 2:
-					pattern, replacement = item
-					functionpat = "*"
-				else:
-					functionpat, pattern, replacement = item
-				if not fnmatch.fnmatchcase(functionname, functionpat):
-					continue
-				n = len(pattern)
-				if i+n > len(arglist): continue
-				current = arglist[i:i+n]
-				for j in range(n):
-					if not self.matcharg(pattern[j], current[j]):
-						break
-				else: # All items of the pattern match
-					new = self.substituteargs(
-							pattern, replacement, current)
-					if new is not None:
-						arglist[i:i+n] = new
-						i = i+len(new) # No recursive substitutions
-						break
-			else: # No patterns match
-				i = i+1
-		return arglist
-	
-	def matcharg(self, patarg, arg):
-		return len(filter(None, map(fnmatch.fnmatchcase, arg, patarg))) == 3
+    def repairarglist(self, functionname, arglist):
+        arglist = arglist[:]
+        i = 0
+        while i < len(arglist):
+            for item in self.repairinstructions:
+                if len(item) == 2:
+                    pattern, replacement = item
+                    functionpat = "*"
+                else:
+                    functionpat, pattern, replacement = item
+                if not fnmatch.fnmatchcase(functionname, functionpat):
+                    continue
+                n = len(pattern)
+                if i+n > len(arglist): continue
+                current = arglist[i:i+n]
+                for j in range(n):
+                    if not self.matcharg(pattern[j], current[j]):
+                        break
+                else: # All items of the pattern match
+                    new = self.substituteargs(
+                            pattern, replacement, current)
+                    if new is not None:
+                        arglist[i:i+n] = new
+                        i = i+len(new) # No recursive substitutions
+                        break
+            else: # No patterns match
+                i = i+1
+        return arglist
+    
+    def matcharg(self, patarg, arg):
+        return len(filter(None, map(fnmatch.fnmatchcase, arg, patarg))) == 3
 
-	def substituteargs(self, pattern, replacement, old):
-		new = []
-		for k in range(len(replacement)):
-			item = replacement[k]
-			newitem = [item[0], item[1], item[2]]
-			for i in range(3):
-				if item[i] == '*':
-					newitem[i] = old[k][i]
-				elif item[i][:1] == '$':
-					index = int(item[i][1:]) - 1
-					newitem[i] = old[index][i]
-			new.append(tuple(newitem))
-		##self.report("old: %s", `old`)
-		##self.report("new: %s", `new`)
-		return new
+    def substituteargs(self, pattern, replacement, old):
+        new = []
+        for k in range(len(replacement)):
+            item = replacement[k]
+            newitem = [item[0], item[1], item[2]]
+            for i in range(3):
+                if item[i] == '*':
+                    newitem[i] = old[k][i]
+                elif item[i][:1] == '$':
+                    index = int(item[i][1:]) - 1
+                    newitem[i] = old[index][i]
+            new.append(tuple(newitem))
+        ##self.report("old: %s", `old`)
+        ##self.report("new: %s", `new`)
+        return new
 
-	def generate(self, type, name, arglist):
-		self.typeused(type, 'return')
-		classname, listname = self.destination(type, name, arglist)
-		if not self.specfile: return
-		self.specfile.write("f = %s(%s, %s,\n" % (classname, type, `name`))
-		for atype, aname, amode in arglist:
-			self.typeused(atype, amode)
-			self.specfile.write("    (%s, %s, %s),\n" %
-			                    (atype, `aname`, amode))
-		if self.greydictnames.has_key(name):
-			self.specfile.write("    condition=%s,\n"%`self.greydictnames[name]`)
-		self.specfile.write(")\n")
-		self.specfile.write("%s.append(f)\n\n" % listname)
+    def generate(self, type, name, arglist):
+        self.typeused(type, 'return')
+        classname, listname = self.destination(type, name, arglist)
+        if not self.specfile: return
+        self.specfile.write("f = %s(%s, %s,\n" % (classname, type, `name`))
+        for atype, aname, amode in arglist:
+            self.typeused(atype, amode)
+            self.specfile.write("    (%s, %s, %s),\n" %
+                                (atype, `aname`, amode))
+        if self.greydictnames.has_key(name):
+            self.specfile.write("    condition=%s,\n"%`self.greydictnames[name]`)
+        self.specfile.write(")\n")
+        self.specfile.write("%s.append(f)\n\n" % listname)
 
-	def destination(self, type, name, arglist):
-		return "FunctionGenerator", "functions"
+    def destination(self, type, name, arglist):
+        return "FunctionGenerator", "functions"
 
-	def blacklisted(self, type, name):
-		if type in self.blacklisttypes:
-			##self.report("return type %s is blacklisted", type)
-			return 1
-		if name in self.blacklistnames:
-			##self.report("function name %s is blacklisted", name)
-			return 1
-		return 0
+    def blacklisted(self, type, name):
+        if type in self.blacklisttypes:
+            ##self.report("return type %s is blacklisted", type)
+            return 1
+        if name in self.blacklistnames:
+            ##self.report("function name %s is blacklisted", name)
+            return 1
+        return 0
 
-	def unmanageable(self, type, name, arglist):
-		for atype, aname, amode in arglist:
-			if atype in self.blacklisttypes:
-				self.report("argument type %s is blacklisted", atype)
-				return 1
-		return 0
+    def unmanageable(self, type, name, arglist):
+        for atype, aname, amode in arglist:
+            if atype in self.blacklisttypes:
+                self.report("argument type %s is blacklisted", atype)
+                return 1
+        return 0
 
 class Scanner_PreUH3(Scanner):
-	"""Scanner for Universal Headers before release 3"""
-	def initpatterns(self):
-		Scanner.initpatterns(self)
-		self.head_pat = "^extern pascal[ \t]+" # XXX Mac specific!
-		self.type_pat = "pascal[ \t\n]+(?P<type>[a-zA-Z0-9_ \t]*[a-zA-Z0-9_])[ \t\n]+"
-		self.whole_pat = self.type_pat + self.name_pat + self.args_pat
-		self.sym_pat = "^[ \t]*(?P<name>[a-zA-Z0-9_]+)[ \t]*=" + \
-		               "[ \t]*(?P<defn>[-0-9'\"][^\t\n,;}]*),?"
+    """Scanner for Universal Headers before release 3"""
+    def initpatterns(self):
+        Scanner.initpatterns(self)
+        self.head_pat = "^extern pascal[ \t]+" # XXX Mac specific!
+        self.type_pat = "pascal[ \t\n]+(?P<type>[a-zA-Z0-9_ \t]*[a-zA-Z0-9_])[ \t\n]+"
+        self.whole_pat = self.type_pat + self.name_pat + self.args_pat
+        self.sym_pat = "^[ \t]*(?P<name>[a-zA-Z0-9_]+)[ \t]*=" + \
+                       "[ \t]*(?P<defn>[-0-9'\"][^\t\n,;}]*),?"
 
 class Scanner_OSX(Scanner):
-	"""Scanner for modern (post UH3.3) Universal Headers """
-	def initpatterns(self):
-		Scanner.initpatterns(self)
-		self.head_pat = "^EXTERN_API(_C)?"
-		self.type_pat = "EXTERN_API(_C)?" + \
-						"[ \t\n]*\([ \t\n]*" + \
-						"(?P<type>[a-zA-Z0-9_* \t]*[a-zA-Z0-9_*])" + \
-						"[ \t\n]*\)[ \t\n]*"
-		self.whole_pat = self.type_pat + self.name_pat + self.args_pat
-		self.sym_pat = "^[ \t]*(?P<name>[a-zA-Z0-9_]+)[ \t]*=" + \
-		               "[ \t]*(?P<defn>[-0-9_a-zA-Z'\"\(][^\t\n,;}]*),?"
+    """Scanner for modern (post UH3.3) Universal Headers """
+    def initpatterns(self):
+        Scanner.initpatterns(self)
+        self.head_pat = "^EXTERN_API(_C)?"
+        self.type_pat = "EXTERN_API(_C)?" + \
+                        "[ \t\n]*\([ \t\n]*" + \
+                        "(?P<type>[a-zA-Z0-9_* \t]*[a-zA-Z0-9_*])" + \
+                        "[ \t\n]*\)[ \t\n]*"
+        self.whole_pat = self.type_pat + self.name_pat + self.args_pat
+        self.sym_pat = "^[ \t]*(?P<name>[a-zA-Z0-9_]+)[ \t]*=" + \
+                       "[ \t]*(?P<defn>[-0-9_a-zA-Z'\"\(][^\t\n,;}]*),?"
 
 _8bit = re.compile(r"[\200-\377]")
 
 def escape8bit(s):
-	if _8bit.search(s) is not None:
-		out = []
-		for c in s:
-			o = ord(c)
-			if o >= 128:
-				out.append("\\" + hex(o)[1:])
-			else:
-				out.append(c)
-		s = "".join(out)
-	return s
+    if _8bit.search(s) is not None:
+        out = []
+        for c in s:
+            o = ord(c)
+            if o >= 128:
+                out.append("\\" + hex(o)[1:])
+            else:
+                out.append(c)
+        s = "".join(out)
+    return s
 
 def test():
-	input = "D:Development:THINK C:Mac #includes:Apple #includes:AppleEvents.h"
-	output = "@aespecs.py"
-	defsoutput = "@aedefs.py"
-	s = Scanner(input, output, defsoutput)
-	s.scan()
+    input = "D:Development:THINK C:Mac #includes:Apple #includes:AppleEvents.h"
+    output = "@aespecs.py"
+    defsoutput = "@aedefs.py"
+    s = Scanner(input, output, defsoutput)
+    s.scan()
 
 if __name__ == '__main__':
-	test()
+    test()