| 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 |