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