summaryrefslogtreecommitdiff
path: root/numpy/f2py/lib/py_wrap_subprogram.py
diff options
context:
space:
mode:
authorPearu Peterson <pearu.peterson@gmail.com>2006-10-05 16:44:52 +0000
committerPearu Peterson <pearu.peterson@gmail.com>2006-10-05 16:44:52 +0000
commitf0bfc449991703abef349b844764dc3f3abc9fef (patch)
tree7a182c17dc42649c1c610e62ec5f8a574275e9a1 /numpy/f2py/lib/py_wrap_subprogram.py
parent73eef3a9fc78c6f047af91eb6f86b8e3b7893240 (diff)
downloadnumpy-f0bfc449991703abef349b844764dc3f3abc9fef.tar.gz
F2PY G3: added basic support for wrapping Fortran subprograms, scalar input only.
Diffstat (limited to 'numpy/f2py/lib/py_wrap_subprogram.py')
-rw-r--r--numpy/f2py/lib/py_wrap_subprogram.py89
1 files changed, 85 insertions, 4 deletions
diff --git a/numpy/f2py/lib/py_wrap_subprogram.py b/numpy/f2py/lib/py_wrap_subprogram.py
index 3c203c317..3044b5a6b 100644
--- a/numpy/f2py/lib/py_wrap_subprogram.py
+++ b/numpy/f2py/lib/py_wrap_subprogram.py
@@ -4,20 +4,101 @@ __all__ = ['PythonCAPISubProgram']
import sys
from wrapper_base import *
+from py_wrap_type import *
class PythonCAPISubProgram(WrapperBase):
"""
Fortran subprogram hooks.
"""
+
+ header_template = '''\
+#define %(name)s_f F_FUNC(%(name)s, %(NAME)s)
+'''
+ typedef_template = ''
+ extern_template = '''\
+extern void %(name)s_f();
+'''
+ objdecl_template = '''\
+static char %(cname)s__doc[] = "";
+'''
+ module_init_template = ''
+ module_method_template = '''\
+{"%(name)s", (PyCFunction)%(cname)s, METH_VARARGS | METH_KEYWORDS, %(cname)s__doc},'''
+ c_code_template = ''
+ capi_code_template = '''\
+static PyObject* %(cname)s(PyObject *capi_self, PyObject *capi_args, PyObject *capi_keywds) {
+ PyObject * volatile capi_buildvalue = NULL;
+ volatile int f2py_success = 1;
+ %(decl_list)s
+ static char *capi_kwlist[] = {%(kw_clist+optkw_clist+extrakw_clist+["NULL"])s};
+ if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,
+ "%(pyarg_format_elist)s",
+ %(["capi_kwlist"]+pyarg_obj_clist)s))
+ return NULL;
+ %(frompyobj_list)s
+ %(call_list)s
+ f2py_success = !PyErr_Occurred();
+ if (f2py_success) {
+ %(pyobjfrom_list)s
+ capi_buildvalue = Py_BuildValue("%(return_format_elist)s"
+ %(return_obj_list)s);
+ %(clean_pyobjfrom_list)s
+ }
+ %(clean_call_list)s
+ %(clean_frompyobj_list)s
+ return capi_buildvalue;
+}
+'''
+ fortran_code_template = ''
+
_defined = []
def __init__(self, parent, block):
WrapperBase.__init__(self)
self.name = name = block.name
- if name in self._defined:
+ self.cname = cname = '%s_%s' % (parent.cname,name)
+ if cname in self._defined:
return
- self._defined.append(name)
- self.info('Generating interface for %s: %s' % (block.__class__, name))
+ self._defined.append(cname)
+ self.info('Generating interface for %s: %s' % (block.__class__, cname))
+
+
+ self.decl_list = []
+ self.kw_list = []
+ self.optkw_list = []
+ self.extrakw_list = []
+ self.pyarg_format_list = []
+ self.pyarg_obj_list = []
+ self.frompyobj_list = []
+ self.call_list = []
+ self.pyobjfrom_list = []
+ self.return_format_list = []
+ self.return_obj_list = []
+ self.buildvalue_list = []
+ self.clean_pyobjfrom_list = []
+ self.clean_call_list = []
+ self.clean_frompyobj_list = []
+
+ args_f = []
+ for argname in block.args:
+ var = block.a.variables[argname]
+ typedecl = var.get_typedecl()
+ PythonCAPIType(parent, typedecl)
+ ctype = typedecl.get_c_type()
+ self.decl_list.append('%s %s;' % (ctype, argname))
+ self.kw_list.append('"%s"' % (argname))
+ self.pyarg_format_list.append('O&')
+ self.pyarg_obj_list.append('\npyobj_to_%s, &%s' % (ctype, argname))
+ if 1: # is_scalar
+ args_f.append('&'+argname)
+ else:
+ args_f.append(argname)
+ WrapperCPPMacro(parent, 'F_FUNC')
+ self.call_list.append('%s_f(%s);' % (name,', '.join(args_f)))
- raise NotImplementedError,`name,block.__class__`
+ self.clean_pyobjfrom_list.reverse()
+ self.clean_call_list.reverse()
+ self.clean_frompyobj_list.reverse()
+ if self.return_obj_list: self.return_obj_list.insert(0,'')
+ parent.apply_templates(self)
return