Chris@87
|
1 #!/usr/bin/env python
|
Chris@87
|
2 """
|
Chris@87
|
3
|
Chris@87
|
4 Rules for building C/API module with f2py2e.
|
Chris@87
|
5
|
Chris@87
|
6 Here is a skeleton of a new wrapper function (13Dec2001):
|
Chris@87
|
7
|
Chris@87
|
8 wrapper_function(args)
|
Chris@87
|
9 declarations
|
Chris@87
|
10 get_python_arguments, say, `a' and `b'
|
Chris@87
|
11
|
Chris@87
|
12 get_a_from_python
|
Chris@87
|
13 if (successful) {
|
Chris@87
|
14
|
Chris@87
|
15 get_b_from_python
|
Chris@87
|
16 if (successful) {
|
Chris@87
|
17
|
Chris@87
|
18 callfortran
|
Chris@87
|
19 if (succesful) {
|
Chris@87
|
20
|
Chris@87
|
21 put_a_to_python
|
Chris@87
|
22 if (succesful) {
|
Chris@87
|
23
|
Chris@87
|
24 put_b_to_python
|
Chris@87
|
25 if (succesful) {
|
Chris@87
|
26
|
Chris@87
|
27 buildvalue = ...
|
Chris@87
|
28
|
Chris@87
|
29 }
|
Chris@87
|
30
|
Chris@87
|
31 }
|
Chris@87
|
32
|
Chris@87
|
33 }
|
Chris@87
|
34
|
Chris@87
|
35 }
|
Chris@87
|
36 cleanup_b
|
Chris@87
|
37
|
Chris@87
|
38 }
|
Chris@87
|
39 cleanup_a
|
Chris@87
|
40
|
Chris@87
|
41 return buildvalue
|
Chris@87
|
42
|
Chris@87
|
43 Copyright 1999,2000 Pearu Peterson all rights reserved,
|
Chris@87
|
44 Pearu Peterson <pearu@ioc.ee>
|
Chris@87
|
45 Permission to use, modify, and distribute this software is given under the
|
Chris@87
|
46 terms of the NumPy License.
|
Chris@87
|
47
|
Chris@87
|
48 NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
|
Chris@87
|
49 $Date: 2005/08/30 08:58:42 $
|
Chris@87
|
50 Pearu Peterson
|
Chris@87
|
51
|
Chris@87
|
52 """
|
Chris@87
|
53 from __future__ import division, absolute_import, print_function
|
Chris@87
|
54
|
Chris@87
|
55 __version__ = "$Revision: 1.129 $"[10:-1]
|
Chris@87
|
56
|
Chris@87
|
57 from . import __version__
|
Chris@87
|
58 f2py_version = __version__.version
|
Chris@87
|
59
|
Chris@87
|
60 import pprint
|
Chris@87
|
61 import sys
|
Chris@87
|
62 import time
|
Chris@87
|
63 import copy
|
Chris@87
|
64
|
Chris@87
|
65 from .auxfuncs import *
|
Chris@87
|
66 from . import capi_maps
|
Chris@87
|
67 from .capi_maps import *
|
Chris@87
|
68 from . import cfuncs
|
Chris@87
|
69 from . import common_rules
|
Chris@87
|
70 from . import use_rules
|
Chris@87
|
71 from . import f90mod_rules
|
Chris@87
|
72 from . import func2subr
|
Chris@87
|
73
|
Chris@87
|
74 errmess = sys.stderr.write
|
Chris@87
|
75 outmess = sys.stdout.write
|
Chris@87
|
76 show = pprint.pprint
|
Chris@87
|
77
|
Chris@87
|
78 options={}
|
Chris@87
|
79 sepdict={}
|
Chris@87
|
80 #for k in ['need_cfuncs']: sepdict[k]=','
|
Chris@87
|
81 for k in ['decl',
|
Chris@87
|
82 'frompyobj',
|
Chris@87
|
83 'cleanupfrompyobj',
|
Chris@87
|
84 'topyarr', 'method',
|
Chris@87
|
85 'pyobjfrom', 'closepyobjfrom',
|
Chris@87
|
86 'freemem',
|
Chris@87
|
87 'userincludes',
|
Chris@87
|
88 'includes0', 'includes', 'typedefs', 'typedefs_generated',
|
Chris@87
|
89 'cppmacros', 'cfuncs', 'callbacks',
|
Chris@87
|
90 'latexdoc',
|
Chris@87
|
91 'restdoc',
|
Chris@87
|
92 'routine_defs', 'externroutines',
|
Chris@87
|
93 'initf2pywraphooks',
|
Chris@87
|
94 'commonhooks', 'initcommonhooks',
|
Chris@87
|
95 'f90modhooks', 'initf90modhooks']:
|
Chris@87
|
96 sepdict[k]='\n'
|
Chris@87
|
97
|
Chris@87
|
98 #################### Rules for C/API module #################
|
Chris@87
|
99
|
Chris@87
|
100 module_rules={
|
Chris@87
|
101 'modulebody':"""\
|
Chris@87
|
102 /* File: #modulename#module.c
|
Chris@87
|
103 * This file is auto-generated with f2py (version:#f2py_version#).
|
Chris@87
|
104 * f2py is a Fortran to Python Interface Generator (FPIG), Second Edition,
|
Chris@87
|
105 * written by Pearu Peterson <pearu@cens.ioc.ee>.
|
Chris@87
|
106 * See http://cens.ioc.ee/projects/f2py2e/
|
Chris@87
|
107 * Generation date: """+time.asctime(time.localtime(time.time()))+"""
|
Chris@87
|
108 * $R"""+"""evision:$
|
Chris@87
|
109 * $D"""+"""ate:$
|
Chris@87
|
110 * Do not edit this file directly unless you know what you are doing!!!
|
Chris@87
|
111 */
|
Chris@87
|
112 #ifdef __cplusplus
|
Chris@87
|
113 extern \"C\" {
|
Chris@87
|
114 #endif
|
Chris@87
|
115
|
Chris@87
|
116 """+gentitle("See f2py2e/cfuncs.py: includes")+"""
|
Chris@87
|
117 #includes#
|
Chris@87
|
118 #includes0#
|
Chris@87
|
119
|
Chris@87
|
120 """+gentitle("See f2py2e/rules.py: mod_rules['modulebody']")+"""
|
Chris@87
|
121 static PyObject *#modulename#_error;
|
Chris@87
|
122 static PyObject *#modulename#_module;
|
Chris@87
|
123
|
Chris@87
|
124 """+gentitle("See f2py2e/cfuncs.py: typedefs")+"""
|
Chris@87
|
125 #typedefs#
|
Chris@87
|
126
|
Chris@87
|
127 """+gentitle("See f2py2e/cfuncs.py: typedefs_generated")+"""
|
Chris@87
|
128 #typedefs_generated#
|
Chris@87
|
129
|
Chris@87
|
130 """+gentitle("See f2py2e/cfuncs.py: cppmacros")+"""
|
Chris@87
|
131 #cppmacros#
|
Chris@87
|
132
|
Chris@87
|
133 """+gentitle("See f2py2e/cfuncs.py: cfuncs")+"""
|
Chris@87
|
134 #cfuncs#
|
Chris@87
|
135
|
Chris@87
|
136 """+gentitle("See f2py2e/cfuncs.py: userincludes")+"""
|
Chris@87
|
137 #userincludes#
|
Chris@87
|
138
|
Chris@87
|
139 """+gentitle("See f2py2e/capi_rules.py: usercode")+"""
|
Chris@87
|
140 #usercode#
|
Chris@87
|
141
|
Chris@87
|
142 /* See f2py2e/rules.py */
|
Chris@87
|
143 #externroutines#
|
Chris@87
|
144
|
Chris@87
|
145 """+gentitle("See f2py2e/capi_rules.py: usercode1")+"""
|
Chris@87
|
146 #usercode1#
|
Chris@87
|
147
|
Chris@87
|
148 """+gentitle("See f2py2e/cb_rules.py: buildcallback")+"""
|
Chris@87
|
149 #callbacks#
|
Chris@87
|
150
|
Chris@87
|
151 """+gentitle("See f2py2e/rules.py: buildapi")+"""
|
Chris@87
|
152 #body#
|
Chris@87
|
153
|
Chris@87
|
154 """+gentitle("See f2py2e/f90mod_rules.py: buildhooks")+"""
|
Chris@87
|
155 #f90modhooks#
|
Chris@87
|
156
|
Chris@87
|
157 """+gentitle("See f2py2e/rules.py: module_rules['modulebody']")+"""
|
Chris@87
|
158
|
Chris@87
|
159 """+gentitle("See f2py2e/common_rules.py: buildhooks")+"""
|
Chris@87
|
160 #commonhooks#
|
Chris@87
|
161
|
Chris@87
|
162 """+gentitle("See f2py2e/rules.py")+"""
|
Chris@87
|
163
|
Chris@87
|
164 static FortranDataDef f2py_routine_defs[] = {
|
Chris@87
|
165 #routine_defs#
|
Chris@87
|
166 \t{NULL}
|
Chris@87
|
167 };
|
Chris@87
|
168
|
Chris@87
|
169 static PyMethodDef f2py_module_methods[] = {
|
Chris@87
|
170 #pymethoddef#
|
Chris@87
|
171 \t{NULL,NULL}
|
Chris@87
|
172 };
|
Chris@87
|
173
|
Chris@87
|
174 #if PY_VERSION_HEX >= 0x03000000
|
Chris@87
|
175 static struct PyModuleDef moduledef = {
|
Chris@87
|
176 \tPyModuleDef_HEAD_INIT,
|
Chris@87
|
177 \t"#modulename#",
|
Chris@87
|
178 \tNULL,
|
Chris@87
|
179 \t-1,
|
Chris@87
|
180 \tf2py_module_methods,
|
Chris@87
|
181 \tNULL,
|
Chris@87
|
182 \tNULL,
|
Chris@87
|
183 \tNULL,
|
Chris@87
|
184 \tNULL
|
Chris@87
|
185 };
|
Chris@87
|
186 #endif
|
Chris@87
|
187
|
Chris@87
|
188 #if PY_VERSION_HEX >= 0x03000000
|
Chris@87
|
189 #define RETVAL m
|
Chris@87
|
190 PyMODINIT_FUNC PyInit_#modulename#(void) {
|
Chris@87
|
191 #else
|
Chris@87
|
192 #define RETVAL
|
Chris@87
|
193 PyMODINIT_FUNC init#modulename#(void) {
|
Chris@87
|
194 #endif
|
Chris@87
|
195 \tint i;
|
Chris@87
|
196 \tPyObject *m,*d, *s;
|
Chris@87
|
197 #if PY_VERSION_HEX >= 0x03000000
|
Chris@87
|
198 \tm = #modulename#_module = PyModule_Create(&moduledef);
|
Chris@87
|
199 #else
|
Chris@87
|
200 \tm = #modulename#_module = Py_InitModule(\"#modulename#\", f2py_module_methods);
|
Chris@87
|
201 #endif
|
Chris@87
|
202 \tPy_TYPE(&PyFortran_Type) = &PyType_Type;
|
Chris@87
|
203 \timport_array();
|
Chris@87
|
204 \tif (PyErr_Occurred())
|
Chris@87
|
205 \t\t{PyErr_SetString(PyExc_ImportError, \"can't initialize module #modulename# (failed to import numpy)\"); return RETVAL;}
|
Chris@87
|
206 \td = PyModule_GetDict(m);
|
Chris@87
|
207 \ts = PyString_FromString(\"$R"""+"""evision: $\");
|
Chris@87
|
208 \tPyDict_SetItemString(d, \"__version__\", s);
|
Chris@87
|
209 #if PY_VERSION_HEX >= 0x03000000
|
Chris@87
|
210 \ts = PyUnicode_FromString(
|
Chris@87
|
211 #else
|
Chris@87
|
212 \ts = PyString_FromString(
|
Chris@87
|
213 #endif
|
Chris@87
|
214 \t\t\"This module '#modulename#' is auto-generated with f2py (version:#f2py_version#).\\nFunctions:\\n\"\n#docs#\".\");
|
Chris@87
|
215 \tPyDict_SetItemString(d, \"__doc__\", s);
|
Chris@87
|
216 \t#modulename#_error = PyErr_NewException (\"#modulename#.error\", NULL, NULL);
|
Chris@87
|
217 \tPy_DECREF(s);
|
Chris@87
|
218 \tfor(i=0;f2py_routine_defs[i].name!=NULL;i++)
|
Chris@87
|
219 \t\tPyDict_SetItemString(d, f2py_routine_defs[i].name,PyFortranObject_NewAsAttr(&f2py_routine_defs[i]));
|
Chris@87
|
220 #initf2pywraphooks#
|
Chris@87
|
221 #initf90modhooks#
|
Chris@87
|
222 #initcommonhooks#
|
Chris@87
|
223 #interface_usercode#
|
Chris@87
|
224
|
Chris@87
|
225 #ifdef F2PY_REPORT_ATEXIT
|
Chris@87
|
226 \tif (! PyErr_Occurred())
|
Chris@87
|
227 \t\ton_exit(f2py_report_on_exit,(void*)\"#modulename#\");
|
Chris@87
|
228 #endif
|
Chris@87
|
229
|
Chris@87
|
230 \treturn RETVAL;
|
Chris@87
|
231 }
|
Chris@87
|
232 #ifdef __cplusplus
|
Chris@87
|
233 }
|
Chris@87
|
234 #endif
|
Chris@87
|
235 """,
|
Chris@87
|
236 'separatorsfor':{'latexdoc':'\n\n',
|
Chris@87
|
237 'restdoc':'\n\n'},
|
Chris@87
|
238 'latexdoc':['\\section{Module \\texttt{#texmodulename#}}\n',
|
Chris@87
|
239 '#modnote#\n',
|
Chris@87
|
240 '#latexdoc#'],
|
Chris@87
|
241 'restdoc':['Module #modulename#\n'+'='*80,
|
Chris@87
|
242 '\n#restdoc#']
|
Chris@87
|
243 }
|
Chris@87
|
244
|
Chris@87
|
245 defmod_rules=[
|
Chris@87
|
246 {'body': '/*eof body*/',
|
Chris@87
|
247 'method': '/*eof method*/',
|
Chris@87
|
248 'externroutines': '/*eof externroutines*/',
|
Chris@87
|
249 'routine_defs': '/*eof routine_defs*/',
|
Chris@87
|
250 'initf90modhooks': '/*eof initf90modhooks*/',
|
Chris@87
|
251 'initf2pywraphooks': '/*eof initf2pywraphooks*/',
|
Chris@87
|
252 'initcommonhooks': '/*eof initcommonhooks*/',
|
Chris@87
|
253 'latexdoc': '',
|
Chris@87
|
254 'restdoc': '',
|
Chris@87
|
255 'modnote': {hasnote:'#note#',l_not(hasnote):''},
|
Chris@87
|
256 }
|
Chris@87
|
257 ]
|
Chris@87
|
258
|
Chris@87
|
259 routine_rules={
|
Chris@87
|
260 'separatorsfor':sepdict,
|
Chris@87
|
261 'body':"""
|
Chris@87
|
262 #begintitle#
|
Chris@87
|
263 static char doc_#apiname#[] = \"\\\n#docreturn##name#(#docsignatureshort#)\\n\\nWrapper for ``#name#``.\\\n\\n#docstrsigns#\";
|
Chris@87
|
264 /* #declfortranroutine# */
|
Chris@87
|
265 static PyObject *#apiname#(const PyObject *capi_self,
|
Chris@87
|
266 PyObject *capi_args,
|
Chris@87
|
267 PyObject *capi_keywds,
|
Chris@87
|
268 #functype# (*f2py_func)(#callprotoargument#)) {
|
Chris@87
|
269 \tPyObject * volatile capi_buildvalue = NULL;
|
Chris@87
|
270 \tvolatile int f2py_success = 1;
|
Chris@87
|
271 #decl#
|
Chris@87
|
272 \tstatic char *capi_kwlist[] = {#kwlist##kwlistopt##kwlistxa#NULL};
|
Chris@87
|
273 #usercode#
|
Chris@87
|
274 #routdebugenter#
|
Chris@87
|
275 #ifdef F2PY_REPORT_ATEXIT
|
Chris@87
|
276 f2py_start_clock();
|
Chris@87
|
277 #endif
|
Chris@87
|
278 \tif (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\\
|
Chris@87
|
279 \t\t\"#argformat##keyformat##xaformat#:#pyname#\",\\
|
Chris@87
|
280 \t\tcapi_kwlist#args_capi##keys_capi##keys_xa#))\n\t\treturn NULL;
|
Chris@87
|
281 #frompyobj#
|
Chris@87
|
282 /*end of frompyobj*/
|
Chris@87
|
283 #ifdef F2PY_REPORT_ATEXIT
|
Chris@87
|
284 f2py_start_call_clock();
|
Chris@87
|
285 #endif
|
Chris@87
|
286 #callfortranroutine#
|
Chris@87
|
287 if (PyErr_Occurred())
|
Chris@87
|
288 f2py_success = 0;
|
Chris@87
|
289 #ifdef F2PY_REPORT_ATEXIT
|
Chris@87
|
290 f2py_stop_call_clock();
|
Chris@87
|
291 #endif
|
Chris@87
|
292 /*end of callfortranroutine*/
|
Chris@87
|
293 \t\tif (f2py_success) {
|
Chris@87
|
294 #pyobjfrom#
|
Chris@87
|
295 /*end of pyobjfrom*/
|
Chris@87
|
296 \t\tCFUNCSMESS(\"Building return value.\\n\");
|
Chris@87
|
297 \t\tcapi_buildvalue = Py_BuildValue(\"#returnformat#\"#return#);
|
Chris@87
|
298 /*closepyobjfrom*/
|
Chris@87
|
299 #closepyobjfrom#
|
Chris@87
|
300 \t\t} /*if (f2py_success) after callfortranroutine*/
|
Chris@87
|
301 /*cleanupfrompyobj*/
|
Chris@87
|
302 #cleanupfrompyobj#
|
Chris@87
|
303 \tif (capi_buildvalue == NULL) {
|
Chris@87
|
304 #routdebugfailure#
|
Chris@87
|
305 \t} else {
|
Chris@87
|
306 #routdebugleave#
|
Chris@87
|
307 \t}
|
Chris@87
|
308 \tCFUNCSMESS(\"Freeing memory.\\n\");
|
Chris@87
|
309 #freemem#
|
Chris@87
|
310 #ifdef F2PY_REPORT_ATEXIT
|
Chris@87
|
311 f2py_stop_clock();
|
Chris@87
|
312 #endif
|
Chris@87
|
313 \treturn capi_buildvalue;
|
Chris@87
|
314 }
|
Chris@87
|
315 #endtitle#
|
Chris@87
|
316 """,
|
Chris@87
|
317 'routine_defs':'#routine_def#',
|
Chris@87
|
318 'initf2pywraphooks':'#initf2pywraphook#',
|
Chris@87
|
319 'externroutines':'#declfortranroutine#',
|
Chris@87
|
320 'doc':'#docreturn##name#(#docsignature#)',
|
Chris@87
|
321 'docshort':'#docreturn##name#(#docsignatureshort#)',
|
Chris@87
|
322 'docs':'"\t#docreturn##name#(#docsignature#)\\n"\n',
|
Chris@87
|
323 'need':['arrayobject.h', 'CFUNCSMESS', 'MINMAX'],
|
Chris@87
|
324 'cppmacros':{debugcapi:'#define DEBUGCFUNCS'},
|
Chris@87
|
325 'latexdoc':['\\subsection{Wrapper function \\texttt{#texname#}}\n',
|
Chris@87
|
326 """
|
Chris@87
|
327 \\noindent{{}\\verb@#docreturn##name#@{}}\\texttt{(#latexdocsignatureshort#)}
|
Chris@87
|
328 #routnote#
|
Chris@87
|
329
|
Chris@87
|
330 #latexdocstrsigns#
|
Chris@87
|
331 """],
|
Chris@87
|
332 'restdoc':['Wrapped function ``#name#``\n'+'-'*80,
|
Chris@87
|
333
|
Chris@87
|
334 ]
|
Chris@87
|
335 }
|
Chris@87
|
336
|
Chris@87
|
337 ################## Rules for C/API function ##############
|
Chris@87
|
338
|
Chris@87
|
339 rout_rules=[
|
Chris@87
|
340 { # Init
|
Chris@87
|
341 'separatorsfor': {'callfortranroutine': '\n', 'routdebugenter': '\n', 'decl': '\n',
|
Chris@87
|
342 'routdebugleave': '\n', 'routdebugfailure': '\n',
|
Chris@87
|
343 'setjmpbuf': ' || ',
|
Chris@87
|
344 'docstrreq': '\n', 'docstropt': '\n', 'docstrout': '\n',
|
Chris@87
|
345 'docstrcbs': '\n', 'docstrsigns': '\\n"\n"',
|
Chris@87
|
346 'latexdocstrsigns': '\n',
|
Chris@87
|
347 'latexdocstrreq': '\n', 'latexdocstropt': '\n',
|
Chris@87
|
348 'latexdocstrout': '\n', 'latexdocstrcbs': '\n',
|
Chris@87
|
349 },
|
Chris@87
|
350 'kwlist': '', 'kwlistopt': '', 'callfortran': '', 'callfortranappend': '',
|
Chris@87
|
351 'docsign': '', 'docsignopt': '', 'decl': '/*decl*/',
|
Chris@87
|
352 'freemem': '/*freemem*/',
|
Chris@87
|
353 'docsignshort': '', 'docsignoptshort': '',
|
Chris@87
|
354 'docstrsigns': '', 'latexdocstrsigns': '',
|
Chris@87
|
355 'docstrreq': '\\nParameters\\n----------',
|
Chris@87
|
356 'docstropt': '\\nOther Parameters\\n----------------',
|
Chris@87
|
357 'docstrout': '\\nReturns\\n-------',
|
Chris@87
|
358 'docstrcbs': '\\nNotes\\n-----\\nCall-back functions::\\n',
|
Chris@87
|
359 'latexdocstrreq': '\\noindent Required arguments:',
|
Chris@87
|
360 'latexdocstropt': '\\noindent Optional arguments:',
|
Chris@87
|
361 'latexdocstrout': '\\noindent Return objects:',
|
Chris@87
|
362 'latexdocstrcbs': '\\noindent Call-back functions:',
|
Chris@87
|
363 'args_capi': '', 'keys_capi': '', 'functype': '',
|
Chris@87
|
364 'frompyobj': '/*frompyobj*/',
|
Chris@87
|
365 'cleanupfrompyobj': ['/*end of cleanupfrompyobj*/'], #this list will be reversed
|
Chris@87
|
366 'pyobjfrom': '/*pyobjfrom*/',
|
Chris@87
|
367 'closepyobjfrom': ['/*end of closepyobjfrom*/'], #this list will be reversed
|
Chris@87
|
368 'topyarr': '/*topyarr*/', 'routdebugleave': '/*routdebugleave*/',
|
Chris@87
|
369 'routdebugenter': '/*routdebugenter*/',
|
Chris@87
|
370 'routdebugfailure': '/*routdebugfailure*/',
|
Chris@87
|
371 'callfortranroutine': '/*callfortranroutine*/',
|
Chris@87
|
372 'argformat': '', 'keyformat': '', 'need_cfuncs': '',
|
Chris@87
|
373 'docreturn': '', 'return': '', 'returnformat': '', 'rformat': '',
|
Chris@87
|
374 'kwlistxa': '', 'keys_xa': '', 'xaformat': '', 'docsignxa': '', 'docsignxashort': '',
|
Chris@87
|
375 'initf2pywraphook': '',
|
Chris@87
|
376 'routnote': {hasnote:'--- #note#',l_not(hasnote):''},
|
Chris@87
|
377 }, {
|
Chris@87
|
378 'apiname':'f2py_rout_#modulename#_#name#',
|
Chris@87
|
379 'pyname':'#modulename#.#name#',
|
Chris@87
|
380 'decl':'',
|
Chris@87
|
381 '_check':l_not(ismoduleroutine)
|
Chris@87
|
382 }, {
|
Chris@87
|
383 'apiname':'f2py_rout_#modulename#_#f90modulename#_#name#',
|
Chris@87
|
384 'pyname':'#modulename#.#f90modulename#.#name#',
|
Chris@87
|
385 'decl':'',
|
Chris@87
|
386 '_check':ismoduleroutine
|
Chris@87
|
387 }, { # Subroutine
|
Chris@87
|
388 'functype': 'void',
|
Chris@87
|
389 'declfortranroutine': {l_and(l_not(l_or(ismoduleroutine, isintent_c)), l_not(isdummyroutine)):'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',
|
Chris@87
|
390 l_and(l_not(ismoduleroutine), isintent_c, l_not(isdummyroutine)):'extern void #fortranname#(#callprotoargument#);',
|
Chris@87
|
391 ismoduleroutine:'',
|
Chris@87
|
392 isdummyroutine:''
|
Chris@87
|
393 },
|
Chris@87
|
394 'routine_def': {l_not(l_or(ismoduleroutine, isintent_c, isdummyroutine)): '\t{\"#name#\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
|
Chris@87
|
395 l_and(l_not(ismoduleroutine), isintent_c, l_not(isdummyroutine)): '\t{\"#name#\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',
|
Chris@87
|
396 l_and(l_not(ismoduleroutine), isdummyroutine): '\t{\"#name#\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',
|
Chris@87
|
397 },
|
Chris@87
|
398 'need': {l_and(l_not(l_or(ismoduleroutine, isintent_c)), l_not(isdummyroutine)):'F_FUNC'},
|
Chris@87
|
399 'callfortranroutine': [
|
Chris@87
|
400 {debugcapi:["""\tfprintf(stderr,\"debug-capi:Fortran subroutine `#fortranname#(#callfortran#)\'\\n\");"""]},
|
Chris@87
|
401 {hasexternals:"""\
|
Chris@87
|
402 \t\tif (#setjmpbuf#) {
|
Chris@87
|
403 \t\t\tf2py_success = 0;
|
Chris@87
|
404 \t\t} else {"""},
|
Chris@87
|
405 {isthreadsafe:'\t\t\tPy_BEGIN_ALLOW_THREADS'},
|
Chris@87
|
406 {hascallstatement:'''\t\t\t\t#callstatement#;
|
Chris@87
|
407 \t\t\t\t/*(*f2py_func)(#callfortran#);*/'''},
|
Chris@87
|
408 {l_not(l_or(hascallstatement, isdummyroutine)):'\t\t\t\t(*f2py_func)(#callfortran#);'},
|
Chris@87
|
409 {isthreadsafe:'\t\t\tPy_END_ALLOW_THREADS'},
|
Chris@87
|
410 {hasexternals:"""\t\t}"""}
|
Chris@87
|
411 ],
|
Chris@87
|
412 '_check': l_and(issubroutine, l_not(issubroutine_wrap)),
|
Chris@87
|
413 }, { # Wrapped function
|
Chris@87
|
414 'functype': 'void',
|
Chris@87
|
415 'declfortranroutine': {l_not(l_or(ismoduleroutine, isdummyroutine)): 'extern void #F_WRAPPEDFUNC#(#name_lower#,#NAME#)(#callprotoargument#);',
|
Chris@87
|
416 isdummyroutine: '',
|
Chris@87
|
417 },
|
Chris@87
|
418
|
Chris@87
|
419 'routine_def': {l_not(l_or(ismoduleroutine, isdummyroutine)): '\t{\"#name#\",-1,{{-1}},0,(char *)#F_WRAPPEDFUNC#(#name_lower#,#NAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
|
Chris@87
|
420 isdummyroutine: '\t{\"#name#\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',
|
Chris@87
|
421 },
|
Chris@87
|
422 'initf2pywraphook': {l_not(l_or(ismoduleroutine, isdummyroutine)):'''
|
Chris@87
|
423 {
|
Chris@87
|
424 extern #ctype# #F_FUNC#(#name_lower#,#NAME#)(void);
|
Chris@87
|
425 PyObject* o = PyDict_GetItemString(d,"#name#");
|
Chris@87
|
426 PyObject_SetAttrString(o,"_cpointer", F2PyCapsule_FromVoidPtr((void*)#F_FUNC#(#name_lower#,#NAME#),NULL));
|
Chris@87
|
427 #if PY_VERSION_HEX >= 0x03000000
|
Chris@87
|
428 PyObject_SetAttrString(o,"__name__", PyUnicode_FromString("#name#"));
|
Chris@87
|
429 #else
|
Chris@87
|
430 PyObject_SetAttrString(o,"__name__", PyString_FromString("#name#"));
|
Chris@87
|
431 #endif
|
Chris@87
|
432 }
|
Chris@87
|
433 '''},
|
Chris@87
|
434 'need': {l_not(l_or(ismoduleroutine, isdummyroutine)):['F_WRAPPEDFUNC', 'F_FUNC']},
|
Chris@87
|
435 'callfortranroutine': [
|
Chris@87
|
436 {debugcapi:["""\tfprintf(stderr,\"debug-capi:Fortran subroutine `f2pywrap#name_lower#(#callfortran#)\'\\n\");"""]},
|
Chris@87
|
437 {hasexternals:"""\
|
Chris@87
|
438 \tif (#setjmpbuf#) {
|
Chris@87
|
439 \t\tf2py_success = 0;
|
Chris@87
|
440 \t} else {"""},
|
Chris@87
|
441 {isthreadsafe:'\tPy_BEGIN_ALLOW_THREADS'},
|
Chris@87
|
442 {l_not(l_or(hascallstatement, isdummyroutine)):'\t(*f2py_func)(#callfortran#);'},
|
Chris@87
|
443 {hascallstatement:'\t#callstatement#;\n\t/*(*f2py_func)(#callfortran#);*/'},
|
Chris@87
|
444 {isthreadsafe:'\tPy_END_ALLOW_THREADS'},
|
Chris@87
|
445 {hasexternals:'\t}'}
|
Chris@87
|
446 ],
|
Chris@87
|
447 '_check': isfunction_wrap,
|
Chris@87
|
448 }, { # Wrapped subroutine
|
Chris@87
|
449 'functype': 'void',
|
Chris@87
|
450 'declfortranroutine': {l_not(l_or(ismoduleroutine, isdummyroutine)): 'extern void #F_WRAPPEDFUNC#(#name_lower#,#NAME#)(#callprotoargument#);',
|
Chris@87
|
451 isdummyroutine: '',
|
Chris@87
|
452 },
|
Chris@87
|
453
|
Chris@87
|
454 'routine_def': {l_not(l_or(ismoduleroutine, isdummyroutine)): '\t{\"#name#\",-1,{{-1}},0,(char *)#F_WRAPPEDFUNC#(#name_lower#,#NAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
|
Chris@87
|
455 isdummyroutine: '\t{\"#name#\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',
|
Chris@87
|
456 },
|
Chris@87
|
457 'initf2pywraphook': {l_not(l_or(ismoduleroutine, isdummyroutine)):'''
|
Chris@87
|
458 {
|
Chris@87
|
459 extern void #F_FUNC#(#name_lower#,#NAME#)(void);
|
Chris@87
|
460 PyObject* o = PyDict_GetItemString(d,"#name#");
|
Chris@87
|
461 PyObject_SetAttrString(o,"_cpointer", F2PyCapsule_FromVoidPtr((void*)#F_FUNC#(#name_lower#,#NAME#),NULL));
|
Chris@87
|
462 #if PY_VERSION_HEX >= 0x03000000
|
Chris@87
|
463 PyObject_SetAttrString(o,"__name__", PyUnicode_FromString("#name#"));
|
Chris@87
|
464 #else
|
Chris@87
|
465 PyObject_SetAttrString(o,"__name__", PyString_FromString("#name#"));
|
Chris@87
|
466 #endif
|
Chris@87
|
467 }
|
Chris@87
|
468 '''},
|
Chris@87
|
469 'need': {l_not(l_or(ismoduleroutine, isdummyroutine)):['F_WRAPPEDFUNC', 'F_FUNC']},
|
Chris@87
|
470 'callfortranroutine': [
|
Chris@87
|
471 {debugcapi:["""\tfprintf(stderr,\"debug-capi:Fortran subroutine `f2pywrap#name_lower#(#callfortran#)\'\\n\");"""]},
|
Chris@87
|
472 {hasexternals:"""\
|
Chris@87
|
473 \tif (#setjmpbuf#) {
|
Chris@87
|
474 \t\tf2py_success = 0;
|
Chris@87
|
475 \t} else {"""},
|
Chris@87
|
476 {isthreadsafe:'\tPy_BEGIN_ALLOW_THREADS'},
|
Chris@87
|
477 {l_not(l_or(hascallstatement, isdummyroutine)):'\t(*f2py_func)(#callfortran#);'},
|
Chris@87
|
478 {hascallstatement:'\t#callstatement#;\n\t/*(*f2py_func)(#callfortran#);*/'},
|
Chris@87
|
479 {isthreadsafe:'\tPy_END_ALLOW_THREADS'},
|
Chris@87
|
480 {hasexternals:'\t}'}
|
Chris@87
|
481 ],
|
Chris@87
|
482 '_check': issubroutine_wrap,
|
Chris@87
|
483 }, { # Function
|
Chris@87
|
484 'functype':'#ctype#',
|
Chris@87
|
485 'docreturn':{l_not(isintent_hide):'#rname#,'},
|
Chris@87
|
486 'docstrout':'#pydocsignout#',
|
Chris@87
|
487 'latexdocstrout':['\\item[]{{}\\verb@#pydocsignout#@{}}',
|
Chris@87
|
488 {hasresultnote:'--- #resultnote#'}],
|
Chris@87
|
489 'callfortranroutine':[{l_and(debugcapi, isstringfunction):"""\
|
Chris@87
|
490 #ifdef USESCOMPAQFORTRAN
|
Chris@87
|
491 \tfprintf(stderr,\"debug-capi:Fortran function #ctype# #fortranname#(#callcompaqfortran#)\\n\");
|
Chris@87
|
492 #else
|
Chris@87
|
493 \tfprintf(stderr,\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\n\");
|
Chris@87
|
494 #endif
|
Chris@87
|
495 """},
|
Chris@87
|
496 {l_and(debugcapi, l_not(isstringfunction)):"""\
|
Chris@87
|
497 \tfprintf(stderr,\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\n\");
|
Chris@87
|
498 """}
|
Chris@87
|
499 ],
|
Chris@87
|
500 '_check':l_and(isfunction, l_not(isfunction_wrap))
|
Chris@87
|
501 }, { # Scalar function
|
Chris@87
|
502 'declfortranroutine':{l_and(l_not(l_or(ismoduleroutine, isintent_c)), l_not(isdummyroutine)):'extern #ctype# #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',
|
Chris@87
|
503 l_and(l_not(ismoduleroutine), isintent_c, l_not(isdummyroutine)):'extern #ctype# #fortranname#(#callprotoargument#);',
|
Chris@87
|
504 isdummyroutine:''
|
Chris@87
|
505 },
|
Chris@87
|
506 'routine_def':{l_and(l_not(l_or(ismoduleroutine, isintent_c)), l_not(isdummyroutine)): '\t{\"#name#\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
|
Chris@87
|
507 l_and(l_not(ismoduleroutine), isintent_c, l_not(isdummyroutine)): '\t{\"#name#\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',
|
Chris@87
|
508 isdummyroutine: '\t{\"#name#\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',
|
Chris@87
|
509 },
|
Chris@87
|
510 'decl':[{iscomplexfunction_warn:'\t#ctype# #name#_return_value={0,0};',
|
Chris@87
|
511 l_not(iscomplexfunction):'\t#ctype# #name#_return_value=0;'},
|
Chris@87
|
512 {iscomplexfunction:'\tPyObject *#name#_return_value_capi = Py_None;'}
|
Chris@87
|
513 ],
|
Chris@87
|
514 'callfortranroutine':[
|
Chris@87
|
515 {hasexternals:"""\
|
Chris@87
|
516 \tif (#setjmpbuf#) {
|
Chris@87
|
517 \t\tf2py_success = 0;
|
Chris@87
|
518 \t} else {"""},
|
Chris@87
|
519 {isthreadsafe:'\tPy_BEGIN_ALLOW_THREADS'},
|
Chris@87
|
520 {hascallstatement:'''\t#callstatement#;
|
Chris@87
|
521 /*\t#name#_return_value = (*f2py_func)(#callfortran#);*/
|
Chris@87
|
522 '''},
|
Chris@87
|
523 {l_not(l_or(hascallstatement, isdummyroutine)):'\t#name#_return_value = (*f2py_func)(#callfortran#);'},
|
Chris@87
|
524 {isthreadsafe:'\tPy_END_ALLOW_THREADS'},
|
Chris@87
|
525 {hasexternals:'\t}'},
|
Chris@87
|
526 {l_and(debugcapi, iscomplexfunction):'\tfprintf(stderr,"#routdebugshowvalue#\\n",#name#_return_value.r,#name#_return_value.i);'},
|
Chris@87
|
527 {l_and(debugcapi, l_not(iscomplexfunction)):'\tfprintf(stderr,"#routdebugshowvalue#\\n",#name#_return_value);'}],
|
Chris@87
|
528 'pyobjfrom':{iscomplexfunction:'\t#name#_return_value_capi = pyobj_from_#ctype#1(#name#_return_value);'},
|
Chris@87
|
529 'need':[{l_not(isdummyroutine):'F_FUNC'},
|
Chris@87
|
530 {iscomplexfunction:'pyobj_from_#ctype#1'},
|
Chris@87
|
531 {islong_longfunction:'long_long'},
|
Chris@87
|
532 {islong_doublefunction:'long_double'}],
|
Chris@87
|
533 'returnformat':{l_not(isintent_hide):'#rformat#'},
|
Chris@87
|
534 'return':{iscomplexfunction:',#name#_return_value_capi',
|
Chris@87
|
535 l_not(l_or(iscomplexfunction, isintent_hide)):',#name#_return_value'},
|
Chris@87
|
536 '_check':l_and(isfunction, l_not(isstringfunction), l_not(isfunction_wrap))
|
Chris@87
|
537 }, { # String function # in use for --no-wrap
|
Chris@87
|
538 'declfortranroutine':'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',
|
Chris@87
|
539 'routine_def':{l_not(l_or(ismoduleroutine, isintent_c)):
|
Chris@87
|
540 # '\t{\"#name#\",-1,{{-1}},0,(char *)F_FUNC(#fortranname#,#FORTRANNAME#),(void *)#apiname#,doc_#apiname#},',
|
Chris@87
|
541 '\t{\"#name#\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',
|
Chris@87
|
542 l_and(l_not(ismoduleroutine), isintent_c):
|
Chris@87
|
543 # '\t{\"#name#\",-1,{{-1}},0,(char *)#fortranname#,(void *)#apiname#,doc_#apiname#},'
|
Chris@87
|
544 '\t{\"#name#\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},'
|
Chris@87
|
545 },
|
Chris@87
|
546 'decl':['\t#ctype# #name#_return_value = NULL;',
|
Chris@87
|
547 '\tint #name#_return_value_len = 0;'],
|
Chris@87
|
548 'callfortran':'#name#_return_value,#name#_return_value_len,',
|
Chris@87
|
549 'callfortranroutine':['\t#name#_return_value_len = #rlength#;',
|
Chris@87
|
550 '\tif ((#name#_return_value = (string)malloc(sizeof(char)*(#name#_return_value_len+1))) == NULL) {',
|
Chris@87
|
551 '\t\tPyErr_SetString(PyExc_MemoryError, \"out of memory\");',
|
Chris@87
|
552 '\t\tf2py_success = 0;',
|
Chris@87
|
553 '\t} else {',
|
Chris@87
|
554 "\t\t(#name#_return_value)[#name#_return_value_len] = '\\0';",
|
Chris@87
|
555 '\t}',
|
Chris@87
|
556 '\tif (f2py_success) {',
|
Chris@87
|
557 {hasexternals:"""\
|
Chris@87
|
558 \t\tif (#setjmpbuf#) {
|
Chris@87
|
559 \t\t\tf2py_success = 0;
|
Chris@87
|
560 \t\t} else {"""},
|
Chris@87
|
561 {isthreadsafe:'\t\tPy_BEGIN_ALLOW_THREADS'},
|
Chris@87
|
562 """\
|
Chris@87
|
563 #ifdef USESCOMPAQFORTRAN
|
Chris@87
|
564 \t\t(*f2py_func)(#callcompaqfortran#);
|
Chris@87
|
565 #else
|
Chris@87
|
566 \t\t(*f2py_func)(#callfortran#);
|
Chris@87
|
567 #endif
|
Chris@87
|
568 """,
|
Chris@87
|
569 {isthreadsafe:'\t\tPy_END_ALLOW_THREADS'},
|
Chris@87
|
570 {hasexternals:'\t\t}'},
|
Chris@87
|
571 {debugcapi:'\t\tfprintf(stderr,"#routdebugshowvalue#\\n",#name#_return_value_len,#name#_return_value);'},
|
Chris@87
|
572 '\t} /* if (f2py_success) after (string)malloc */',
|
Chris@87
|
573 ],
|
Chris@87
|
574 'returnformat':'#rformat#',
|
Chris@87
|
575 'return':',#name#_return_value',
|
Chris@87
|
576 'freemem':'\tSTRINGFREE(#name#_return_value);',
|
Chris@87
|
577 'need':['F_FUNC', '#ctype#', 'STRINGFREE'],
|
Chris@87
|
578 '_check':l_and(isstringfunction, l_not(isfunction_wrap)) # ???obsolete
|
Chris@87
|
579 },
|
Chris@87
|
580 { # Debugging
|
Chris@87
|
581 'routdebugenter':'\tfprintf(stderr,"debug-capi:Python C/API function #modulename#.#name#(#docsignature#)\\n");',
|
Chris@87
|
582 'routdebugleave':'\tfprintf(stderr,"debug-capi:Python C/API function #modulename#.#name#: successful.\\n");',
|
Chris@87
|
583 'routdebugfailure':'\tfprintf(stderr,"debug-capi:Python C/API function #modulename#.#name#: failure.\\n");',
|
Chris@87
|
584 '_check':debugcapi
|
Chris@87
|
585 }
|
Chris@87
|
586 ]
|
Chris@87
|
587
|
Chris@87
|
588 ################ Rules for arguments ##################
|
Chris@87
|
589
|
Chris@87
|
590 typedef_need_dict = {islong_long: 'long_long',
|
Chris@87
|
591 islong_double: 'long_double',
|
Chris@87
|
592 islong_complex: 'complex_long_double',
|
Chris@87
|
593 isunsigned_char: 'unsigned_char',
|
Chris@87
|
594 isunsigned_short: 'unsigned_short',
|
Chris@87
|
595 isunsigned: 'unsigned',
|
Chris@87
|
596 isunsigned_long_long: 'unsigned_long_long',
|
Chris@87
|
597 isunsigned_chararray: 'unsigned_char',
|
Chris@87
|
598 isunsigned_shortarray: 'unsigned_short',
|
Chris@87
|
599 isunsigned_long_longarray: 'unsigned_long_long',
|
Chris@87
|
600 issigned_long_longarray: 'long_long',
|
Chris@87
|
601 }
|
Chris@87
|
602
|
Chris@87
|
603 aux_rules=[
|
Chris@87
|
604 {
|
Chris@87
|
605 'separatorsfor':sepdict
|
Chris@87
|
606 },
|
Chris@87
|
607 { # Common
|
Chris@87
|
608 'frompyobj': ['\t/* Processing auxiliary variable #varname# */',
|
Chris@87
|
609 {debugcapi:'\tfprintf(stderr,"#vardebuginfo#\\n");'},],
|
Chris@87
|
610 'cleanupfrompyobj': '\t/* End of cleaning variable #varname# */',
|
Chris@87
|
611 'need': typedef_need_dict,
|
Chris@87
|
612 },
|
Chris@87
|
613 # Scalars (not complex)
|
Chris@87
|
614 { # Common
|
Chris@87
|
615 'decl': '\t#ctype# #varname# = 0;',
|
Chris@87
|
616 'need': {hasinitvalue:'math.h'},
|
Chris@87
|
617 'frompyobj': {hasinitvalue:'\t#varname# = #init#;'},
|
Chris@87
|
618 '_check': l_and(isscalar, l_not(iscomplex)),
|
Chris@87
|
619 },
|
Chris@87
|
620 {
|
Chris@87
|
621 'return': ',#varname#',
|
Chris@87
|
622 'docstrout': '#pydocsignout#',
|
Chris@87
|
623 'docreturn': '#outvarname#,',
|
Chris@87
|
624 'returnformat': '#varrformat#',
|
Chris@87
|
625 '_check': l_and(isscalar, l_not(iscomplex), isintent_out),
|
Chris@87
|
626 },
|
Chris@87
|
627 # Complex scalars
|
Chris@87
|
628 { # Common
|
Chris@87
|
629 'decl':'\t#ctype# #varname#;',
|
Chris@87
|
630 'frompyobj': {hasinitvalue:'\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},
|
Chris@87
|
631 '_check':iscomplex
|
Chris@87
|
632 },
|
Chris@87
|
633 # String
|
Chris@87
|
634 { # Common
|
Chris@87
|
635 'decl':['\t#ctype# #varname# = NULL;',
|
Chris@87
|
636 '\tint slen(#varname#);',
|
Chris@87
|
637 ],
|
Chris@87
|
638 'need':['len..'],
|
Chris@87
|
639 '_check':isstring
|
Chris@87
|
640 },
|
Chris@87
|
641 # Array
|
Chris@87
|
642 { # Common
|
Chris@87
|
643 'decl':['\t#ctype# *#varname# = NULL;',
|
Chris@87
|
644 '\tnpy_intp #varname#_Dims[#rank#] = {#rank*[-1]#};',
|
Chris@87
|
645 '\tconst int #varname#_Rank = #rank#;',
|
Chris@87
|
646 ],
|
Chris@87
|
647 'need':['len..', {hasinitvalue:'forcomb'}, {hasinitvalue:'CFUNCSMESS'}],
|
Chris@87
|
648 '_check':isarray
|
Chris@87
|
649 },
|
Chris@87
|
650 # Scalararray
|
Chris@87
|
651 { # Common
|
Chris@87
|
652 '_check':l_and(isarray, l_not(iscomplexarray))
|
Chris@87
|
653 }, { # Not hidden
|
Chris@87
|
654 '_check':l_and(isarray, l_not(iscomplexarray), isintent_nothide)
|
Chris@87
|
655 },
|
Chris@87
|
656 # Integer*1 array
|
Chris@87
|
657 {'need':'#ctype#',
|
Chris@87
|
658 '_check':isint1array,
|
Chris@87
|
659 '_depend':''
|
Chris@87
|
660 },
|
Chris@87
|
661 # Integer*-1 array
|
Chris@87
|
662 {'need':'#ctype#',
|
Chris@87
|
663 '_check':isunsigned_chararray,
|
Chris@87
|
664 '_depend':''
|
Chris@87
|
665 },
|
Chris@87
|
666 # Integer*-2 array
|
Chris@87
|
667 {'need':'#ctype#',
|
Chris@87
|
668 '_check':isunsigned_shortarray,
|
Chris@87
|
669 '_depend':''
|
Chris@87
|
670 },
|
Chris@87
|
671 # Integer*-8 array
|
Chris@87
|
672 {'need':'#ctype#',
|
Chris@87
|
673 '_check':isunsigned_long_longarray,
|
Chris@87
|
674 '_depend':''
|
Chris@87
|
675 },
|
Chris@87
|
676 # Complexarray
|
Chris@87
|
677 {'need':'#ctype#',
|
Chris@87
|
678 '_check':iscomplexarray,
|
Chris@87
|
679 '_depend':''
|
Chris@87
|
680 },
|
Chris@87
|
681 # Stringarray
|
Chris@87
|
682 {
|
Chris@87
|
683 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},
|
Chris@87
|
684 'need':'string',
|
Chris@87
|
685 '_check':isstringarray
|
Chris@87
|
686 }
|
Chris@87
|
687 ]
|
Chris@87
|
688
|
Chris@87
|
689 arg_rules=[
|
Chris@87
|
690 {
|
Chris@87
|
691 'separatorsfor':sepdict
|
Chris@87
|
692 },
|
Chris@87
|
693 { # Common
|
Chris@87
|
694 'frompyobj': ['\t/* Processing variable #varname# */',
|
Chris@87
|
695 {debugcapi:'\tfprintf(stderr,"#vardebuginfo#\\n");'},],
|
Chris@87
|
696 'cleanupfrompyobj': '\t/* End of cleaning variable #varname# */',
|
Chris@87
|
697 '_depend': '',
|
Chris@87
|
698 'need': typedef_need_dict,
|
Chris@87
|
699 },
|
Chris@87
|
700 # Doc signatures
|
Chris@87
|
701 {
|
Chris@87
|
702 'docstropt':{l_and(isoptional, isintent_nothide):'#pydocsign#'},
|
Chris@87
|
703 'docstrreq':{l_and(isrequired, isintent_nothide):'#pydocsign#'},
|
Chris@87
|
704 'docstrout':{isintent_out:'#pydocsignout#'},
|
Chris@87
|
705 'latexdocstropt':{l_and(isoptional, isintent_nothide):['\\item[]{{}\\verb@#pydocsign#@{}}',
|
Chris@87
|
706 {hasnote:'--- #note#'}]},
|
Chris@87
|
707 'latexdocstrreq':{l_and(isrequired, isintent_nothide):['\\item[]{{}\\verb@#pydocsign#@{}}',
|
Chris@87
|
708 {hasnote:'--- #note#'}]},
|
Chris@87
|
709 'latexdocstrout':{isintent_out:['\\item[]{{}\\verb@#pydocsignout#@{}}',
|
Chris@87
|
710 {l_and(hasnote, isintent_hide):'--- #note#',
|
Chris@87
|
711 l_and(hasnote, isintent_nothide):'--- See above.'}]},
|
Chris@87
|
712 'depend':''
|
Chris@87
|
713 },
|
Chris@87
|
714 # Required/Optional arguments
|
Chris@87
|
715 {
|
Chris@87
|
716 'kwlist':'"#varname#",',
|
Chris@87
|
717 'docsign':'#varname#,',
|
Chris@87
|
718 '_check':l_and(isintent_nothide, l_not(isoptional))
|
Chris@87
|
719 },
|
Chris@87
|
720 {
|
Chris@87
|
721 'kwlistopt':'"#varname#",',
|
Chris@87
|
722 'docsignopt':'#varname#=#showinit#,',
|
Chris@87
|
723 'docsignoptshort':'#varname#,',
|
Chris@87
|
724 '_check':l_and(isintent_nothide, isoptional)
|
Chris@87
|
725 },
|
Chris@87
|
726 # Docstring/BuildValue
|
Chris@87
|
727 {
|
Chris@87
|
728 'docreturn':'#outvarname#,',
|
Chris@87
|
729 'returnformat':'#varrformat#',
|
Chris@87
|
730 '_check':isintent_out
|
Chris@87
|
731 },
|
Chris@87
|
732 # Externals (call-back functions)
|
Chris@87
|
733 { # Common
|
Chris@87
|
734 'docsignxa':{isintent_nothide:'#varname#_extra_args=(),'},
|
Chris@87
|
735 'docsignxashort':{isintent_nothide:'#varname#_extra_args,'},
|
Chris@87
|
736 'docstropt':{isintent_nothide:'#varname#_extra_args : input tuple, optional\\n Default: ()'},
|
Chris@87
|
737 'docstrcbs':'#cbdocstr#',
|
Chris@87
|
738 'latexdocstrcbs':'\\item[] #cblatexdocstr#',
|
Chris@87
|
739 'latexdocstropt':{isintent_nothide:'\\item[]{{}\\verb@#varname#_extra_args := () input tuple@{}} --- Extra arguments for call-back function {{}\\verb@#varname#@{}}.'},
|
Chris@87
|
740 'decl':['\tPyObject *#varname#_capi = Py_None;',
|
Chris@87
|
741 '\tPyTupleObject *#varname#_xa_capi = NULL;',
|
Chris@87
|
742 '\tPyTupleObject *#varname#_args_capi = NULL;',
|
Chris@87
|
743 '\tint #varname#_nofargs_capi = 0;',
|
Chris@87
|
744 {l_not(isintent_callback):'\t#cbname#_typedef #varname#_cptr;'}
|
Chris@87
|
745 ],
|
Chris@87
|
746 'kwlistxa':{isintent_nothide:'"#varname#_extra_args",'},
|
Chris@87
|
747 'argformat':{isrequired:'O'},
|
Chris@87
|
748 'keyformat':{isoptional:'O'},
|
Chris@87
|
749 'xaformat':{isintent_nothide:'O!'},
|
Chris@87
|
750 'args_capi':{isrequired:',&#varname#_capi'},
|
Chris@87
|
751 'keys_capi':{isoptional:',&#varname#_capi'},
|
Chris@87
|
752 'keys_xa':',&PyTuple_Type,&#varname#_xa_capi',
|
Chris@87
|
753 'setjmpbuf':'(setjmp(#cbname#_jmpbuf))',
|
Chris@87
|
754 'callfortran':{l_not(isintent_callback):'#varname#_cptr,'},
|
Chris@87
|
755 'need':['#cbname#', 'setjmp.h'],
|
Chris@87
|
756 '_check':isexternal
|
Chris@87
|
757 },
|
Chris@87
|
758 {
|
Chris@87
|
759 'frompyobj':[{l_not(isintent_callback):"""\
|
Chris@87
|
760 if(F2PyCapsule_Check(#varname#_capi)) {
|
Chris@87
|
761 #varname#_cptr = F2PyCapsule_AsVoidPtr(#varname#_capi);
|
Chris@87
|
762 } else {
|
Chris@87
|
763 #varname#_cptr = #cbname#;
|
Chris@87
|
764 }
|
Chris@87
|
765 """}, {isintent_callback:"""\
|
Chris@87
|
766 if (#varname#_capi==Py_None) {
|
Chris@87
|
767 #varname#_capi = PyObject_GetAttrString(#modulename#_module,\"#varname#\");
|
Chris@87
|
768 if (#varname#_capi) {
|
Chris@87
|
769 if (#varname#_xa_capi==NULL) {
|
Chris@87
|
770 if (PyObject_HasAttrString(#modulename#_module,\"#varname#_extra_args\")) {
|
Chris@87
|
771 PyObject* capi_tmp = PyObject_GetAttrString(#modulename#_module,\"#varname#_extra_args\");
|
Chris@87
|
772 if (capi_tmp)
|
Chris@87
|
773 #varname#_xa_capi = (PyTupleObject *)PySequence_Tuple(capi_tmp);
|
Chris@87
|
774 else
|
Chris@87
|
775 #varname#_xa_capi = (PyTupleObject *)Py_BuildValue(\"()\");
|
Chris@87
|
776 if (#varname#_xa_capi==NULL) {
|
Chris@87
|
777 PyErr_SetString(#modulename#_error,\"Failed to convert #modulename#.#varname#_extra_args to tuple.\\n\");
|
Chris@87
|
778 return NULL;
|
Chris@87
|
779 }
|
Chris@87
|
780 }
|
Chris@87
|
781 }
|
Chris@87
|
782 }
|
Chris@87
|
783 if (#varname#_capi==NULL) {
|
Chris@87
|
784 PyErr_SetString(#modulename#_error,\"Callback #varname# not defined (as an argument or module #modulename# attribute).\\n\");
|
Chris@87
|
785 return NULL;
|
Chris@87
|
786 }
|
Chris@87
|
787 }
|
Chris@87
|
788 """},
|
Chris@87
|
789 ## {l_not(isintent_callback):"""\
|
Chris@87
|
790 ## if (#varname#_capi==Py_None) {
|
Chris@87
|
791 ## printf(\"hoi\\n\");
|
Chris@87
|
792 ## }
|
Chris@87
|
793 ## """},
|
Chris@87
|
794 """\
|
Chris@87
|
795 \t#varname#_nofargs_capi = #cbname#_nofargs;
|
Chris@87
|
796 \tif (create_cb_arglist(#varname#_capi,#varname#_xa_capi,#maxnofargs#,#nofoptargs#,&#cbname#_nofargs,&#varname#_args_capi,\"failed in processing argument list for call-back #varname#.\")) {
|
Chris@87
|
797 \t\tjmp_buf #varname#_jmpbuf;""",
|
Chris@87
|
798 {debugcapi:["""\
|
Chris@87
|
799 \t\tfprintf(stderr,\"debug-capi:Assuming %d arguments; at most #maxnofargs#(-#nofoptargs#) is expected.\\n\",#cbname#_nofargs);
|
Chris@87
|
800 \t\tCFUNCSMESSPY(\"for #varname#=\",#cbname#_capi);""",
|
Chris@87
|
801 {l_not(isintent_callback):"""\t\tfprintf(stderr,\"#vardebugshowvalue# (call-back in C).\\n\",#cbname#);"""}]},
|
Chris@87
|
802 """\
|
Chris@87
|
803 \t\tCFUNCSMESS(\"Saving jmpbuf for `#varname#`.\\n\");
|
Chris@87
|
804 \t\tSWAP(#varname#_capi,#cbname#_capi,PyObject);
|
Chris@87
|
805 \t\tSWAP(#varname#_args_capi,#cbname#_args_capi,PyTupleObject);
|
Chris@87
|
806 \t\tmemcpy(&#varname#_jmpbuf,&#cbname#_jmpbuf,sizeof(jmp_buf));""",
|
Chris@87
|
807 ],
|
Chris@87
|
808 'cleanupfrompyobj':
|
Chris@87
|
809 """\
|
Chris@87
|
810 \t\tCFUNCSMESS(\"Restoring jmpbuf for `#varname#`.\\n\");
|
Chris@87
|
811 \t\t#cbname#_capi = #varname#_capi;
|
Chris@87
|
812 \t\tPy_DECREF(#cbname#_args_capi);
|
Chris@87
|
813 \t\t#cbname#_args_capi = #varname#_args_capi;
|
Chris@87
|
814 \t\t#cbname#_nofargs = #varname#_nofargs_capi;
|
Chris@87
|
815 \t\tmemcpy(&#cbname#_jmpbuf,&#varname#_jmpbuf,sizeof(jmp_buf));
|
Chris@87
|
816 \t}""",
|
Chris@87
|
817 'need':['SWAP', 'create_cb_arglist'],
|
Chris@87
|
818 '_check':isexternal,
|
Chris@87
|
819 '_depend':''
|
Chris@87
|
820 },
|
Chris@87
|
821 # Scalars (not complex)
|
Chris@87
|
822 { # Common
|
Chris@87
|
823 'decl':'\t#ctype# #varname# = 0;',
|
Chris@87
|
824 'pyobjfrom':{debugcapi:'\tfprintf(stderr,"#vardebugshowvalue#\\n",#varname#);'},
|
Chris@87
|
825 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},
|
Chris@87
|
826 'return':{isintent_out:',#varname#'},
|
Chris@87
|
827 '_check':l_and(isscalar, l_not(iscomplex))
|
Chris@87
|
828 }, {
|
Chris@87
|
829 'need': {hasinitvalue:'math.h'},
|
Chris@87
|
830 '_check': l_and(isscalar, l_not(iscomplex)),
|
Chris@87
|
831 #'_depend':''
|
Chris@87
|
832 }, { # Not hidden
|
Chris@87
|
833 'decl':'\tPyObject *#varname#_capi = Py_None;',
|
Chris@87
|
834 'argformat':{isrequired:'O'},
|
Chris@87
|
835 'keyformat':{isoptional:'O'},
|
Chris@87
|
836 'args_capi':{isrequired:',&#varname#_capi'},
|
Chris@87
|
837 'keys_capi':{isoptional:',&#varname#_capi'},
|
Chris@87
|
838 'pyobjfrom':{isintent_inout:"""\
|
Chris@87
|
839 \tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);
|
Chris@87
|
840 \tif (f2py_success) {"""},
|
Chris@87
|
841 'closepyobjfrom':{isintent_inout:"\t} /*if (f2py_success) of #varname# pyobjfrom*/"},
|
Chris@87
|
842 'need':{isintent_inout:'try_pyarr_from_#ctype#'},
|
Chris@87
|
843 '_check':l_and(isscalar, l_not(iscomplex), isintent_nothide)
|
Chris@87
|
844 }, {
|
Chris@87
|
845 'frompyobj':[
|
Chris@87
|
846 # hasinitvalue...
|
Chris@87
|
847 # if pyobj is None:
|
Chris@87
|
848 # varname = init
|
Chris@87
|
849 # else
|
Chris@87
|
850 # from_pyobj(varname)
|
Chris@87
|
851 #
|
Chris@87
|
852 # isoptional and noinitvalue...
|
Chris@87
|
853 # if pyobj is not None:
|
Chris@87
|
854 # from_pyobj(varname)
|
Chris@87
|
855 # else:
|
Chris@87
|
856 # varname is uninitialized
|
Chris@87
|
857 #
|
Chris@87
|
858 # ...
|
Chris@87
|
859 # from_pyobj(varname)
|
Chris@87
|
860 #
|
Chris@87
|
861 {hasinitvalue:'\tif (#varname#_capi == Py_None) #varname# = #init#; else',
|
Chris@87
|
862 '_depend':''},
|
Chris@87
|
863 {l_and(isoptional, l_not(hasinitvalue)):'\tif (#varname#_capi != Py_None)',
|
Chris@87
|
864 '_depend':''},
|
Chris@87
|
865 {l_not(islogical):'''\
|
Chris@87
|
866 \t\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,"#pyname#() #nth# (#varname#) can\'t be converted to #ctype#");
|
Chris@87
|
867 \tif (f2py_success) {'''},
|
Chris@87
|
868 {islogical:'''\
|
Chris@87
|
869 \t\t#varname# = (#ctype#)PyObject_IsTrue(#varname#_capi);
|
Chris@87
|
870 \t\tf2py_success = 1;
|
Chris@87
|
871 \tif (f2py_success) {'''},
|
Chris@87
|
872 ],
|
Chris@87
|
873 'cleanupfrompyobj':'\t} /*if (f2py_success) of #varname#*/',
|
Chris@87
|
874 'need':{l_not(islogical):'#ctype#_from_pyobj'},
|
Chris@87
|
875 '_check':l_and(isscalar, l_not(iscomplex), isintent_nothide),
|
Chris@87
|
876 '_depend':''
|
Chris@87
|
877 # },{ # Hidden
|
Chris@87
|
878 # '_check':l_and(isscalar,l_not(iscomplex),isintent_hide)
|
Chris@87
|
879 }, { # Hidden
|
Chris@87
|
880 'frompyobj':{hasinitvalue:'\t#varname# = #init#;'},
|
Chris@87
|
881 'need':typedef_need_dict,
|
Chris@87
|
882 '_check':l_and(isscalar, l_not(iscomplex), isintent_hide),
|
Chris@87
|
883 '_depend':''
|
Chris@87
|
884 }, { # Common
|
Chris@87
|
885 'frompyobj':{debugcapi:'\tfprintf(stderr,"#vardebugshowvalue#\\n",#varname#);'},
|
Chris@87
|
886 '_check':l_and(isscalar, l_not(iscomplex)),
|
Chris@87
|
887 '_depend':''
|
Chris@87
|
888 },
|
Chris@87
|
889 # Complex scalars
|
Chris@87
|
890 { # Common
|
Chris@87
|
891 'decl':'\t#ctype# #varname#;',
|
Chris@87
|
892 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},
|
Chris@87
|
893 'pyobjfrom':{debugcapi:'\tfprintf(stderr,"#vardebugshowvalue#\\n",#varname#.r,#varname#.i);'},
|
Chris@87
|
894 'return':{isintent_out:',#varname#_capi'},
|
Chris@87
|
895 '_check':iscomplex
|
Chris@87
|
896 }, { # Not hidden
|
Chris@87
|
897 'decl':'\tPyObject *#varname#_capi = Py_None;',
|
Chris@87
|
898 'argformat':{isrequired:'O'},
|
Chris@87
|
899 'keyformat':{isoptional:'O'},
|
Chris@87
|
900 'args_capi':{isrequired:',&#varname#_capi'},
|
Chris@87
|
901 'keys_capi':{isoptional:',&#varname#_capi'},
|
Chris@87
|
902 'need':{isintent_inout:'try_pyarr_from_#ctype#'},
|
Chris@87
|
903 'pyobjfrom':{isintent_inout:"""\
|
Chris@87
|
904 \t\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);
|
Chris@87
|
905 \t\tif (f2py_success) {"""},
|
Chris@87
|
906 'closepyobjfrom':{isintent_inout:"\t\t} /*if (f2py_success) of #varname# pyobjfrom*/"},
|
Chris@87
|
907 '_check':l_and(iscomplex, isintent_nothide)
|
Chris@87
|
908 }, {
|
Chris@87
|
909 'frompyobj':[{hasinitvalue:'\tif (#varname#_capi==Py_None) {#varname#.r = #init.r#, #varname#.i = #init.i#;} else'},
|
Chris@87
|
910 {l_and(isoptional, l_not(hasinitvalue)):'\tif (#varname#_capi != Py_None)'},
|
Chris@87
|
911 # '\t\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,"#ctype#_from_pyobj failed in converting #nth# `#varname#\' of #pyname# to C #ctype#\\n");'
|
Chris@87
|
912 '\t\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,"#pyname#() #nth# (#varname#) can\'t be converted to #ctype#");'
|
Chris@87
|
913 '\n\tif (f2py_success) {'],
|
Chris@87
|
914 'cleanupfrompyobj':'\t} /*if (f2py_success) of #varname# frompyobj*/',
|
Chris@87
|
915 'need':['#ctype#_from_pyobj'],
|
Chris@87
|
916 '_check':l_and(iscomplex, isintent_nothide),
|
Chris@87
|
917 '_depend':''
|
Chris@87
|
918 }, { # Hidden
|
Chris@87
|
919 'decl':{isintent_out:'\tPyObject *#varname#_capi = Py_None;'},
|
Chris@87
|
920 '_check':l_and(iscomplex, isintent_hide)
|
Chris@87
|
921 }, {
|
Chris@87
|
922 'frompyobj': {hasinitvalue:'\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},
|
Chris@87
|
923 '_check':l_and(iscomplex, isintent_hide),
|
Chris@87
|
924 '_depend':''
|
Chris@87
|
925 }, { # Common
|
Chris@87
|
926 'pyobjfrom':{isintent_out:'\t#varname#_capi = pyobj_from_#ctype#1(#varname#);'},
|
Chris@87
|
927 'need':['pyobj_from_#ctype#1'],
|
Chris@87
|
928 '_check':iscomplex
|
Chris@87
|
929 }, {
|
Chris@87
|
930 'frompyobj':{debugcapi:'\tfprintf(stderr,"#vardebugshowvalue#\\n",#varname#.r,#varname#.i);'},
|
Chris@87
|
931 '_check':iscomplex,
|
Chris@87
|
932 '_depend':''
|
Chris@87
|
933 },
|
Chris@87
|
934 # String
|
Chris@87
|
935 { # Common
|
Chris@87
|
936 'decl':['\t#ctype# #varname# = NULL;',
|
Chris@87
|
937 '\tint slen(#varname#);',
|
Chris@87
|
938 '\tPyObject *#varname#_capi = Py_None;'],
|
Chris@87
|
939 'callfortran':'#varname#,',
|
Chris@87
|
940 'callfortranappend':'slen(#varname#),',
|
Chris@87
|
941 'pyobjfrom':{debugcapi:'\tfprintf(stderr,"#vardebugshowvalue#\\n",slen(#varname#),#varname#);'},
|
Chris@87
|
942 # 'freemem':'\tSTRINGFREE(#varname#);',
|
Chris@87
|
943 'return':{isintent_out:',#varname#'},
|
Chris@87
|
944 'need':['len..'],#'STRINGFREE'],
|
Chris@87
|
945 '_check':isstring
|
Chris@87
|
946 }, { # Common
|
Chris@87
|
947 'frompyobj':"""\
|
Chris@87
|
948 \tslen(#varname#) = #length#;
|
Chris@87
|
949 \tf2py_success = #ctype#_from_pyobj(&#varname#,&slen(#varname#),#init#,#varname#_capi,\"#ctype#_from_pyobj failed in converting #nth# `#varname#\' of #pyname# to C #ctype#\");
|
Chris@87
|
950 \tif (f2py_success) {""",
|
Chris@87
|
951 'cleanupfrompyobj':"""\
|
Chris@87
|
952 \t\tSTRINGFREE(#varname#);
|
Chris@87
|
953 \t} /*if (f2py_success) of #varname#*/""",
|
Chris@87
|
954 'need':['#ctype#_from_pyobj', 'len..', 'STRINGFREE'],
|
Chris@87
|
955 '_check':isstring,
|
Chris@87
|
956 '_depend':''
|
Chris@87
|
957 }, { # Not hidden
|
Chris@87
|
958 'argformat':{isrequired:'O'},
|
Chris@87
|
959 'keyformat':{isoptional:'O'},
|
Chris@87
|
960 'args_capi':{isrequired:',&#varname#_capi'},
|
Chris@87
|
961 'keys_capi':{isoptional:',&#varname#_capi'},
|
Chris@87
|
962 'pyobjfrom':{isintent_inout:'''\
|
Chris@87
|
963 \tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,#varname#);
|
Chris@87
|
964 \tif (f2py_success) {'''},
|
Chris@87
|
965 'closepyobjfrom':{isintent_inout:'\t} /*if (f2py_success) of #varname# pyobjfrom*/'},
|
Chris@87
|
966 'need':{isintent_inout:'try_pyarr_from_#ctype#'},
|
Chris@87
|
967 '_check':l_and(isstring, isintent_nothide)
|
Chris@87
|
968 }, { # Hidden
|
Chris@87
|
969 '_check':l_and(isstring, isintent_hide)
|
Chris@87
|
970 }, {
|
Chris@87
|
971 'frompyobj':{debugcapi:'\tfprintf(stderr,"#vardebugshowvalue#\\n",slen(#varname#),#varname#);'},
|
Chris@87
|
972 '_check':isstring,
|
Chris@87
|
973 '_depend':''
|
Chris@87
|
974 },
|
Chris@87
|
975 # Array
|
Chris@87
|
976 { # Common
|
Chris@87
|
977 'decl':['\t#ctype# *#varname# = NULL;',
|
Chris@87
|
978 '\tnpy_intp #varname#_Dims[#rank#] = {#rank*[-1]#};',
|
Chris@87
|
979 '\tconst int #varname#_Rank = #rank#;',
|
Chris@87
|
980 '\tPyArrayObject *capi_#varname#_tmp = NULL;',
|
Chris@87
|
981 '\tint capi_#varname#_intent = 0;',
|
Chris@87
|
982 ],
|
Chris@87
|
983 'callfortran':'#varname#,',
|
Chris@87
|
984 'return':{isintent_out:',capi_#varname#_tmp'},
|
Chris@87
|
985 'need':'len..',
|
Chris@87
|
986 '_check':isarray
|
Chris@87
|
987 }, { # intent(overwrite) array
|
Chris@87
|
988 'decl': '\tint capi_overwrite_#varname# = 1;',
|
Chris@87
|
989 'kwlistxa': '"overwrite_#varname#",',
|
Chris@87
|
990 'xaformat': 'i',
|
Chris@87
|
991 'keys_xa': ',&capi_overwrite_#varname#',
|
Chris@87
|
992 'docsignxa': 'overwrite_#varname#=1,',
|
Chris@87
|
993 'docsignxashort': 'overwrite_#varname#,',
|
Chris@87
|
994 'docstropt': 'overwrite_#varname# : input int, optional\\n Default: 1',
|
Chris@87
|
995 '_check': l_and(isarray, isintent_overwrite),
|
Chris@87
|
996 }, {
|
Chris@87
|
997 'frompyobj': '\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',
|
Chris@87
|
998 '_check': l_and(isarray, isintent_overwrite),
|
Chris@87
|
999 '_depend': '',
|
Chris@87
|
1000 },
|
Chris@87
|
1001 { # intent(copy) array
|
Chris@87
|
1002 'decl': '\tint capi_overwrite_#varname# = 0;',
|
Chris@87
|
1003 'kwlistxa': '"overwrite_#varname#",',
|
Chris@87
|
1004 'xaformat': 'i',
|
Chris@87
|
1005 'keys_xa': ',&capi_overwrite_#varname#',
|
Chris@87
|
1006 'docsignxa': 'overwrite_#varname#=0,',
|
Chris@87
|
1007 'docsignxashort': 'overwrite_#varname#,',
|
Chris@87
|
1008 'docstropt': 'overwrite_#varname# : input int, optional\\n Default: 0',
|
Chris@87
|
1009 '_check': l_and(isarray, isintent_copy),
|
Chris@87
|
1010 }, {
|
Chris@87
|
1011 'frompyobj': '\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',
|
Chris@87
|
1012 '_check': l_and(isarray, isintent_copy),
|
Chris@87
|
1013 '_depend': '',
|
Chris@87
|
1014 }, {
|
Chris@87
|
1015 'need':[{hasinitvalue:'forcomb'}, {hasinitvalue:'CFUNCSMESS'}],
|
Chris@87
|
1016 '_check':isarray,
|
Chris@87
|
1017 '_depend':''
|
Chris@87
|
1018 }, { # Not hidden
|
Chris@87
|
1019 'decl':'\tPyObject *#varname#_capi = Py_None;',
|
Chris@87
|
1020 'argformat':{isrequired:'O'},
|
Chris@87
|
1021 'keyformat':{isoptional:'O'},
|
Chris@87
|
1022 'args_capi':{isrequired:',&#varname#_capi'},
|
Chris@87
|
1023 'keys_capi':{isoptional:',&#varname#_capi'},
|
Chris@87
|
1024 # 'pyobjfrom':{isintent_inout:"""\
|
Chris@87
|
1025 # /* Partly because of the following hack, intent(inout) is depreciated,
|
Chris@87
|
1026 # Use intent(in,out) instead.
|
Chris@87
|
1027
|
Chris@87
|
1028 # \tif ((#varname#_capi != Py_None) && PyArray_Check(#varname#_capi) \\
|
Chris@87
|
1029 # \t\t&& (#varname#_capi != (PyObject *)capi_#varname#_tmp)) {
|
Chris@87
|
1030 # \t\tif (((PyArrayObject *)#varname#_capi)->nd != capi_#varname#_tmp->nd) {
|
Chris@87
|
1031 # \t\t\tif (#varname#_capi != capi_#varname#_tmp->base)
|
Chris@87
|
1032 # \t\t\t\tcopy_ND_array((PyArrayObject *)capi_#varname#_tmp->base,(PyArrayObject *)#varname#_capi);
|
Chris@87
|
1033 # \t\t} else
|
Chris@87
|
1034 # \t\t\tcopy_ND_array(capi_#varname#_tmp,(PyArrayObject *)#varname#_capi);
|
Chris@87
|
1035 # \t}
|
Chris@87
|
1036 # */
|
Chris@87
|
1037 # """},
|
Chris@87
|
1038 # 'need':{isintent_inout:'copy_ND_array'},
|
Chris@87
|
1039 '_check':l_and(isarray, isintent_nothide)
|
Chris@87
|
1040 }, {
|
Chris@87
|
1041 'frompyobj':['\t#setdims#;',
|
Chris@87
|
1042 '\tcapi_#varname#_intent |= #intent#;',
|
Chris@87
|
1043 {isintent_hide:'\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,Py_None);'},
|
Chris@87
|
1044 {isintent_nothide:'\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,#varname#_capi);'},
|
Chris@87
|
1045 """\
|
Chris@87
|
1046 \tif (capi_#varname#_tmp == NULL) {
|
Chris@87
|
1047 \t\tif (!PyErr_Occurred())
|
Chris@87
|
1048 \t\t\tPyErr_SetString(#modulename#_error,\"failed in converting #nth# `#varname#\' of #pyname# to C/Fortran array\" );
|
Chris@87
|
1049 \t} else {
|
Chris@87
|
1050 \t\t#varname# = (#ctype# *)(capi_#varname#_tmp->data);
|
Chris@87
|
1051 """,
|
Chris@87
|
1052 {hasinitvalue:[
|
Chris@87
|
1053 {isintent_nothide:'\tif (#varname#_capi == Py_None) {'},
|
Chris@87
|
1054 {isintent_hide:'\t{'},
|
Chris@87
|
1055 {iscomplexarray:'\t\t#ctype# capi_c;'},
|
Chris@87
|
1056 """\
|
Chris@87
|
1057 \t\tint *_i,capi_i=0;
|
Chris@87
|
1058 \t\tCFUNCSMESS(\"#name#: Initializing #varname#=#init#\\n\");
|
Chris@87
|
1059 \t\tif (initforcomb(capi_#varname#_tmp->dimensions,capi_#varname#_tmp->nd,1)) {
|
Chris@87
|
1060 \t\t\twhile ((_i = nextforcomb()))
|
Chris@87
|
1061 \t\t\t\t#varname#[capi_i++] = #init#; /* fortran way */
|
Chris@87
|
1062 \t\t} else {
|
Chris@87
|
1063 \t\t\tif (!PyErr_Occurred())
|
Chris@87
|
1064 \t\t\t\tPyErr_SetString(#modulename#_error,\"Initialization of #nth# #varname# failed (initforcomb).\");
|
Chris@87
|
1065 \t\t\tf2py_success = 0;
|
Chris@87
|
1066 \t\t}
|
Chris@87
|
1067 \t}
|
Chris@87
|
1068 \tif (f2py_success) {"""]},
|
Chris@87
|
1069 ],
|
Chris@87
|
1070 'cleanupfrompyobj':[ # note that this list will be reversed
|
Chris@87
|
1071 '\t} /*if (capi_#varname#_tmp == NULL) ... else of #varname#*/',
|
Chris@87
|
1072 {l_not(l_or(isintent_out, isintent_hide)):"""\
|
Chris@87
|
1073 \tif((PyObject *)capi_#varname#_tmp!=#varname#_capi) {
|
Chris@87
|
1074 \t\tPy_XDECREF(capi_#varname#_tmp); }"""},
|
Chris@87
|
1075 {l_and(isintent_hide, l_not(isintent_out)):"""\t\tPy_XDECREF(capi_#varname#_tmp);"""},
|
Chris@87
|
1076 {hasinitvalue:'\t} /*if (f2py_success) of #varname# init*/'},
|
Chris@87
|
1077 ],
|
Chris@87
|
1078 '_check':isarray,
|
Chris@87
|
1079 '_depend':''
|
Chris@87
|
1080 },
|
Chris@87
|
1081 # { # Hidden
|
Chris@87
|
1082 # 'freemem':{l_not(isintent_out):'\tPy_XDECREF(capi_#varname#_tmp);'},
|
Chris@87
|
1083 # '_check':l_and(isarray,isintent_hide)
|
Chris@87
|
1084 # },
|
Chris@87
|
1085 # Scalararray
|
Chris@87
|
1086 { # Common
|
Chris@87
|
1087 '_check':l_and(isarray, l_not(iscomplexarray))
|
Chris@87
|
1088 }, { # Not hidden
|
Chris@87
|
1089 '_check':l_and(isarray, l_not(iscomplexarray), isintent_nothide)
|
Chris@87
|
1090 },
|
Chris@87
|
1091 # Integer*1 array
|
Chris@87
|
1092 {'need':'#ctype#',
|
Chris@87
|
1093 '_check':isint1array,
|
Chris@87
|
1094 '_depend':''
|
Chris@87
|
1095 },
|
Chris@87
|
1096 # Integer*-1 array
|
Chris@87
|
1097 {'need':'#ctype#',
|
Chris@87
|
1098 '_check':isunsigned_chararray,
|
Chris@87
|
1099 '_depend':''
|
Chris@87
|
1100 },
|
Chris@87
|
1101 # Integer*-2 array
|
Chris@87
|
1102 {'need':'#ctype#',
|
Chris@87
|
1103 '_check':isunsigned_shortarray,
|
Chris@87
|
1104 '_depend':''
|
Chris@87
|
1105 },
|
Chris@87
|
1106 # Integer*-8 array
|
Chris@87
|
1107 {'need':'#ctype#',
|
Chris@87
|
1108 '_check':isunsigned_long_longarray,
|
Chris@87
|
1109 '_depend':''
|
Chris@87
|
1110 },
|
Chris@87
|
1111 # Complexarray
|
Chris@87
|
1112 {'need':'#ctype#',
|
Chris@87
|
1113 '_check':iscomplexarray,
|
Chris@87
|
1114 '_depend':''
|
Chris@87
|
1115 },
|
Chris@87
|
1116 # Stringarray
|
Chris@87
|
1117 {
|
Chris@87
|
1118 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},
|
Chris@87
|
1119 'need':'string',
|
Chris@87
|
1120 '_check':isstringarray
|
Chris@87
|
1121 }
|
Chris@87
|
1122 ]
|
Chris@87
|
1123
|
Chris@87
|
1124 ################# Rules for checking ###############
|
Chris@87
|
1125
|
Chris@87
|
1126 check_rules=[
|
Chris@87
|
1127 {
|
Chris@87
|
1128 'frompyobj':{debugcapi:'\tfprintf(stderr,\"debug-capi:Checking `#check#\'\\n\");'},
|
Chris@87
|
1129 'need':'len..'
|
Chris@87
|
1130 }, {
|
Chris@87
|
1131 'frompyobj':'\tCHECKSCALAR(#check#,\"#check#\",\"#nth# #varname#\",\"#varshowvalue#\",#varname#) {',
|
Chris@87
|
1132 'cleanupfrompyobj':'\t} /*CHECKSCALAR(#check#)*/',
|
Chris@87
|
1133 'need':'CHECKSCALAR',
|
Chris@87
|
1134 '_check':l_and(isscalar, l_not(iscomplex)),
|
Chris@87
|
1135 '_break':''
|
Chris@87
|
1136 }, {
|
Chris@87
|
1137 'frompyobj':'\tCHECKSTRING(#check#,\"#check#\",\"#nth# #varname#\",\"#varshowvalue#\",#varname#) {',
|
Chris@87
|
1138 'cleanupfrompyobj':'\t} /*CHECKSTRING(#check#)*/',
|
Chris@87
|
1139 'need':'CHECKSTRING',
|
Chris@87
|
1140 '_check':isstring,
|
Chris@87
|
1141 '_break':''
|
Chris@87
|
1142 }, {
|
Chris@87
|
1143 'need':'CHECKARRAY',
|
Chris@87
|
1144 'frompyobj':'\tCHECKARRAY(#check#,\"#check#\",\"#nth# #varname#\") {',
|
Chris@87
|
1145 'cleanupfrompyobj':'\t} /*CHECKARRAY(#check#)*/',
|
Chris@87
|
1146 '_check':isarray,
|
Chris@87
|
1147 '_break':''
|
Chris@87
|
1148 }, {
|
Chris@87
|
1149 'need': 'CHECKGENERIC',
|
Chris@87
|
1150 'frompyobj': '\tCHECKGENERIC(#check#,\"#check#\",\"#nth# #varname#\") {',
|
Chris@87
|
1151 'cleanupfrompyobj': '\t} /*CHECKGENERIC(#check#)*/',
|
Chris@87
|
1152 }
|
Chris@87
|
1153 ]
|
Chris@87
|
1154
|
Chris@87
|
1155 ########## Applying the rules. No need to modify what follows #############
|
Chris@87
|
1156
|
Chris@87
|
1157 #################### Build C/API module #######################
|
Chris@87
|
1158
|
Chris@87
|
1159 def buildmodule(m, um):
|
Chris@87
|
1160 """
|
Chris@87
|
1161 Return
|
Chris@87
|
1162 """
|
Chris@87
|
1163 global f2py_version, options
|
Chris@87
|
1164 outmess('\tBuilding module "%s"...\n'%(m['name']))
|
Chris@87
|
1165 ret = {}
|
Chris@87
|
1166 mod_rules=defmod_rules[:]
|
Chris@87
|
1167 vrd=modsign2map(m)
|
Chris@87
|
1168 rd=dictappend({'f2py_version':f2py_version}, vrd)
|
Chris@87
|
1169 funcwrappers = []
|
Chris@87
|
1170 funcwrappers2 = [] # F90 codes
|
Chris@87
|
1171 for n in m['interfaced']:
|
Chris@87
|
1172 nb=None
|
Chris@87
|
1173 for bi in m['body']:
|
Chris@87
|
1174 if not bi['block']=='interface':
|
Chris@87
|
1175 errmess('buildmodule: Expected interface block. Skipping.\n')
|
Chris@87
|
1176 continue
|
Chris@87
|
1177 for b in bi['body']:
|
Chris@87
|
1178 if b['name']==n: nb=b;break
|
Chris@87
|
1179
|
Chris@87
|
1180 if not nb:
|
Chris@87
|
1181 errmess('buildmodule: Could not found the body of interfaced routine "%s". Skipping.\n'%(n))
|
Chris@87
|
1182 continue
|
Chris@87
|
1183 nb_list = [nb]
|
Chris@87
|
1184 if 'entry' in nb:
|
Chris@87
|
1185 for k, a in nb['entry'].items():
|
Chris@87
|
1186 nb1 = copy.deepcopy(nb)
|
Chris@87
|
1187 del nb1['entry']
|
Chris@87
|
1188 nb1['name'] = k
|
Chris@87
|
1189 nb1['args'] = a
|
Chris@87
|
1190 nb_list.append(nb1)
|
Chris@87
|
1191 for nb in nb_list:
|
Chris@87
|
1192 api, wrap=buildapi(nb)
|
Chris@87
|
1193 if wrap:
|
Chris@87
|
1194 if ismoduleroutine(nb):
|
Chris@87
|
1195 funcwrappers2.append(wrap)
|
Chris@87
|
1196 else:
|
Chris@87
|
1197 funcwrappers.append(wrap)
|
Chris@87
|
1198 ar=applyrules(api, vrd)
|
Chris@87
|
1199 rd=dictappend(rd, ar)
|
Chris@87
|
1200
|
Chris@87
|
1201 # Construct COMMON block support
|
Chris@87
|
1202 cr, wrap = common_rules.buildhooks(m)
|
Chris@87
|
1203 if wrap:
|
Chris@87
|
1204 funcwrappers.append(wrap)
|
Chris@87
|
1205 ar=applyrules(cr, vrd)
|
Chris@87
|
1206 rd=dictappend(rd, ar)
|
Chris@87
|
1207
|
Chris@87
|
1208 # Construct F90 module support
|
Chris@87
|
1209 mr, wrap = f90mod_rules.buildhooks(m)
|
Chris@87
|
1210 if wrap:
|
Chris@87
|
1211 funcwrappers2.append(wrap)
|
Chris@87
|
1212 ar=applyrules(mr, vrd)
|
Chris@87
|
1213 rd=dictappend(rd, ar)
|
Chris@87
|
1214
|
Chris@87
|
1215 for u in um:
|
Chris@87
|
1216 ar=use_rules.buildusevars(u, m['use'][u['name']])
|
Chris@87
|
1217 rd=dictappend(rd, ar)
|
Chris@87
|
1218
|
Chris@87
|
1219 needs=cfuncs.get_needs()
|
Chris@87
|
1220 code={}
|
Chris@87
|
1221 for n in needs.keys():
|
Chris@87
|
1222 code[n]=[]
|
Chris@87
|
1223 for k in needs[n]:
|
Chris@87
|
1224 c=''
|
Chris@87
|
1225 if k in cfuncs.includes0:
|
Chris@87
|
1226 c=cfuncs.includes0[k]
|
Chris@87
|
1227 elif k in cfuncs.includes:
|
Chris@87
|
1228 c=cfuncs.includes[k]
|
Chris@87
|
1229 elif k in cfuncs.userincludes:
|
Chris@87
|
1230 c=cfuncs.userincludes[k]
|
Chris@87
|
1231 elif k in cfuncs.typedefs:
|
Chris@87
|
1232 c=cfuncs.typedefs[k]
|
Chris@87
|
1233 elif k in cfuncs.typedefs_generated:
|
Chris@87
|
1234 c=cfuncs.typedefs_generated[k]
|
Chris@87
|
1235 elif k in cfuncs.cppmacros:
|
Chris@87
|
1236 c=cfuncs.cppmacros[k]
|
Chris@87
|
1237 elif k in cfuncs.cfuncs:
|
Chris@87
|
1238 c=cfuncs.cfuncs[k]
|
Chris@87
|
1239 elif k in cfuncs.callbacks:
|
Chris@87
|
1240 c=cfuncs.callbacks[k]
|
Chris@87
|
1241 elif k in cfuncs.f90modhooks:
|
Chris@87
|
1242 c=cfuncs.f90modhooks[k]
|
Chris@87
|
1243 elif k in cfuncs.commonhooks:
|
Chris@87
|
1244 c=cfuncs.commonhooks[k]
|
Chris@87
|
1245 else:
|
Chris@87
|
1246 errmess('buildmodule: unknown need %s.\n'%(repr(k)));continue
|
Chris@87
|
1247 code[n].append(c)
|
Chris@87
|
1248 mod_rules.append(code)
|
Chris@87
|
1249 for r in mod_rules:
|
Chris@87
|
1250 if ('_check' in r and r['_check'](m)) or ('_check' not in r):
|
Chris@87
|
1251 ar=applyrules(r, vrd, m)
|
Chris@87
|
1252 rd=dictappend(rd, ar)
|
Chris@87
|
1253 ar=applyrules(module_rules, rd)
|
Chris@87
|
1254
|
Chris@87
|
1255 fn = os.path.join(options['buildpath'], vrd['coutput'])
|
Chris@87
|
1256 ret['csrc'] = fn
|
Chris@87
|
1257 f=open(fn, 'w')
|
Chris@87
|
1258 f.write(ar['modulebody'].replace('\t', 2*' '))
|
Chris@87
|
1259 f.close()
|
Chris@87
|
1260 outmess('\tWrote C/API module "%s" to file "%s"\n'%(m['name'], fn))
|
Chris@87
|
1261
|
Chris@87
|
1262 if options['dorestdoc']:
|
Chris@87
|
1263 fn = os.path.join(options['buildpath'], vrd['modulename']+'module.rest')
|
Chris@87
|
1264 f=open(fn, 'w')
|
Chris@87
|
1265 f.write('.. -*- rest -*-\n')
|
Chris@87
|
1266 f.write('\n'.join(ar['restdoc']))
|
Chris@87
|
1267 f.close()
|
Chris@87
|
1268 outmess('\tReST Documentation is saved to file "%s/%smodule.rest"\n'%(options['buildpath'], vrd['modulename']))
|
Chris@87
|
1269 if options['dolatexdoc']:
|
Chris@87
|
1270 fn = os.path.join(options['buildpath'], vrd['modulename']+'module.tex')
|
Chris@87
|
1271 ret['ltx'] = fn
|
Chris@87
|
1272 f=open(fn, 'w')
|
Chris@87
|
1273 f.write('%% This file is auto-generated with f2py (version:%s)\n'%(f2py_version))
|
Chris@87
|
1274 if 'shortlatex' not in options:
|
Chris@87
|
1275 f.write('\\documentclass{article}\n\\usepackage{a4wide}\n\\begin{document}\n\\tableofcontents\n\n')
|
Chris@87
|
1276 f.write('\n'.join(ar['latexdoc']))
|
Chris@87
|
1277 if 'shortlatex' not in options:
|
Chris@87
|
1278 f.write('\\end{document}')
|
Chris@87
|
1279 f.close()
|
Chris@87
|
1280 outmess('\tDocumentation is saved to file "%s/%smodule.tex"\n'%(options['buildpath'], vrd['modulename']))
|
Chris@87
|
1281 if funcwrappers:
|
Chris@87
|
1282 wn = os.path.join(options['buildpath'], vrd['f2py_wrapper_output'])
|
Chris@87
|
1283 ret['fsrc'] = wn
|
Chris@87
|
1284 f=open(wn, 'w')
|
Chris@87
|
1285 f.write('C -*- fortran -*-\n')
|
Chris@87
|
1286 f.write('C This file is autogenerated with f2py (version:%s)\n'%(f2py_version))
|
Chris@87
|
1287 f.write('C It contains Fortran 77 wrappers to fortran functions.\n')
|
Chris@87
|
1288 lines = []
|
Chris@87
|
1289 for l in ('\n\n'.join(funcwrappers)+'\n').split('\n'):
|
Chris@87
|
1290 if l and l[0]==' ':
|
Chris@87
|
1291 while len(l)>=66:
|
Chris@87
|
1292 lines.append(l[:66]+'\n &')
|
Chris@87
|
1293 l = l[66:]
|
Chris@87
|
1294 lines.append(l+'\n')
|
Chris@87
|
1295 else: lines.append(l+'\n')
|
Chris@87
|
1296 lines = ''.join(lines).replace('\n &\n', '\n')
|
Chris@87
|
1297 f.write(lines)
|
Chris@87
|
1298 f.close()
|
Chris@87
|
1299 outmess('\tFortran 77 wrappers are saved to "%s"\n'%(wn))
|
Chris@87
|
1300 if funcwrappers2:
|
Chris@87
|
1301 wn = os.path.join(options['buildpath'], '%s-f2pywrappers2.f90'%(vrd['modulename']))
|
Chris@87
|
1302 ret['fsrc'] = wn
|
Chris@87
|
1303 f=open(wn, 'w')
|
Chris@87
|
1304 f.write('! -*- f90 -*-\n')
|
Chris@87
|
1305 f.write('! This file is autogenerated with f2py (version:%s)\n'%(f2py_version))
|
Chris@87
|
1306 f.write('! It contains Fortran 90 wrappers to fortran functions.\n')
|
Chris@87
|
1307 lines = []
|
Chris@87
|
1308 for l in ('\n\n'.join(funcwrappers2)+'\n').split('\n'):
|
Chris@87
|
1309 if len(l)>72 and l[0]==' ':
|
Chris@87
|
1310 lines.append(l[:72]+'&\n &')
|
Chris@87
|
1311 l = l[72:]
|
Chris@87
|
1312 while len(l)>66:
|
Chris@87
|
1313 lines.append(l[:66]+'&\n &')
|
Chris@87
|
1314 l = l[66:]
|
Chris@87
|
1315 lines.append(l+'\n')
|
Chris@87
|
1316 else: lines.append(l+'\n')
|
Chris@87
|
1317 lines = ''.join(lines).replace('\n &\n', '\n')
|
Chris@87
|
1318 f.write(lines)
|
Chris@87
|
1319 f.close()
|
Chris@87
|
1320 outmess('\tFortran 90 wrappers are saved to "%s"\n'%(wn))
|
Chris@87
|
1321 return ret
|
Chris@87
|
1322
|
Chris@87
|
1323 ################## Build C/API function #############
|
Chris@87
|
1324
|
Chris@87
|
1325 stnd={1:'st',2:'nd',3:'rd',4:'th',5:'th',6:'th',7:'th',8:'th',9:'th',0:'th'}
|
Chris@87
|
1326
|
Chris@87
|
1327 def buildapi(rout):
|
Chris@87
|
1328 rout, wrap = func2subr.assubr(rout)
|
Chris@87
|
1329 args, depargs=getargs2(rout)
|
Chris@87
|
1330 capi_maps.depargs=depargs
|
Chris@87
|
1331 var=rout['vars']
|
Chris@87
|
1332 auxvars = [a for a in var.keys() if isintent_aux(var[a])]
|
Chris@87
|
1333
|
Chris@87
|
1334 if ismoduleroutine(rout):
|
Chris@87
|
1335 outmess('\t\t\tConstructing wrapper function "%s.%s"...\n'%(rout['modulename'], rout['name']))
|
Chris@87
|
1336 else:
|
Chris@87
|
1337 outmess('\t\tConstructing wrapper function "%s"...\n'%(rout['name']))
|
Chris@87
|
1338 # Routine
|
Chris@87
|
1339 vrd=routsign2map(rout)
|
Chris@87
|
1340 rd=dictappend({}, vrd)
|
Chris@87
|
1341 for r in rout_rules:
|
Chris@87
|
1342 if ('_check' in r and r['_check'](rout)) or ('_check' not in r):
|
Chris@87
|
1343 ar=applyrules(r, vrd, rout)
|
Chris@87
|
1344 rd=dictappend(rd, ar)
|
Chris@87
|
1345
|
Chris@87
|
1346 # Args
|
Chris@87
|
1347 nth, nthk=0, 0
|
Chris@87
|
1348 savevrd={}
|
Chris@87
|
1349 for a in args:
|
Chris@87
|
1350 vrd=sign2map(a, var[a])
|
Chris@87
|
1351 if isintent_aux(var[a]):
|
Chris@87
|
1352 _rules = aux_rules
|
Chris@87
|
1353 else:
|
Chris@87
|
1354 _rules = arg_rules
|
Chris@87
|
1355 if not isintent_hide(var[a]):
|
Chris@87
|
1356 if not isoptional(var[a]):
|
Chris@87
|
1357 nth=nth+1
|
Chris@87
|
1358 vrd['nth']=repr(nth)+stnd[nth%10]+' argument'
|
Chris@87
|
1359 else:
|
Chris@87
|
1360 nthk=nthk+1
|
Chris@87
|
1361 vrd['nth']=repr(nthk)+stnd[nthk%10]+' keyword'
|
Chris@87
|
1362 else: vrd['nth']='hidden'
|
Chris@87
|
1363 savevrd[a]=vrd
|
Chris@87
|
1364 for r in _rules:
|
Chris@87
|
1365 if '_depend' in r:
|
Chris@87
|
1366 continue
|
Chris@87
|
1367 if ('_check' in r and r['_check'](var[a])) or ('_check' not in r):
|
Chris@87
|
1368 ar=applyrules(r, vrd, var[a])
|
Chris@87
|
1369 rd=dictappend(rd, ar)
|
Chris@87
|
1370 if '_break' in r:
|
Chris@87
|
1371 break
|
Chris@87
|
1372 for a in depargs:
|
Chris@87
|
1373 if isintent_aux(var[a]):
|
Chris@87
|
1374 _rules = aux_rules
|
Chris@87
|
1375 else:
|
Chris@87
|
1376 _rules = arg_rules
|
Chris@87
|
1377 vrd=savevrd[a]
|
Chris@87
|
1378 for r in _rules:
|
Chris@87
|
1379 if '_depend' not in r:
|
Chris@87
|
1380 continue
|
Chris@87
|
1381 if ('_check' in r and r['_check'](var[a])) or ('_check' not in r):
|
Chris@87
|
1382 ar=applyrules(r, vrd, var[a])
|
Chris@87
|
1383 rd=dictappend(rd, ar)
|
Chris@87
|
1384 if '_break' in r:
|
Chris@87
|
1385 break
|
Chris@87
|
1386 if 'check' in var[a]:
|
Chris@87
|
1387 for c in var[a]['check']:
|
Chris@87
|
1388 vrd['check']=c
|
Chris@87
|
1389 ar=applyrules(check_rules, vrd, var[a])
|
Chris@87
|
1390 rd=dictappend(rd, ar)
|
Chris@87
|
1391 if isinstance(rd['cleanupfrompyobj'], list):
|
Chris@87
|
1392 rd['cleanupfrompyobj'].reverse()
|
Chris@87
|
1393 if isinstance(rd['closepyobjfrom'], list):
|
Chris@87
|
1394 rd['closepyobjfrom'].reverse()
|
Chris@87
|
1395 rd['docsignature']=stripcomma(replace('#docsign##docsignopt##docsignxa#',
|
Chris@87
|
1396 {'docsign':rd['docsign'],
|
Chris@87
|
1397 'docsignopt':rd['docsignopt'],
|
Chris@87
|
1398 'docsignxa':rd['docsignxa']}))
|
Chris@87
|
1399 optargs=stripcomma(replace('#docsignopt##docsignxa#',
|
Chris@87
|
1400 {'docsignxa':rd['docsignxashort'],
|
Chris@87
|
1401 'docsignopt':rd['docsignoptshort']}
|
Chris@87
|
1402 ))
|
Chris@87
|
1403 if optargs=='':
|
Chris@87
|
1404 rd['docsignatureshort']=stripcomma(replace('#docsign#', {'docsign':rd['docsign']}))
|
Chris@87
|
1405 else:
|
Chris@87
|
1406 rd['docsignatureshort']=replace('#docsign#[#docsignopt#]',
|
Chris@87
|
1407 {'docsign': rd['docsign'],
|
Chris@87
|
1408 'docsignopt': optargs,
|
Chris@87
|
1409 })
|
Chris@87
|
1410 rd['latexdocsignatureshort']=rd['docsignatureshort'].replace('_', '\\_')
|
Chris@87
|
1411 rd['latexdocsignatureshort']=rd['latexdocsignatureshort'].replace(',', ', ')
|
Chris@87
|
1412 cfs=stripcomma(replace('#callfortran##callfortranappend#', {'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))
|
Chris@87
|
1413 if len(rd['callfortranappend'])>1:
|
Chris@87
|
1414 rd['callcompaqfortran']=stripcomma(replace('#callfortran# 0,#callfortranappend#', {'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))
|
Chris@87
|
1415 else:
|
Chris@87
|
1416 rd['callcompaqfortran']=cfs
|
Chris@87
|
1417 rd['callfortran']=cfs
|
Chris@87
|
1418 if isinstance(rd['docreturn'], list):
|
Chris@87
|
1419 rd['docreturn']=stripcomma(replace('#docreturn#', {'docreturn':rd['docreturn']}))+' = '
|
Chris@87
|
1420 rd['docstrsigns']=[]
|
Chris@87
|
1421 rd['latexdocstrsigns']=[]
|
Chris@87
|
1422 for k in ['docstrreq', 'docstropt', 'docstrout', 'docstrcbs']:
|
Chris@87
|
1423 if k in rd and isinstance(rd[k], list):
|
Chris@87
|
1424 rd['docstrsigns']=rd['docstrsigns']+rd[k]
|
Chris@87
|
1425 k='latex'+k
|
Chris@87
|
1426 if k in rd and isinstance(rd[k], list):
|
Chris@87
|
1427 rd['latexdocstrsigns']=rd['latexdocstrsigns']+rd[k][0:1]+\
|
Chris@87
|
1428 ['\\begin{description}']+rd[k][1:]+\
|
Chris@87
|
1429 ['\\end{description}']
|
Chris@87
|
1430
|
Chris@87
|
1431 # Workaround for Python 2.6, 2.6.1 bug: http://bugs.python.org/issue4720
|
Chris@87
|
1432 if rd['keyformat'] or rd['xaformat']:
|
Chris@87
|
1433 argformat = rd['argformat']
|
Chris@87
|
1434 if isinstance(argformat, list):
|
Chris@87
|
1435 argformat.append('|')
|
Chris@87
|
1436 else:
|
Chris@87
|
1437 assert isinstance(argformat, str), repr((argformat, type(argformat)))
|
Chris@87
|
1438 rd['argformat'] += '|'
|
Chris@87
|
1439
|
Chris@87
|
1440 ar=applyrules(routine_rules, rd)
|
Chris@87
|
1441 if ismoduleroutine(rout):
|
Chris@87
|
1442 outmess('\t\t\t %s\n'%(ar['docshort']))
|
Chris@87
|
1443 else:
|
Chris@87
|
1444 outmess('\t\t %s\n'%(ar['docshort']))
|
Chris@87
|
1445 return ar, wrap
|
Chris@87
|
1446
|
Chris@87
|
1447
|
Chris@87
|
1448 #################### EOF rules.py #######################
|