summaryrefslogtreecommitdiff
path: root/numpy/f2py/cb_rules.py
diff options
context:
space:
mode:
Diffstat (limited to 'numpy/f2py/cb_rules.py')
-rw-r--r--numpy/f2py/cb_rules.py495
1 files changed, 255 insertions, 240 deletions
diff --git a/numpy/f2py/cb_rules.py b/numpy/f2py/cb_rules.py
index 29c0c1c5d..7d49544ac 100644
--- a/numpy/f2py/cb_rules.py
+++ b/numpy/f2py/cb_rules.py
@@ -29,12 +29,11 @@ from . import cfuncs
f2py_version = __version__.version
-
################## Rules for callback function ##############
-cb_routine_rules={
- 'cbtypedefs':'typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);',
- 'body':"""
+cb_routine_rules = {
+ 'cbtypedefs': 'typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);',
+ 'body': """
#begintitle#
PyObject *#name#_capi = NULL;/*was Py_None*/
PyTupleObject *#name#_args_capi = NULL;
@@ -128,96 +127,98 @@ capi_return_pt:
}
#endtitle#
""",
- 'need':['setjmp.h', 'CFUNCSMESS'],
- 'maxnofargs':'#maxnofargs#',
- 'nofoptargs':'#nofoptargs#',
- 'docstr':"""\
+ 'need': ['setjmp.h', 'CFUNCSMESS'],
+ 'maxnofargs': '#maxnofargs#',
+ 'nofoptargs': '#nofoptargs#',
+ 'docstr': """\
\tdef #argname#(#docsignature#): return #docreturn#\\n\\
#docstrsigns#""",
- 'latexdocstr':"""
+ 'latexdocstr': """
{{}\\verb@def #argname#(#latexdocsignature#): return #docreturn#@{}}
#routnote#
#latexdocstrsigns#""",
- 'docstrshort':'def #argname#(#docsignature#): return #docreturn#'
- }
-cb_rout_rules=[
- {# Init
- 'separatorsfor': {'decl': '\n',
- 'args': ',', 'optargs': '', 'pyobjfrom': '\n', 'freemem': '\n',
- 'args_td': ',', 'optargs_td': '',
- 'args_nm': ',', 'optargs_nm': '',
- 'frompyobj': '\n', 'setdims': '\n',
- 'docstrsigns': '\\n"\n"',
- 'latexdocstrsigns': '\n',
- 'latexdocstrreq': '\n', 'latexdocstropt': '\n',
- 'latexdocstrout': '\n', 'latexdocstrcbs': '\n',
- },
- 'decl': '/*decl*/', 'pyobjfrom': '/*pyobjfrom*/', 'frompyobj': '/*frompyobj*/',
- 'args': [], 'optargs': '', 'return': '', 'strarglens': '', 'freemem': '/*freemem*/',
- 'args_td': [], 'optargs_td': '', 'strarglens_td': '',
- 'args_nm': [], 'optargs_nm': '', 'strarglens_nm': '',
- 'noargs': '',
- 'setdims': '/*setdims*/',
- 'docstrsigns': '', 'latexdocstrsigns': '',
- 'docstrreq': '\tRequired arguments:',
- 'docstropt': '\tOptional arguments:',
- 'docstrout': '\tReturn objects:',
- 'docstrcbs': '\tCall-back functions:',
- 'docreturn': '', 'docsign': '', 'docsignopt': '',
- 'latexdocstrreq': '\\noindent Required arguments:',
- 'latexdocstropt': '\\noindent Optional arguments:',
- 'latexdocstrout': '\\noindent Return objects:',
- 'latexdocstrcbs': '\\noindent Call-back functions:',
- 'routnote': {hasnote:'--- #note#',l_not(hasnote):''},
- }, { # Function
- 'decl':'\t#ctype# return_value;',
- 'frompyobj':[{debugcapi:'\tCFUNCSMESS("cb:Getting return_value->");'},
- '\tif (capi_j>capi_i)\n\t\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\\n");',
- {debugcapi:'\tfprintf(stderr,"#showvalueformat#.\\n",return_value);'}
- ],
- 'need':['#ctype#_from_pyobj', {debugcapi:'CFUNCSMESS'}, 'GETSCALARFROMPYTUPLE'],
- 'return':'\treturn return_value;',
- '_check':l_and(isfunction, l_not(isstringfunction), l_not(iscomplexfunction))
+ 'docstrshort': 'def #argname#(#docsignature#): return #docreturn#'
+}
+cb_rout_rules = [
+ { # Init
+ 'separatorsfor': {'decl': '\n',
+ 'args': ',', 'optargs': '', 'pyobjfrom': '\n', 'freemem': '\n',
+ 'args_td': ',', 'optargs_td': '',
+ 'args_nm': ',', 'optargs_nm': '',
+ 'frompyobj': '\n', 'setdims': '\n',
+ 'docstrsigns': '\\n"\n"',
+ 'latexdocstrsigns': '\n',
+ 'latexdocstrreq': '\n', 'latexdocstropt': '\n',
+ 'latexdocstrout': '\n', 'latexdocstrcbs': '\n',
+ },
+ 'decl': '/*decl*/', 'pyobjfrom': '/*pyobjfrom*/', 'frompyobj': '/*frompyobj*/',
+ 'args': [], 'optargs': '', 'return': '', 'strarglens': '', 'freemem': '/*freemem*/',
+ 'args_td': [], 'optargs_td': '', 'strarglens_td': '',
+ 'args_nm': [], 'optargs_nm': '', 'strarglens_nm': '',
+ 'noargs': '',
+ 'setdims': '/*setdims*/',
+ 'docstrsigns': '', 'latexdocstrsigns': '',
+ 'docstrreq': '\tRequired arguments:',
+ 'docstropt': '\tOptional arguments:',
+ 'docstrout': '\tReturn objects:',
+ 'docstrcbs': '\tCall-back functions:',
+ 'docreturn': '', 'docsign': '', 'docsignopt': '',
+ 'latexdocstrreq': '\\noindent Required arguments:',
+ 'latexdocstropt': '\\noindent Optional arguments:',
+ 'latexdocstrout': '\\noindent Return objects:',
+ 'latexdocstrcbs': '\\noindent Call-back functions:',
+ 'routnote': {hasnote: '--- #note#', l_not(hasnote): ''},
+ }, { # Function
+ 'decl': '\t#ctype# return_value;',
+ 'frompyobj': [{debugcapi: '\tCFUNCSMESS("cb:Getting return_value->");'},
+ '\tif (capi_j>capi_i)\n\t\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\\n");',
+ {debugcapi:
+ '\tfprintf(stderr,"#showvalueformat#.\\n",return_value);'}
+ ],
+ 'need': ['#ctype#_from_pyobj', {debugcapi: 'CFUNCSMESS'}, 'GETSCALARFROMPYTUPLE'],
+ 'return': '\treturn return_value;',
+ '_check': l_and(isfunction, l_not(isstringfunction), l_not(iscomplexfunction))
},
- {# String function
- 'pyobjfrom':{debugcapi:'\tfprintf(stderr,"debug-capi:cb:#name#:%d:\\n",return_value_len);'},
- 'args':'#ctype# return_value,int return_value_len',
- 'args_nm':'return_value,&return_value_len',
- 'args_td':'#ctype# ,int',
- 'frompyobj':[{debugcapi:'\tCFUNCSMESS("cb:Getting return_value->\\"");'},
- """\tif (capi_j>capi_i)
+ { # String function
+ 'pyobjfrom': {debugcapi: '\tfprintf(stderr,"debug-capi:cb:#name#:%d:\\n",return_value_len);'},
+ 'args': '#ctype# return_value,int return_value_len',
+ 'args_nm': 'return_value,&return_value_len',
+ 'args_td': '#ctype# ,int',
+ 'frompyobj': [{debugcapi: '\tCFUNCSMESS("cb:Getting return_value->\\"");'},
+ """\tif (capi_j>capi_i)
\t\tGETSTRFROMPYTUPLE(capi_return,capi_i++,return_value,return_value_len);""",
- {debugcapi:'\tfprintf(stderr,"#showvalueformat#\\".\\n",return_value);'}
- ],
- 'need':['#ctype#_from_pyobj', {debugcapi:'CFUNCSMESS'},
- 'string.h', 'GETSTRFROMPYTUPLE'],
- 'return':'return;',
- '_check':isstringfunction
+ {debugcapi:
+ '\tfprintf(stderr,"#showvalueformat#\\".\\n",return_value);'}
+ ],
+ 'need': ['#ctype#_from_pyobj', {debugcapi: 'CFUNCSMESS'},
+ 'string.h', 'GETSTRFROMPYTUPLE'],
+ 'return': 'return;',
+ '_check': isstringfunction
},
- {# Complex function
- 'optargs':"""
+ { # Complex function
+ 'optargs': """
#ifndef F2PY_CB_RETURNCOMPLEX
#ctype# *return_value
#endif
""",
- 'optargs_nm':"""
+ 'optargs_nm': """
#ifndef F2PY_CB_RETURNCOMPLEX
return_value
#endif
""",
- 'optargs_td':"""
+ 'optargs_td': """
#ifndef F2PY_CB_RETURNCOMPLEX
#ctype# *
#endif
""",
- 'decl':"""
+ 'decl': """
#ifdef F2PY_CB_RETURNCOMPLEX
\t#ctype# return_value;
#endif
""",
- 'frompyobj':[{debugcapi:'\tCFUNCSMESS("cb:Getting return_value->");'},
- """\
+ 'frompyobj': [{debugcapi: '\tCFUNCSMESS("cb:Getting return_value->");'},
+ """\
\tif (capi_j>capi_i)
#ifdef F2PY_CB_RETURNCOMPLEX
\t\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,\"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\\n\");
@@ -225,7 +226,7 @@ return_value
\t\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,return_value,#ctype#,\"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\\n\");
#endif
""",
- {debugcapi:"""
+ {debugcapi: """
#ifdef F2PY_CB_RETURNCOMPLEX
\tfprintf(stderr,\"#showvalueformat#.\\n\",(return_value).r,(return_value).i);
#else
@@ -233,154 +234,162 @@ return_value
#endif
"""}
- ],
- 'return':"""
+ ],
+ 'return': """
#ifdef F2PY_CB_RETURNCOMPLEX
\treturn return_value;
#else
\treturn;
#endif
""",
- 'need':['#ctype#_from_pyobj', {debugcapi:'CFUNCSMESS'},
- 'string.h', 'GETSCALARFROMPYTUPLE', '#ctype#'],
- '_check':iscomplexfunction
+ 'need': ['#ctype#_from_pyobj', {debugcapi: 'CFUNCSMESS'},
+ 'string.h', 'GETSCALARFROMPYTUPLE', '#ctype#'],
+ '_check': iscomplexfunction
},
- {'docstrout':'\t\t#pydocsignout#',
- 'latexdocstrout':['\\item[]{{}\\verb@#pydocsignout#@{}}',
- {hasnote:'--- #note#'}],
- 'docreturn':'#rname#,',
- '_check':isfunction},
- {'_check':issubroutine,'return':'return;'}
- ]
+ {'docstrout': '\t\t#pydocsignout#',
+ 'latexdocstrout': ['\\item[]{{}\\verb@#pydocsignout#@{}}',
+ {hasnote: '--- #note#'}],
+ 'docreturn': '#rname#,',
+ '_check': isfunction},
+ {'_check': issubroutine, 'return': 'return;'}
+]
-cb_arg_rules=[
- { # Doc
- 'docstropt':{l_and(isoptional, isintent_nothide):'\t\t#pydocsign#'},
- 'docstrreq':{l_and(isrequired, isintent_nothide):'\t\t#pydocsign#'},
- 'docstrout':{isintent_out:'\t\t#pydocsignout#'},
- 'latexdocstropt':{l_and(isoptional, isintent_nothide):['\\item[]{{}\\verb@#pydocsign#@{}}',
- {hasnote:'--- #note#'}]},
- 'latexdocstrreq':{l_and(isrequired, isintent_nothide):['\\item[]{{}\\verb@#pydocsign#@{}}',
- {hasnote:'--- #note#'}]},
- 'latexdocstrout':{isintent_out:['\\item[]{{}\\verb@#pydocsignout#@{}}',
- {l_and(hasnote, isintent_hide):'--- #note#',
- l_and(hasnote, isintent_nothide):'--- See above.'}]},
- 'docsign':{l_and(isrequired, isintent_nothide):'#varname#,'},
- 'docsignopt':{l_and(isoptional, isintent_nothide):'#varname#,'},
- 'depend':''
+cb_arg_rules = [
+ { # Doc
+ 'docstropt': {l_and(isoptional, isintent_nothide): '\t\t#pydocsign#'},
+ 'docstrreq': {l_and(isrequired, isintent_nothide): '\t\t#pydocsign#'},
+ 'docstrout': {isintent_out: '\t\t#pydocsignout#'},
+ 'latexdocstropt': {l_and(isoptional, isintent_nothide): ['\\item[]{{}\\verb@#pydocsign#@{}}',
+ {hasnote: '--- #note#'}]},
+ 'latexdocstrreq': {l_and(isrequired, isintent_nothide): ['\\item[]{{}\\verb@#pydocsign#@{}}',
+ {hasnote: '--- #note#'}]},
+ 'latexdocstrout': {isintent_out: ['\\item[]{{}\\verb@#pydocsignout#@{}}',
+ {l_and(hasnote, isintent_hide): '--- #note#',
+ l_and(hasnote, isintent_nothide): '--- See above.'}]},
+ 'docsign': {l_and(isrequired, isintent_nothide): '#varname#,'},
+ 'docsignopt': {l_and(isoptional, isintent_nothide): '#varname#,'},
+ 'depend': ''
},
{
- 'args': {
- l_and (isscalar, isintent_c):'#ctype# #varname_i#',
- l_and (isscalar, l_not(isintent_c)):'#ctype# *#varname_i#_cb_capi',
- isarray:'#ctype# *#varname_i#',
- isstring:'#ctype# #varname_i#'
- },
- 'args_nm': {
- l_and (isscalar, isintent_c):'#varname_i#',
- l_and (isscalar, l_not(isintent_c)):'#varname_i#_cb_capi',
- isarray:'#varname_i#',
- isstring:'#varname_i#'
- },
- 'args_td': {
- l_and (isscalar, isintent_c):'#ctype#',
- l_and (isscalar, l_not(isintent_c)):'#ctype# *',
- isarray:'#ctype# *',
- isstring:'#ctype#'
+ 'args': {
+ l_and(isscalar, isintent_c): '#ctype# #varname_i#',
+ l_and(isscalar, l_not(isintent_c)): '#ctype# *#varname_i#_cb_capi',
+ isarray: '#ctype# *#varname_i#',
+ isstring: '#ctype# #varname_i#'
+ },
+ 'args_nm': {
+ l_and(isscalar, isintent_c): '#varname_i#',
+ l_and(isscalar, l_not(isintent_c)): '#varname_i#_cb_capi',
+ isarray: '#varname_i#',
+ isstring: '#varname_i#'
+ },
+ 'args_td': {
+ l_and(isscalar, isintent_c): '#ctype#',
+ l_and(isscalar, l_not(isintent_c)): '#ctype# *',
+ isarray: '#ctype# *',
+ isstring: '#ctype#'
+ },
+ # untested with multiple args
+ 'strarglens': {isstring: ',int #varname_i#_cb_len'},
+ 'strarglens_td': {isstring: ',int'}, # untested with multiple args
+ # untested with multiple args
+ 'strarglens_nm': {isstring: ',#varname_i#_cb_len'},
},
- 'strarglens': {isstring:',int #varname_i#_cb_len'}, # untested with multiple args
- 'strarglens_td': {isstring:',int'}, # untested with multiple args
- 'strarglens_nm': {isstring:',#varname_i#_cb_len'}, # untested with multiple args
- },
- { # Scalars
- 'decl':{l_not(isintent_c):'\t#ctype# #varname_i#=(*#varname_i#_cb_capi);'},
- 'error': {l_and(isintent_c, isintent_out,
- throw_error('intent(c,out) is forbidden for callback scalar arguments')):\
- ''},
- 'frompyobj':[{debugcapi:'\tCFUNCSMESS("cb:Getting #varname#->");'},
- {isintent_out:'\tif (capi_j>capi_i)\n\t\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,#varname_i#_cb_capi,#ctype#,"#ctype#_from_pyobj failed in converting argument #varname# of call-back function #name# to C #ctype#\\n");'},
- {l_and(debugcapi, l_and(l_not(iscomplex), isintent_c)):'\tfprintf(stderr,"#showvalueformat#.\\n",#varname_i#);'},
- {l_and(debugcapi, l_and(l_not(iscomplex), l_not(isintent_c))):'\tfprintf(stderr,"#showvalueformat#.\\n",*#varname_i#_cb_capi);'},
- {l_and(debugcapi, l_and(iscomplex, isintent_c)):'\tfprintf(stderr,"#showvalueformat#.\\n",(#varname_i#).r,(#varname_i#).i);'},
- {l_and(debugcapi, l_and(iscomplex, l_not(isintent_c))):'\tfprintf(stderr,"#showvalueformat#.\\n",(*#varname_i#_cb_capi).r,(*#varname_i#_cb_capi).i);'},
- ],
- 'need':[{isintent_out:['#ctype#_from_pyobj', 'GETSCALARFROMPYTUPLE']},
- {debugcapi:'CFUNCSMESS'}],
- '_check':isscalar
- }, {
- 'pyobjfrom':[{isintent_in:"""\
+ { # Scalars
+ 'decl': {l_not(isintent_c): '\t#ctype# #varname_i#=(*#varname_i#_cb_capi);'},
+ 'error': {l_and(isintent_c, isintent_out,
+ throw_error('intent(c,out) is forbidden for callback scalar arguments')):
+ ''},
+ 'frompyobj': [{debugcapi: '\tCFUNCSMESS("cb:Getting #varname#->");'},
+ {isintent_out:
+ '\tif (capi_j>capi_i)\n\t\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,#varname_i#_cb_capi,#ctype#,"#ctype#_from_pyobj failed in converting argument #varname# of call-back function #name# to C #ctype#\\n");'},
+ {l_and(debugcapi, l_and(l_not(iscomplex), isintent_c)):
+ '\tfprintf(stderr,"#showvalueformat#.\\n",#varname_i#);'},
+ {l_and(debugcapi, l_and(l_not(iscomplex), l_not( isintent_c))):
+ '\tfprintf(stderr,"#showvalueformat#.\\n",*#varname_i#_cb_capi);'},
+ {l_and(debugcapi, l_and(iscomplex, isintent_c)):
+ '\tfprintf(stderr,"#showvalueformat#.\\n",(#varname_i#).r,(#varname_i#).i);'},
+ {l_and(debugcapi, l_and(iscomplex, l_not( isintent_c))):
+ '\tfprintf(stderr,"#showvalueformat#.\\n",(*#varname_i#_cb_capi).r,(*#varname_i#_cb_capi).i);'},
+ ],
+ 'need': [{isintent_out: ['#ctype#_from_pyobj', 'GETSCALARFROMPYTUPLE']},
+ {debugcapi: 'CFUNCSMESS'}],
+ '_check': isscalar
+ }, {
+ 'pyobjfrom': [{isintent_in: """\
\tif (#name#_nofargs>capi_i)
\t\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyobj_from_#ctype#1(#varname_i#)))
\t\t\tgoto capi_fail;"""},
- {isintent_inout:"""\
+ {isintent_inout: """\
\tif (#name#_nofargs>capi_i)
\t\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyarr_from_p_#ctype#1(#varname_i#_cb_capi)))
\t\t\tgoto capi_fail;"""}],
- 'need':[{isintent_in:'pyobj_from_#ctype#1'},
- {isintent_inout:'pyarr_from_p_#ctype#1'},
- {iscomplex:'#ctype#'}],
- '_check':l_and(isscalar, isintent_nothide),
- '_optional':''
- }, {# String
- 'frompyobj':[{debugcapi:'\tCFUNCSMESS("cb:Getting #varname#->\\"");'},
- """\tif (capi_j>capi_i)
+ 'need': [{isintent_in: 'pyobj_from_#ctype#1'},
+ {isintent_inout: 'pyarr_from_p_#ctype#1'},
+ {iscomplex: '#ctype#'}],
+ '_check': l_and(isscalar, isintent_nothide),
+ '_optional': ''
+ }, { # String
+ 'frompyobj': [{debugcapi: '\tCFUNCSMESS("cb:Getting #varname#->\\"");'},
+ """\tif (capi_j>capi_i)
\t\tGETSTRFROMPYTUPLE(capi_return,capi_i++,#varname_i#,#varname_i#_cb_len);""",
- {debugcapi:'\tfprintf(stderr,"#showvalueformat#\\":%d:.\\n",#varname_i#,#varname_i#_cb_len);'},
- ],
- 'need':['#ctype#', 'GETSTRFROMPYTUPLE',
- {debugcapi:'CFUNCSMESS'}, 'string.h'],
- '_check':l_and(isstring, isintent_out)
+ {debugcapi:
+ '\tfprintf(stderr,"#showvalueformat#\\":%d:.\\n",#varname_i#,#varname_i#_cb_len);'},
+ ],
+ 'need': ['#ctype#', 'GETSTRFROMPYTUPLE',
+ {debugcapi: 'CFUNCSMESS'}, 'string.h'],
+ '_check': l_and(isstring, isintent_out)
}, {
- 'pyobjfrom':[{debugcapi:'\tfprintf(stderr,"debug-capi:cb:#varname#=\\"#showvalueformat#\\":%d:\\n",#varname_i#,#varname_i#_cb_len);'},
- {isintent_in:"""\
+ 'pyobjfrom': [{debugcapi: '\tfprintf(stderr,"debug-capi:cb:#varname#=\\"#showvalueformat#\\":%d:\\n",#varname_i#,#varname_i#_cb_len);'},
+ {isintent_in: """\
\tif (#name#_nofargs>capi_i)
\t\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyobj_from_#ctype#1size(#varname_i#,#varname_i#_cb_len)))
\t\t\tgoto capi_fail;"""},
- {isintent_inout:"""\
+ {isintent_inout: """\
\tif (#name#_nofargs>capi_i) {
\t\tint #varname_i#_cb_dims[] = {#varname_i#_cb_len};
\t\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyarr_from_p_#ctype#1(#varname_i#,#varname_i#_cb_dims)))
\t\t\tgoto capi_fail;
\t}"""}],
- 'need':[{isintent_in:'pyobj_from_#ctype#1size'},
- {isintent_inout:'pyarr_from_p_#ctype#1'}],
- '_check':l_and(isstring, isintent_nothide),
- '_optional':''
+ 'need': [{isintent_in: 'pyobj_from_#ctype#1size'},
+ {isintent_inout: 'pyarr_from_p_#ctype#1'}],
+ '_check': l_and(isstring, isintent_nothide),
+ '_optional': ''
},
-# Array ...
+ # Array ...
{
- 'decl':'\tnpy_intp #varname_i#_Dims[#rank#] = {#rank*[-1]#};',
- 'setdims':'\t#cbsetdims#;',
- '_check':isarray,
- '_depend':''
+ 'decl': '\tnpy_intp #varname_i#_Dims[#rank#] = {#rank*[-1]#};',
+ 'setdims': '\t#cbsetdims#;',
+ '_check': isarray,
+ '_depend': ''
},
{
- 'pyobjfrom': [{debugcapi:'\tfprintf(stderr,"debug-capi:cb:#varname#\\n");'},
- {isintent_c: """\
+ 'pyobjfrom': [{debugcapi: '\tfprintf(stderr,"debug-capi:cb:#varname#\\n");'},
+ {isintent_c: """\
\tif (#name#_nofargs>capi_i) {
\t\tPyArrayObject *tmp_arr = (PyArrayObject *)PyArray_New(&PyArray_Type,#rank#,#varname_i#_Dims,#atype#,NULL,(char*)#varname_i#,0,NPY_ARRAY_CARRAY,NULL); /*XXX: Hmm, what will destroy this array??? */
""",
- l_not(isintent_c): """\
+ l_not(isintent_c): """\
\tif (#name#_nofargs>capi_i) {
\t\tPyArrayObject *tmp_arr = (PyArrayObject *)PyArray_New(&PyArray_Type,#rank#,#varname_i#_Dims,#atype#,NULL,(char*)#varname_i#,0,NPY_ARRAY_FARRAY,NULL); /*XXX: Hmm, what will destroy this array??? */
""",
- },
- """
+ },
+ """
\t\tif (tmp_arr==NULL)
\t\t\tgoto capi_fail;
\t\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,(PyObject *)tmp_arr))
\t\t\tgoto capi_fail;
}"""],
- '_check': l_and(isarray, isintent_nothide, l_or(isintent_in, isintent_inout)),
- '_optional': '',
+ '_check': l_and(isarray, isintent_nothide, l_or(isintent_in, isintent_inout)),
+ '_optional': '',
}, {
- 'frompyobj':[{debugcapi:'\tCFUNCSMESS("cb:Getting #varname#->");'},
- """\tif (capi_j>capi_i) {
+ 'frompyobj': [{debugcapi: '\tCFUNCSMESS("cb:Getting #varname#->");'},
+ """\tif (capi_j>capi_i) {
\t\tPyArrayObject *rv_cb_arr = NULL;
\t\tif ((capi_tmp = PyTuple_GetItem(capi_return,capi_i++))==NULL) goto capi_fail;
\t\trv_cb_arr = array_from_pyobj(#atype#,#varname_i#_Dims,#rank#,F2PY_INTENT_IN""",
- {isintent_c:'|F2PY_INTENT_C'},
- """,capi_tmp);
+ {isintent_c: '|F2PY_INTENT_C'},
+ """,capi_tmp);
\t\tif (rv_cb_arr == NULL) {
\t\t\tfprintf(stderr,\"rv_cb_arr is NULL\\n\");
\t\t\tgoto capi_fail;
@@ -390,151 +399,157 @@ cb_arg_rules=[
\t\t\tPy_DECREF(rv_cb_arr);
\t\t}
\t}""",
- {debugcapi:'\tfprintf(stderr,"<-.\\n");'},
- ],
- 'need':['MEMCOPY', {iscomplexarray:'#ctype#'}],
- '_check':l_and(isarray, isintent_out)
+ {debugcapi: '\tfprintf(stderr,"<-.\\n");'},
+ ],
+ 'need': ['MEMCOPY', {iscomplexarray: '#ctype#'}],
+ '_check': l_and(isarray, isintent_out)
}, {
- 'docreturn':'#varname#,',
- '_check':isintent_out
+ 'docreturn': '#varname#,',
+ '_check': isintent_out
}
- ]
+]
################## Build call-back module #############
-cb_map={}
+cb_map = {}
+
+
def buildcallbacks(m):
global cb_map
- cb_map[m['name']]=[]
+ cb_map[m['name']] = []
for bi in m['body']:
- if bi['block']=='interface':
+ if bi['block'] == 'interface':
for b in bi['body']:
if b:
buildcallback(b, m['name'])
else:
errmess('warning: empty body for %s\n' % (m['name']))
+
def buildcallback(rout, um):
global cb_map
from . import capi_maps
- outmess('\tConstructing call-back function "cb_%s_in_%s"\n'%(rout['name'], um))
- args, depargs=getargs(rout)
- capi_maps.depargs=depargs
- var=rout['vars']
- vrd=capi_maps.cb_routsign2map(rout, um)
- rd=dictappend({}, vrd)
+ outmess('\tConstructing call-back function "cb_%s_in_%s"\n' %
+ (rout['name'], um))
+ args, depargs = getargs(rout)
+ capi_maps.depargs = depargs
+ var = rout['vars']
+ vrd = capi_maps.cb_routsign2map(rout, um)
+ rd = dictappend({}, vrd)
cb_map[um].append([rout['name'], rd['name']])
for r in cb_rout_rules:
if ('_check' in r and r['_check'](rout)) or ('_check' not in r):
- ar=applyrules(r, vrd, rout)
- rd=dictappend(rd, ar)
- savevrd={}
+ ar = applyrules(r, vrd, rout)
+ rd = dictappend(rd, ar)
+ savevrd = {}
for i, a in enumerate(args):
- vrd=capi_maps.cb_sign2map(a, var[a], index=i)
- savevrd[a]=vrd
+ vrd = capi_maps.cb_sign2map(a, var[a], index=i)
+ savevrd[a] = vrd
for r in cb_arg_rules:
if '_depend' in r:
continue
if '_optional' in r and isoptional(var[a]):
continue
if ('_check' in r and r['_check'](var[a])) or ('_check' not in r):
- ar=applyrules(r, vrd, var[a])
- rd=dictappend(rd, ar)
+ ar = applyrules(r, vrd, var[a])
+ rd = dictappend(rd, ar)
if '_break' in r:
break
for a in args:
- vrd=savevrd[a]
+ vrd = savevrd[a]
for r in cb_arg_rules:
if '_depend' in r:
continue
if ('_optional' not in r) or ('_optional' in r and isrequired(var[a])):
continue
if ('_check' in r and r['_check'](var[a])) or ('_check' not in r):
- ar=applyrules(r, vrd, var[a])
- rd=dictappend(rd, ar)
+ ar = applyrules(r, vrd, var[a])
+ rd = dictappend(rd, ar)
if '_break' in r:
break
for a in depargs:
- vrd=savevrd[a]
+ vrd = savevrd[a]
for r in cb_arg_rules:
if '_depend' not in r:
continue
if '_optional' in r:
continue
if ('_check' in r and r['_check'](var[a])) or ('_check' not in r):
- ar=applyrules(r, vrd, var[a])
- rd=dictappend(rd, ar)
+ ar = applyrules(r, vrd, var[a])
+ rd = dictappend(rd, ar)
if '_break' in r:
break
if 'args' in rd and 'optargs' in rd:
if isinstance(rd['optargs'], list):
- rd['optargs']=rd['optargs']+["""
+ rd['optargs'] = rd['optargs'] + ["""
#ifndef F2PY_CB_RETURNCOMPLEX
,
#endif
"""]
- rd['optargs_nm']=rd['optargs_nm']+["""
+ rd['optargs_nm'] = rd['optargs_nm'] + ["""
#ifndef F2PY_CB_RETURNCOMPLEX
,
#endif
"""]
- rd['optargs_td']=rd['optargs_td']+["""
+ rd['optargs_td'] = rd['optargs_td'] + ["""
#ifndef F2PY_CB_RETURNCOMPLEX
,
#endif
"""]
if isinstance(rd['docreturn'], list):
- rd['docreturn']=stripcomma(replace('#docreturn#', {'docreturn':rd['docreturn']}))
- optargs=stripcomma(replace('#docsignopt#',
- {'docsignopt':rd['docsignopt']}
- ))
- if optargs=='':
- rd['docsignature']=stripcomma(replace('#docsign#', {'docsign':rd['docsign']}))
+ rd['docreturn'] = stripcomma(
+ replace('#docreturn#', {'docreturn': rd['docreturn']}))
+ optargs = stripcomma(replace('#docsignopt#',
+ {'docsignopt': rd['docsignopt']}
+ ))
+ if optargs == '':
+ rd['docsignature'] = stripcomma(
+ replace('#docsign#', {'docsign': rd['docsign']}))
else:
- rd['docsignature']=replace('#docsign#[#docsignopt#]',
- {'docsign': rd['docsign'],
- 'docsignopt': optargs,
- })
- rd['latexdocsignature']=rd['docsignature'].replace('_', '\\_')
- rd['latexdocsignature']=rd['latexdocsignature'].replace(',', ', ')
- rd['docstrsigns']=[]
- rd['latexdocstrsigns']=[]
+ rd['docsignature'] = replace('#docsign#[#docsignopt#]',
+ {'docsign': rd['docsign'],
+ 'docsignopt': optargs,
+ })
+ rd['latexdocsignature'] = rd['docsignature'].replace('_', '\\_')
+ rd['latexdocsignature'] = rd['latexdocsignature'].replace(',', ', ')
+ rd['docstrsigns'] = []
+ rd['latexdocstrsigns'] = []
for k in ['docstrreq', 'docstropt', 'docstrout', 'docstrcbs']:
if k in rd and isinstance(rd[k], list):
- rd['docstrsigns']=rd['docstrsigns']+rd[k]
- k='latex'+k
+ rd['docstrsigns'] = rd['docstrsigns'] + rd[k]
+ k = 'latex' + k
if k in rd and isinstance(rd[k], list):
- rd['latexdocstrsigns']=rd['latexdocstrsigns']+rd[k][0:1]+\
- ['\\begin{description}']+rd[k][1:]+\
- ['\\end{description}']
+ rd['latexdocstrsigns'] = rd['latexdocstrsigns'] + rd[k][0:1] +\
+ ['\\begin{description}'] + rd[k][1:] +\
+ ['\\end{description}']
if 'args' not in rd:
- rd['args']=''
- rd['args_td']=''
- rd['args_nm']=''
+ rd['args'] = ''
+ rd['args_td'] = ''
+ rd['args_nm'] = ''
if not (rd.get('args') or rd.get('optargs') or rd.get('strarglens')):
rd['noargs'] = 'void'
- ar=applyrules(cb_routine_rules, rd)
- cfuncs.callbacks[rd['name']]=ar['body']
+ ar = applyrules(cb_routine_rules, rd)
+ cfuncs.callbacks[rd['name']] = ar['body']
if isinstance(ar['need'], str):
- ar['need']=[ar['need']]
+ ar['need'] = [ar['need']]
if 'need' in rd:
for t in cfuncs.typedefs.keys():
if t in rd['need']:
ar['need'].append(t)
- cfuncs.typedefs_generated[rd['name']+'_typedef'] = ar['cbtypedefs']
- ar['need'].append(rd['name']+'_typedef')
- cfuncs.needs[rd['name']]=ar['need']
+ cfuncs.typedefs_generated[rd['name'] + '_typedef'] = ar['cbtypedefs']
+ ar['need'].append(rd['name'] + '_typedef')
+ cfuncs.needs[rd['name']] = ar['need']
- capi_maps.lcb2_map[rd['name']]={'maxnofargs':ar['maxnofargs'],
- 'nofoptargs':ar['nofoptargs'],
- 'docstr':ar['docstr'],
- 'latexdocstr':ar['latexdocstr'],
- 'argname':rd['argname']
- }
- outmess('\t %s\n'%(ar['docstrshort']))
- #print ar['body']
+ capi_maps.lcb2_map[rd['name']] = {'maxnofargs': ar['maxnofargs'],
+ 'nofoptargs': ar['nofoptargs'],
+ 'docstr': ar['docstr'],
+ 'latexdocstr': ar['latexdocstr'],
+ 'argname': rd['argname']
+ }
+ outmess('\t %s\n' % (ar['docstrshort']))
+ # print ar['body']
return
################## Build call-back function #############