153d527ad1828d484e336626ee59d7d5606b58499Jeremy Hyltonfrom framer import template 253d527ad1828d484e336626ee59d7d5606b58499Jeremy Hyltonfrom framer.util import cstring, unindent 353d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton 453d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_SHORT = "T_SHORT" 553d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_INT = "T_INT" 653d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_LONG = "T_LONG" 753d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_FLOAT = "T_FLOAT" 853d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_DOUBLE = "T_DOUBLE" 953d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_STRING = "T_STRING" 1053d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_OBJECT = "T_OBJECT" 1153d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_CHAR = "T_CHAR" 1253d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_BYTE = "T_BYTE" 1353d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_UBYTE = "T_UBYTE" 1453d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_UINT = "T_UINT" 1553d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_ULONG = "T_ULONG" 1653d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_STRING_INPLACE = "T_STRING_INPLACE" 1753d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonT_OBJECT_EX = "T_OBJECT_EX" 1853d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton 1953d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonRO = READONLY = "READONLY" 2053d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonREAD_RESTRICTED = "READ_RESTRICTED" 2153d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonWRITE_RESTRICTED = "WRITE_RESTRICTED" 2253d527ad1828d484e336626ee59d7d5606b58499Jeremy HyltonRESTRICT = "RESTRICTED" 2353d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton 2453d527ad1828d484e336626ee59d7d5606b58499Jeremy Hyltonc2t = {"int" : T_INT, 2553d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton "unsigned int" : T_UINT, 2653d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton "long" : T_LONG, 2753d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton "unsigned long" : T_LONG, 2853d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton "float" : T_FLOAT, 2953d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton "double" : T_DOUBLE, 3053d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton "char *" : T_CHAR, 3153d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton "PyObject *" : T_OBJECT, 3253d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton } 3353d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton 3453d527ad1828d484e336626ee59d7d5606b58499Jeremy Hyltonclass member(object): 3553d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton 3653d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton def __init__(self, cname=None, type=None, flags=None, doc=None): 3753d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton self.type = type 3853d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton self.flags = flags 3953d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton self.cname = cname 4053d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton self.doc = doc 4153d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton self.name = None 4253d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton self.struct = None 4353d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton 4453d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton def register(self, name, struct): 4553d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton self.name = name 4653d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton self.struct = struct 4753d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton self.initvars() 4853d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton 4953d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton def initvars(self): 5053d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton v = self.vars = {} 5153d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton v["PythonName"] = self.name 5253d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton if self.cname is not None: 5353d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton v["CName"] = self.cname 5453d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton else: 5553d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton v["CName"] = self.name 5653d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton v["Flags"] = self.flags or "0" 5753d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton v["Type"] = self.get_type() 5853d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton if self.doc is not None: 5953d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton v["Docstring"] = cstring(unindent(self.doc)) 6053d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton v["StructName"] = self.struct.name 6153d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton 6253d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton def get_type(self): 6353d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton """Deduce type code from struct specification if not defined""" 6453d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton if self.type is not None: 6553d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton return self.type 6653d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton ctype = self.struct.get_type(self.name) 6753d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton return c2t[ctype] 6853d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton 6953d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton def dump(self, f): 7053d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton if self.doc is None: 7153d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton print >> f, template.memberdef_def % self.vars 7253d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton else: 7353d527ad1828d484e336626ee59d7d5606b58499Jeremy Hylton print >> f, template.memberdef_def_doc % self.vars 74