1from framer import template 2from framer.util import cstring, unindent 3 4T_SHORT = "T_SHORT" 5T_INT = "T_INT" 6T_LONG = "T_LONG" 7T_FLOAT = "T_FLOAT" 8T_DOUBLE = "T_DOUBLE" 9T_STRING = "T_STRING" 10T_OBJECT = "T_OBJECT" 11T_CHAR = "T_CHAR" 12T_BYTE = "T_BYTE" 13T_UBYTE = "T_UBYTE" 14T_UINT = "T_UINT" 15T_ULONG = "T_ULONG" 16T_STRING_INPLACE = "T_STRING_INPLACE" 17T_OBJECT_EX = "T_OBJECT_EX" 18 19RO = READONLY = "READONLY" 20READ_RESTRICTED = "READ_RESTRICTED" 21WRITE_RESTRICTED = "WRITE_RESTRICTED" 22RESTRICT = "RESTRICTED" 23 24c2t = {"int" : T_INT, 25 "unsigned int" : T_UINT, 26 "long" : T_LONG, 27 "unsigned long" : T_LONG, 28 "float" : T_FLOAT, 29 "double" : T_DOUBLE, 30 "char *" : T_CHAR, 31 "PyObject *" : T_OBJECT, 32 } 33 34class member(object): 35 36 def __init__(self, cname=None, type=None, flags=None, doc=None): 37 self.type = type 38 self.flags = flags 39 self.cname = cname 40 self.doc = doc 41 self.name = None 42 self.struct = None 43 44 def register(self, name, struct): 45 self.name = name 46 self.struct = struct 47 self.initvars() 48 49 def initvars(self): 50 v = self.vars = {} 51 v["PythonName"] = self.name 52 if self.cname is not None: 53 v["CName"] = self.cname 54 else: 55 v["CName"] = self.name 56 v["Flags"] = self.flags or "0" 57 v["Type"] = self.get_type() 58 if self.doc is not None: 59 v["Docstring"] = cstring(unindent(self.doc)) 60 v["StructName"] = self.struct.name 61 62 def get_type(self): 63 """Deduce type code from struct specification if not defined""" 64 if self.type is not None: 65 return self.type 66 ctype = self.struct.get_type(self.name) 67 return c2t[ctype] 68 69 def dump(self, f): 70 if self.doc is None: 71 print >> f, template.memberdef_def % self.vars 72 else: 73 print >> f, template.memberdef_def_doc % self.vars 74