from bgenOutput import * | |
from bgenGeneratorGroup import GeneratorGroup | |
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 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() | |
if self.includestuff: | |
Output() | |
Output("%s", self.includestuff) | |
self.declareModuleVariables() | |
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() | |
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) | |
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 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() | |
if __name__ == "__main__": | |
_test() |