diff options
Diffstat (limited to 'numpy/f2py/cb_rules.py')
-rw-r--r-- | numpy/f2py/cb_rules.py | 529 |
1 files changed, 529 insertions, 0 deletions
diff --git a/numpy/f2py/cb_rules.py b/numpy/f2py/cb_rules.py new file mode 100644 index 000000000..273ea4a7c --- /dev/null +++ b/numpy/f2py/cb_rules.py @@ -0,0 +1,529 @@ +#!/usr/bin/env python +""" + +Build call-back mechanism for f2py2e. + +Copyright 2000 Pearu Peterson all rights reserved, +Pearu Peterson <pearu@ioc.ee> +Permission to use, modify, and distribute this software is given under the +terms of the NumPy License. + +NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. +$Date: 2005/07/20 11:27:58 $ +Pearu Peterson +""" + +__version__ = "$Revision: 1.53 $"[10:-1] + +import __version__ +f2py_version = __version__.version + + +import pprint +import sys,string,time,types,copy +errmess=sys.stderr.write +outmess=sys.stdout.write +show=pprint.pprint + +from auxfuncs import * +import capi_maps +#from capi_maps import * +import cfuncs + +################## Rules for callback function ############## + +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; +int #name#_nofargs = 0; +jmp_buf #name#_jmpbuf; +/*typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);*/ +#static# #rctype# #callbackname# (#optargs##args##strarglens##noargs#) { +\tPyTupleObject *capi_arglist = #name#_args_capi; +\tPyObject *capi_return = NULL; +\tPyObject *capi_tmp = NULL; +\tint capi_j,capi_i = 0; +\tint capi_longjmp_ok = 1; +#decl# +#ifdef F2PY_REPORT_ATEXIT +f2py_cb_start_clock(); +#endif +\tCFUNCSMESS(\"cb:Call-back function #name# (maxnofargs=#maxnofargs#(-#nofoptargs#))\\n\"); +\tCFUNCSMESSPY(\"cb:#name#_capi=\",#name#_capi); +\tif (#name#_capi==NULL) { +\t\tcapi_longjmp_ok = 0; +\t\t#name#_capi = PyObject_GetAttrString(#modulename#_module,\"#argname#\"); +\t} +\tif (#name#_capi==NULL) { +\t\tPyErr_SetString(#modulename#_error,\"cb: Callback #argname# not defined (as an argument or module #modulename# attribute).\\n\"); +\t\tgoto capi_fail; +\t} +\tif (PyCObject_Check(#name#_capi)) { +\t#name#_typedef #name#_cptr; +\t#name#_cptr = PyCObject_AsVoidPtr(#name#_capi); +\t#returncptr#(*#name#_cptr)(#optargs_nm##args_nm##strarglens_nm#); +\t#return# +\t} +\tif (capi_arglist==NULL) { +\t\tcapi_longjmp_ok = 0; +\t\tcapi_tmp = PyObject_GetAttrString(#modulename#_module,\"#argname#_extra_args\"); +\t\tif (capi_tmp) { +\t\t\tcapi_arglist = (PyTupleObject *)PySequence_Tuple(capi_tmp); +\t\t\tif (capi_arglist==NULL) { +\t\t\t\tPyErr_SetString(#modulename#_error,\"Failed to convert #modulename#.#argname#_extra_args to tuple.\\n\"); +\t\t\t\tgoto capi_fail; +\t\t\t} +\t\t} else { +\t\t\tPyErr_Clear(); +\t\t\tcapi_arglist = (PyTupleObject *)Py_BuildValue(\"()\"); +\t\t} +\t} +\tif (capi_arglist == NULL) { +\t\tPyErr_SetString(#modulename#_error,\"Callback #argname# argument list is not set.\\n\"); +\t\tgoto capi_fail; +\t} +#setdims# +#pyobjfrom# +\tCFUNCSMESSPY(\"cb:capi_arglist=\",capi_arglist); +\tCFUNCSMESS(\"cb:Call-back calling Python function #argname#.\\n\"); +#ifdef F2PY_REPORT_ATEXIT +f2py_cb_start_call_clock(); +#endif +\tcapi_return = PyObject_CallObject(#name#_capi,(PyObject *)capi_arglist); +#ifdef F2PY_REPORT_ATEXIT +f2py_cb_stop_call_clock(); +#endif +\tCFUNCSMESSPY(\"cb:capi_return=\",capi_return); +\tif (capi_return == NULL) { +\t\tfprintf(stderr,\"capi_return is NULL\\n\"); +\t\tgoto capi_fail; +\t} +\tif (capi_return == Py_None) { +\t\tPy_DECREF(capi_return); +\t\tcapi_return = Py_BuildValue(\"()\"); +\t} +\telse if (!PyTuple_Check(capi_return)) { +\t\tcapi_return = Py_BuildValue(\"(N)\",capi_return); +\t} +\tcapi_j = PyTuple_Size(capi_return); +\tcapi_i = 0; +#frompyobj# +\tCFUNCSMESS(\"cb:#name#:successful\\n\"); +\tPy_DECREF(capi_return); +#ifdef F2PY_REPORT_ATEXIT +f2py_cb_stop_clock(); +#endif +\tgoto capi_return_pt; +capi_fail: +\tfprintf(stderr,\"Call-back #name# failed.\\n\"); +\tPy_XDECREF(capi_return); +\tif (capi_longjmp_ok) +\t\tlongjmp(#name#_jmpbuf,-1); +capi_return_pt: +\t; +#return# +} +#endtitle# +""", + 'need':['setjmp.h','CFUNCSMESS'], + 'maxnofargs':'#maxnofargs#', + 'nofoptargs':'#nofoptargs#', + 'docstr':"""\ +\tdef #argname#(#docsignature#): return #docreturn#\\n\\ +#docstrsigns#""", + '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)) + }, + {# 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 + }, + {# Complex function + 'optargs':""" +#ifndef F2PY_CB_RETURNCOMPLEX +#ctype# *return_value +#endif +""", + 'optargs_nm':""" +#ifndef F2PY_CB_RETURNCOMPLEX +return_value +#endif +""", + 'optargs_td':""" +#ifndef F2PY_CB_RETURNCOMPLEX +#ctype# * +#endif +""", + 'decl':""" +#ifdef F2PY_CB_RETURNCOMPLEX +\t#ctype# return_value; +#endif +""", + '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\"); +#else +\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:""" +#ifdef F2PY_CB_RETURNCOMPLEX +\tfprintf(stderr,\"#showvalueformat#.\\n\",(return_value).r,(return_value).i); +#else +\tfprintf(stderr,\"#showvalueformat#.\\n\",(*return_value).r,(*return_value).i); +#endif + +"""} + ], + 'return':""" +#ifdef F2PY_CB_RETURNCOMPLEX +\treturn return_value; +#else +\treturn; +#endif +""", + '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;'} + ] + +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#', + l_and (isscalar,l_not(isintent_c)):'#ctype# *#varname#_cb_capi', + isarray:'#ctype# *#varname#', + isstring:'#ctype# #varname#' + }, + 'args_nm':{ + l_and (isscalar,isintent_c):'#varname#', + l_and (isscalar,l_not(isintent_c)):'#varname#_cb_capi', + isarray:'#varname#', + isstring:'#varname#' + }, + 'args_td':{ + l_and (isscalar,isintent_c):'#ctype#', + l_and (isscalar,l_not(isintent_c)):'#ctype# *', + isarray:'#ctype# *', + isstring:'#ctype#' + }, + 'strarglens':{isstring:',int #varname#_cb_len'}, # untested with multiple args + 'strarglens_td':{isstring:',int'}, # untested with multiple args + 'strarglens_nm':{isstring:',#varname#_cb_len'}, # untested with multiple args + }, + { # Scalars + 'decl':{l_not(isintent_c):'\t#ctype# #varname#=(*#varname#_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#_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#);'}, + {l_and(debugcapi,l_and(l_not(iscomplex),l_not(isintent_c))):'\tfprintf(stderr,"#showvalueformat#.\\n",*#varname#_cb_capi);'}, + {l_and(debugcapi,l_and(iscomplex,isintent_c)):'\tfprintf(stderr,"#showvalueformat#.\\n",(#varname#).r,(#varname#).i);'}, + {l_and(debugcapi,l_and(iscomplex,l_not(isintent_c))):'\tfprintf(stderr,"#showvalueformat#.\\n",(*#varname#_cb_capi).r,(*#varname#_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#))) +\t\t\tgoto capi_fail;"""}, + {isintent_inout:"""\ +\tif (#name#_nofargs>capi_i) +\t\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyarr_from_p_#ctype#1(#varname#_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) +\t\tGETSTRFROMPYTUPLE(capi_return,capi_i++,#varname#,#varname#_cb_len);""", + {debugcapi:'\tfprintf(stderr,"#showvalueformat#\\":%d:.\\n",#varname#,#varname#_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#,#varname#_cb_len);'}, + {isintent_in:"""\ +\tif (#name#_nofargs>capi_i) +\t\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyobj_from_#ctype#1(#varname#))) +\t\t\tgoto capi_fail;"""}, + {isintent_inout:"""\ +\tif (#name#_nofargs>capi_i) { +\t\tint #varname#_cb_dims[] = {#varname#_cb_len}; +\t\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyarr_from_p_#ctype#1(#varname#,#varname#_cb_dims))) +\t\t\tgoto capi_fail; +\t}"""}], + 'need':[{isintent_in:'pyobj_from_#ctype#1'}, + {isintent_inout:'pyarr_from_p_#ctype#1'}], + '_check':l_and(isstring,isintent_nothide), + '_optional':'' + }, +# Array ... + { + 'decl':'\tnpy_intp #varname#_Dims[#rank#] = {#rank*[-1]#};', + 'setdims':'\t#cbsetdims#;', + '_check':isarray, + '_depend':'' + }, + { + '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#_Dims,#atype#,NULL,(char*)#varname#,0,NPY_CARRAY,NULL); /*XXX: Hmm, what will destroy this array??? */ +""", + l_not(isintent_c):"""\ +\tif (#name#_nofargs>capi_i) { +\t\tPyArrayObject *tmp_arr = (PyArrayObject *)PyArray_New(&PyArray_Type,#rank#,#varname#_Dims,#atype#,NULL,(char*)#varname#,0,NPY_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':'', + },{ + '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#_Dims,#rank#,F2PY_INTENT_IN""", + {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; +\t\t} +\t\tMEMCOPY(#varname#,rv_cb_arr->data,PyArray_NBYTES(rv_cb_arr)); +\t\tif (capi_tmp != (PyObject *)rv_cb_arr) { +\t\t\tPy_DECREF(rv_cb_arr); +\t\t} +\t}""", + {debugcapi:'\tfprintf(stderr,"<-.\\n");'}, + ], + 'need':['MEMCOPY',{iscomplexarray:'#ctype#'}], + '_check':l_and(isarray,isintent_out) + },{ + 'docreturn':'#varname#,', + '_check':isintent_out + } + ] + +################## Build call-back module ############# +cb_map={} +def buildcallbacks(m): + global cb_map + cb_map[m['name']]=[] + for bi in m['body']: + 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 + 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 (r.has_key('_check') and r['_check'](rout)) or (not r.has_key('_check')): + ar=applyrules(r,vrd,rout) + rd=dictappend(rd,ar) + savevrd={} + for a in args: + vrd=capi_maps.cb_sign2map(a,var[a]) + savevrd[a]=vrd + for r in cb_arg_rules: + if r.has_key('_depend'): continue + if r.has_key('_optional') and isoptional(var[a]): continue + if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')): + ar=applyrules(r,vrd,var[a]) + rd=dictappend(rd,ar) + if r.has_key('_break'): break + for a in args: + vrd=savevrd[a] + for r in cb_arg_rules: + if r.has_key('_depend'): continue + if (not r.has_key('_optional')) or (r.has_key('_optional') and isrequired(var[a])): continue + if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')): + ar=applyrules(r,vrd,var[a]) + rd=dictappend(rd,ar) + if r.has_key('_break'): break + for a in depargs: + vrd=savevrd[a] + for r in cb_arg_rules: + if not r.has_key('_depend'): continue + if r.has_key('_optional'): continue + if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')): + ar=applyrules(r,vrd,var[a]) + rd=dictappend(rd,ar) + if r.has_key('_break'): break + if rd.has_key('args') and rd.has_key('optargs'): + if type(rd['optargs'])==type([]): + rd['optargs']=rd['optargs']+[""" +#ifndef F2PY_CB_RETURNCOMPLEX +, +#endif +"""] + rd['optargs_nm']=rd['optargs_nm']+[""" +#ifndef F2PY_CB_RETURNCOMPLEX +, +#endif +"""] + rd['optargs_td']=rd['optargs_td']+[""" +#ifndef F2PY_CB_RETURNCOMPLEX +, +#endif +"""] + if type(rd['docreturn'])==types.ListType: + 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']=string.replace(rd['docsignature'],'_','\\_') + rd['latexdocsignature']=string.replace(rd['latexdocsignature'],',',', ') + rd['docstrsigns']=[] + rd['latexdocstrsigns']=[] + for k in ['docstrreq','docstropt','docstrout','docstrcbs']: + if rd.has_key(k) and type(rd[k])==types.ListType: + rd['docstrsigns']=rd['docstrsigns']+rd[k] + k='latex'+k + if rd.has_key(k) and type(rd[k])==types.ListType: + rd['latexdocstrsigns']=rd['latexdocstrsigns']+rd[k][0:1]+\ + ['\\begin{description}']+rd[k][1:]+\ + ['\\end{description}'] + if not rd.has_key('args'): + 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'] + if type(ar['need'])==types.StringType: + ar['need']=[ar['need']] + + if rd.has_key('need'): + 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'] + + 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 ############# |