| from framer import template | |
| from framer.util import cstring, unindent | |
| T_SHORT = "T_SHORT" | |
| T_INT = "T_INT" | |
| T_LONG = "T_LONG" | |
| T_FLOAT = "T_FLOAT" | |
| T_DOUBLE = "T_DOUBLE" | |
| T_STRING = "T_STRING" | |
| T_OBJECT = "T_OBJECT" | |
| T_CHAR = "T_CHAR" | |
| T_BYTE = "T_BYTE" | |
| T_UBYTE = "T_UBYTE" | |
| T_UINT = "T_UINT" | |
| T_ULONG = "T_ULONG" | |
| T_STRING_INPLACE = "T_STRING_INPLACE" | |
| T_OBJECT_EX = "T_OBJECT_EX" | |
| RO = READONLY = "READONLY" | |
| READ_RESTRICTED = "READ_RESTRICTED" | |
| WRITE_RESTRICTED = "WRITE_RESTRICTED" | |
| RESTRICT = "RESTRICTED" | |
| c2t = {"int" : T_INT, | |
| "unsigned int" : T_UINT, | |
| "long" : T_LONG, | |
| "unsigned long" : T_LONG, | |
| "float" : T_FLOAT, | |
| "double" : T_DOUBLE, | |
| "char *" : T_CHAR, | |
| "PyObject *" : T_OBJECT, | |
| } | |
| class member(object): | |
| def __init__(self, cname=None, type=None, flags=None, doc=None): | |
| self.type = type | |
| self.flags = flags | |
| self.cname = cname | |
| self.doc = doc | |
| self.name = None | |
| self.struct = None | |
| def register(self, name, struct): | |
| self.name = name | |
| self.struct = struct | |
| self.initvars() | |
| def initvars(self): | |
| v = self.vars = {} | |
| v["PythonName"] = self.name | |
| if self.cname is not None: | |
| v["CName"] = self.cname | |
| else: | |
| v["CName"] = self.name | |
| v["Flags"] = self.flags or "0" | |
| v["Type"] = self.get_type() | |
| if self.doc is not None: | |
| v["Docstring"] = cstring(unindent(self.doc)) | |
| v["StructName"] = self.struct.name | |
| def get_type(self): | |
| """Deduce type code from struct specification if not defined""" | |
| if self.type is not None: | |
| return self.type | |
| ctype = self.struct.get_type(self.name) | |
| return c2t[ctype] | |
| def dump(self, f): | |
| if self.doc is None: | |
| print >> f, template.memberdef_def % self.vars | |
| else: | |
| print >> f, template.memberdef_def_doc % self.vars |