annotate DEPENDENCIES/mingw32/Python27/Lib/site-packages/numpy/f2py/rules.py @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2a2c65a20a8b
children
rev   line source
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 #######################