ref: abbd910a6d157de501844e80ca18132266e4f862
parent: 195b424da19c3bca0b74c5ddd8dd56b7562a2f45
author: Paul Brossier <piem@piem.org>
date: Wed Jul 11 10:43:00 EDT 2012
gen_pyobject.py: clean up, output a float instead of a vector with a single element
--- a/interfaces/python/gen_pyobject.py
+++ b/interfaces/python/gen_pyobject.py
@@ -34,14 +34,21 @@
""" arg = 'foo *name'
return ['foo*', 'name'] """
l = arg.split()
+ type_arg = {'type': l[0], 'name': l[1]}
# ['foo', '*name'] -> ['foo*', 'name']
if l[-1].startswith('*'):
- return [l[0]+'*', l[1][1:]]
+ #return [l[0]+'*', l[1][1:]]
+ type_arg['type'] = l[0] + '*'
+ type_arg['name'] = l[1][1:]
# ['foo', '*', 'name'] -> ['foo*', 'name']
if len(l) == 3:
- return [l[0]+l[1], l[2]]
+ #return [l[0]+l[1], l[2]]
+ type_arg['type'] = l[0]+l[1]
+ type_arg['name'] = l[2]
else:
- return l
+ #return l
+ pass
+ return type_arg
def get_params(proto):
""" get the list of parameters from a function prototype
@@ -144,13 +151,13 @@
newparams = get_params_types_names(newfunc)
# self->param1, self->param2, self->param3
if len(newparams):
- selfparams = ', self->'+', self->'.join([p[1] for p in newparams])
+ selfparams = ', self->'+', self->'.join([p['name'] for p in newparams])
else:
selfparams = ''
# "param1", "param2", "param3"
- paramnames = ", ".join(["\""+p[1]+"\"" for p in newparams])
- pyparams = "".join(map(lambda p: aubio2pytypes[p[0]], newparams))
- paramrefs = ", ".join(["&" + p[1] for p in newparams])
+ paramnames = ", ".join(["\""+p['name']+"\"" for p in newparams])
+ pyparams = "".join(map(lambda p: aubio2pytypes[p['type']], newparams))
+ paramrefs = ", ".join(["&" + p['name'] for p in newparams])
s = """\
// WARNING: this file is generated, DO NOT EDIT
@@ -162,7 +169,9 @@
PyObject_HEAD
aubio_%(name)s_t * o;
""" % locals()
- for ptype, pname in newparams:
+ for p in newparams:
+ ptype = p['type']
+ pname = p['name']
s += """\
%(ptype)s %(pname)s;
""" % locals()
@@ -176,7 +185,9 @@
{
Py_%(name)s *self;
""" % locals()
- for ptype, pname in newparams:
+ for p in newparams:
+ ptype = p['type']
+ pname = p['name']
initval = aubioinitvalue[ptype]
s += """\
%(ptype)s %(pname)s = %(initval)s;
@@ -199,7 +210,9 @@
return NULL;
}
""" % locals()
- for ptype, pname in newparams:
+ for p in newparams:
+ ptype = p['type']
+ pname = p['name']
defval = aubiodefvalue[pname]
if ptype == 'char_t*':
s += """\
@@ -247,7 +260,7 @@
funcname = dofunc.split()[1].split('(')[0]
doparams = get_params_types_names(dofunc)
# make sure the first parameter is the object
- assert doparams[0][0] == "aubio_"+name+"_t*", \
+ assert doparams[0]['type'] == "aubio_"+name+"_t*", \
"method is not in 'aubio_<name>_t"
# and remove it
doparams = doparams[1:]
@@ -260,22 +273,27 @@
# build strings for inputs, assuming there is only one input
inputparams = [doparams[0]]
# build the parsing string for PyArg_ParseTuple
- pytypes = "".join([aubio2pytypes[p[0]] for p in doparams[0:1]])
- inputdefs = "\n ".join(["PyObject * " + p[-1] + "_obj;" for p in inputparams])
- inputvecs = "\n ".join(map(lambda p: \
- p[0] + p[-1] + ";", inputparams))
- parseinput = ""
+ pytypes = "".join([aubio2pytypes[p['type']] for p in doparams[0:1]])
+
+ inputdefs = "/* input vectors python prototypes */\n "
+ inputdefs += "\n ".join(["PyObject * " + p['name'] + "_obj;" for p in inputparams])
+
+ inputvecs = "/* input vectors prototypes */\n "
+ inputvecs += "\n ".join(map(lambda p: p['type'] + ' ' + p['name'] + ";", inputparams))
+
+ parseinput = "/* input vectors parsing */\n "
for p in inputparams:
- inputvec = p[-1]
- inputdef = p[-1] + "_obj"
- converter = aubiovecfrompyobj[p[0]]
+ inputvec = p['name']
+ inputdef = p['name'] + "_obj"
+ converter = aubiovecfrompyobj[p['type']]
parseinput += """%(inputvec)s = %(converter)s (%(inputdef)s);
if (%(inputvec)s == NULL) {
return NULL;
}""" % locals()
+
# build the string for the input objects references
- inputrefs = ", ".join(["&" + p[-1] + "_obj" for p in inputparams])
+ inputrefs = ", ".join(["&" + p['name'] + "_obj" for p in inputparams])
# end of inputs strings
# build strings for outputs
@@ -283,32 +301,41 @@
if len(outputparams) >= 1:
#assert len(outputparams) == 1, \
# "too many output parameters"
- outputvecs = "\n ".join([p[0] + p[-1] + ";" for p in outputparams])
- outputcreate = "\n ".join(["""\
- %(name)s = new_%(autype)s (%(length)s);""" % \
- {'name': p[-1], 'pytype': p[0], 'autype': p[0][:-3],
- 'length': defaultsizes[name]} \
- for p in outputparams])
+ outputvecs = "\n /* output vectors prototypes */\n "
+ outputvecs += "\n ".join([p['type'] + ' ' + p['name'] + ";" for p in outputparams])
+ params = {
+ 'name': p['name'], 'pytype': p['type'], 'autype': p['type'][:-3],
+ 'length': defaultsizes[name]}
+ outputcreate = "\n ".join(["""/* creating output %(name)s as a new_%(autype)s of length %(length)s */""" % \
+ params for p in outputparams])
+ outputcreate += "\n"
+ outputcreate += "\n ".join([""" %(name)s = new_%(autype)s (%(length)s);""" % \
+ params for p in outputparams])
+ returnval = ""
if len(outputparams) > 1:
- returnval = "PyObject *outputs = PyList_New(0);\n"
+ returnval += "PyObject *outputs = PyList_New(0);\n"
for p in outputparams:
- returnval += " PyList_Append( outputs, (PyObject *)" + aubiovectopyobj[p[0]] + " (" + p[-1] + ")" +");\n"
+ returnval += " PyList_Append( outputs, (PyObject *)" + aubiovectopyobj[p['type']] + " (" + p['name'] + ")" +");\n"
returnval += " return outputs;"
else:
- returnval = "return (PyObject *)" + aubiovectopyobj[p[0]] + " (" + p[-1] + ")"
+ if defaultsizes[name] == '1':
+ returnval += "return (PyObject *)PyFloat_FromDouble(" + p['name'] + "->data[0])"
+ else:
+ returnval += "return (PyObject *)" + aubiovectopyobj[p['type']] + " (" + p['name'] + ")"
else:
# no output
outputvecs = ""
outputcreate = ""
#returnval = "Py_None";
- returnval = "return (PyObject *)" + aubiovectopyobj[p[0]] + " (" + p[-1] + ")"
+ returnval = "return (PyObject *)" + aubiovectopyobj[p['type']] + " (" + p['name'] + ")"
# end of output strings
# build the parameters for the _do() call
- doparams_string = "self->o, " + ", ".join([p[-1] for p in doparams])
+ doparams_string = "self->o, " + ", ".join([p['name'] for p in doparams])
# put it all together
s = """\
+/* function Py_%(name)s_do */
static PyObject *
Py_%(name)s_do(Py_%(name)s * self, PyObject * args)
{
@@ -337,18 +364,18 @@
s = """
AUBIO_MEMBERS_START(%(name)s)""" % locals()
for param in newparams:
- if param[0] == 'char_t*':
+ if param['type'] == 'char_t*':
s += """
{"%(pname)s", T_STRING, offsetof (Py_%(name)s, %(pname)s), READONLY, ""},""" \
- % { 'pname': param[1], 'ptype': param[0], 'name': name}
- elif param[0] == 'uint_t':
+ % { 'pname': param['name'], 'ptype': param['type'], 'name': name}
+ elif param['type'] == 'uint_t':
s += """
{"%(pname)s", T_INT, offsetof (Py_%(name)s, %(pname)s), READONLY, ""},""" \
- % { 'pname': param[1], 'ptype': param[0], 'name': name}
- elif param[0] == 'smpl_t':
+ % { 'pname': param['name'], 'ptype': param['type'], 'name': name}
+ elif param['type'] == 'smpl_t':
s += """
{"%(pname)s", T_FLOAT, offsetof (Py_%(name)s, %(pname)s), READONLY, ""},""" \
- % { 'pname': param[1], 'ptype': param[0], 'name': name}
+ % { 'pname': param['name'], 'ptype': param['type'], 'name': name}
else:
write_msg ("-- ERROR, unknown member type ", param )
s += """
@@ -365,16 +392,16 @@
method_name = get_name(method)
params = get_params_types_names(method)
out_type = get_return_type(method)
- assert params[0][0] == "aubio_"+name+"_t*", \
+ assert params[0]['type'] == "aubio_"+name+"_t*", \
"get method is not in 'aubio_<name>_t"
write_msg (method )
write_msg (params[1:])
- setter_args = "self->o, " +",".join([p[1] for p in params[1:]])
+ setter_args = "self->o, " +",".join([p['name'] for p in params[1:]])
parse_args = ""
for p in params[1:]:
- parse_args += p[0] + " " + p[1] + ";\n"
- argmap = "".join([aubio2pytypes[p[0]] for p in params[1:]])
- arglist = ", ".join(["&"+p[1] for p in params[1:]])
+ parse_args += p['type'] + " " + p['name'] + ";\n"
+ argmap = "".join([aubio2pytypes[p['type']] for p in params[1:]])
+ arglist = ", ".join(["&"+p['name'] for p in params[1:]])
parse_args += """
if (!PyArg_ParseTuple (args, "%(argmap)s", %(arglist)s)) {
return NULL;
@@ -408,8 +435,8 @@
method_name = get_name(method)
params = get_params_types_names(method)
out_type = get_return_type(method)
- assert params[0][0] == "aubio_"+name+"_t*", \
- "get method is not in 'aubio_<name>_t %s" % params[0][0]
+ assert params[0]['type'] == "aubio_"+name+"_t*", \
+ "get method is not in 'aubio_<name>_t %s" % params[0]['type']
assert len(params) == 1, \
"get method has more than one parameter %s" % params
getter_args = "self->o"