mirror of https://github.com/python/cpython
74 lines
1.9 KiB
Python
74 lines
1.9 KiB
Python
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
|