def getcallprotoargument(rout): r = getmultilineblock(rout,'callprotoargument',comment=0) if r: return r if hascallstatement(rout): outmess('warning: callstatement is defined without callprotoargument\n') return from capi_maps import getctype arg_types,arg_types2 = [],[] if l_and(isstringfunction,l_not(isfunction_wrap))(rout): arg_types.extend(['char*','size_t']) for n in rout['args']: var = rout['vars'][n] if isintent_callback(var): continue ctype = getctype(var) if l_and(isintent_c,l_or(isscalar,iscomplex))(var): pass elif isstring(var): pass #ctype = 'void*' else: ctype = ctype+'*' arg_types.append(ctype) if isstring(var) or isarrayofstrings(var): arg_types2.append('size_t') proto_args = string.join(arg_types+arg_types2,',') if not proto_args: proto_args = 'void' #print proto_args return proto_args
def getcallprotoargument(rout, cb_map={}): r = getmultilineblock(rout, "callprotoargument", comment=0) if r: return r if hascallstatement(rout): outmess("warning: callstatement is defined without callprotoargument\n") return from capi_maps import getctype arg_types, arg_types2 = [], [] if l_and(isstringfunction, l_not(isfunction_wrap))(rout): arg_types.extend(["char*", "size_t"]) for n in rout["args"]: var = rout["vars"][n] if isintent_callback(var): continue if n in cb_map: ctype = cb_map[n] + "_typedef" else: ctype = getctype(var) if l_and(isintent_c, l_or(isscalar, iscomplex))(var): pass elif isstring(var): pass # ctype = 'void*' else: ctype = ctype + "*" if isstring(var) or isarrayofstrings(var): arg_types2.append("size_t") arg_types.append(ctype) proto_args = ",".join(arg_types + arg_types2) if not proto_args: proto_args = "void" # print proto_args return proto_args
def buildhooks(pymod): global fgetdims1,fgetdims2 import rules ret = {'f90modhooks':[],'initf90modhooks':[],'body':[], 'need':['F_FUNC','arrayobject.h'], 'separatorsfor':{'includes0':'\n','includes':'\n'}, 'docs':['"Fortran 90/95 modules:\\n"'], 'latexdoc':[]} fhooks=[''] def fadd(line,s=fhooks): s[0] = '%s\n %s'%(s[0],line) doc = [''] def dadd(line,s=doc): s[0] = '%s\n%s'%(s[0],line) for m in findf90modules(pymod): sargs,fargs,efargs,modobjs,notvars,onlyvars=[],[],[],[],[m['name']],[] sargsp = [] ifargs = [] mfargs = [] if hasbody(m): for b in m['body']: notvars.append(b['name']) for n in m['vars'].keys(): var = m['vars'][n] if (n not in notvars) and (not l_or(isintent_hide,isprivate)(var)): onlyvars.append(n) mfargs.append(n) outmess('\t\tConstructing F90 module support for "%s"...\n'%(m['name'])) if onlyvars: outmess('\t\t Variables: %s\n'%(' '.join(onlyvars))) chooks=[''] def cadd(line,s=chooks): s[0] = '%s\n%s'%(s[0],line) ihooks=[''] def iadd(line,s=ihooks): s[0] = '%s\n%s'%(s[0],line) vrd=capi_maps.modsign2map(m) cadd('static FortranDataDef f2py_%s_def[] = {'%(m['name'])) dadd('\\subsection{Fortran 90/95 module \\texttt{%s}}\n'%(m['name'])) if hasnote(m): note = m['note'] if type(note) is type([]): note='\n'.join(note) dadd(note) if onlyvars: dadd('\\begin{description}') for n in onlyvars: var = m['vars'][n] modobjs.append(n) ct = capi_maps.getctype(var) at = capi_maps.c2capi_map[ct] dm = capi_maps.getarrdims(n,var) dms = dm['dims'].replace('*','-1').strip() dms = dms.replace(':','-1').strip() if not dms: dms='-1' use_fgetdims2 = fgetdims2 if isstringarray(var): if 'charselector' in var and 'len' in var['charselector']: cadd('\t{"%s",%s,{{%s,%s}},%s},'\ %(undo_rmbadname1(n),dm['rank'],dms,var['charselector']['len'],at)) use_fgetdims2 = fgetdims2_sa else: cadd('\t{"%s",%s,{{%s}},%s},'%(undo_rmbadname1(n),dm['rank'],dms,at)) else: cadd('\t{"%s",%s,{{%s}},%s},'%(undo_rmbadname1(n),dm['rank'],dms,at)) dadd('\\item[]{{}\\verb@%s@{}}'%(capi_maps.getarrdocsign(n,var))) if hasnote(var): note = var['note'] if type(note) is type([]): note='\n'.join(note) dadd('--- %s'%(note)) if isallocatable(var): fargs.append('f2py_%s_getdims_%s'%(m['name'],n)) efargs.append(fargs[-1]) sargs.append('void (*%s)(int*,int*,void(*)(char*,int*),int*)'%(n)) sargsp.append('void (*)(int*,int*,void(*)(char*,int*),int*)') iadd('\tf2py_%s_def[i_f2py++].func = %s;'%(m['name'],n)) fadd('subroutine %s(r,s,f2pysetdata,flag)'%(fargs[-1])) fadd('use %s, only: d => %s\n'%(m['name'],undo_rmbadname1(n))) fadd('integer flag\n') fhooks[0]=fhooks[0]+fgetdims1 dms = eval('range(1,%s+1)'%(dm['rank'])) fadd(' allocate(d(%s))\n'%(','.join(map(lambda i:'s(%s)'%i,dms)))) fhooks[0]=fhooks[0]+use_fgetdims2 fadd('end subroutine %s'%(fargs[-1])) else: fargs.append(n) sargs.append('char *%s'%(n)) sargsp.append('char*') iadd('\tf2py_%s_def[i_f2py++].data = %s;'%(m['name'],n)) if onlyvars: dadd('\\end{description}') if hasbody(m): for b in m['body']: if not isroutine(b): print 'Skipping',b['block'],b['name'] continue modobjs.append('%s()'%(b['name'])) b['modulename'] = m['name'] api,wrap=rules.buildapi(b) if isfunction(b): fhooks[0]=fhooks[0]+wrap fargs.append('f2pywrap_%s_%s'%(m['name'],b['name'])) #efargs.append(fargs[-1]) ifargs.append(func2subr.createfuncwrapper(b,signature=1)) else: fargs.append(b['name']) mfargs.append(fargs[-1]) #if '--external-modroutines' in options and options['--external-modroutines']: # outmess('\t\t\tapplying --external-modroutines for %s\n'%(b['name'])) # efargs.append(fargs[-1]) api['externroutines']=[] ar=applyrules(api,vrd) ar['docs']=[] ar['docshort']=[] ret=dictappend(ret,ar) cadd('\t{"%s",-1,{{-1}},0,NULL,(void *)f2py_rout_#modulename#_%s_%s,doc_f2py_rout_#modulename#_%s_%s},'%(b['name'],m['name'],b['name'],m['name'],b['name'])) sargs.append('char *%s'%(b['name'])) sargsp.append('char *') iadd('\tf2py_%s_def[i_f2py++].data = %s;'%(m['name'],b['name'])) cadd('\t{NULL}\n};\n') iadd('}') ihooks[0]='static void f2py_setup_%s(%s) {\n\tint i_f2py=0;%s'%(m['name'],','.join(sargs),ihooks[0]) if '_' in m['name']: F_FUNC='F_FUNC_US' else: F_FUNC='F_FUNC' iadd('extern void %s(f2pyinit%s,F2PYINIT%s)(void (*)(%s));'\ %(F_FUNC,m['name'],m['name'].upper(),','.join(sargsp))) iadd('static void f2py_init_%s(void) {'%(m['name'])) iadd('\t%s(f2pyinit%s,F2PYINIT%s)(f2py_setup_%s);'\ %(F_FUNC,m['name'],m['name'].upper(),m['name'])) iadd('}\n') ret['f90modhooks']=ret['f90modhooks']+chooks+ihooks ret['initf90modhooks']=['\tPyDict_SetItemString(d, "%s", PyFortranObject_New(f2py_%s_def,f2py_init_%s));'%(m['name'],m['name'],m['name'])]+ret['initf90modhooks'] fadd('') fadd('subroutine f2pyinit%s(f2pysetupfunc)'%(m['name'])) #fadd('use %s'%(m['name'])) if mfargs: for a in undo_rmbadname(mfargs): fadd('use %s, only : %s'%(m['name'],a)) if ifargs: fadd(' '.join(['interface']+ifargs)) fadd('end interface') fadd('external f2pysetupfunc') if efargs: for a in undo_rmbadname(efargs): fadd('external %s'%(a)) fadd('call f2pysetupfunc(%s)'%(','.join(undo_rmbadname(fargs)))) fadd('end subroutine f2pyinit%s\n'%(m['name'])) dadd('\n'.join(ret['latexdoc']).replace(r'\subsection{',r'\subsubsection{')) ret['latexdoc']=[] ret['docs'].append('"\t%s --- %s"'%(m['name'], ','.join(undo_rmbadname(modobjs)))) ret['routine_defs']='' ret['doc']=[] ret['docshort']=[] ret['latexdoc']=doc[0] if len(ret['docs'])<=1: ret['docs']='' return ret,fhooks[0]
def buildhooks(m): ret = {'commonhooks':[],'initcommonhooks':[],'docs':['"COMMON blocks:\\n"']} fwrap = [''] def fadd(line,s=fwrap): s[0] = '%s\n %s'%(s[0],line) chooks = [''] def cadd(line,s=chooks): s[0] = '%s\n%s'%(s[0],line) ihooks = [''] def iadd(line,s=ihooks): s[0] = '%s\n%s'%(s[0],line) doc = [''] def dadd(line,s=doc): s[0] = '%s\n%s'%(s[0],line) for (name,vnames,vars) in findcommonblocks(m): lower_name = name.lower() hnames,inames = [],[] for n in vnames: if isintent_hide(vars[n]): hnames.append(n) else: inames.append(n) if hnames: outmess('\t\tConstructing COMMON block support for "%s"...\n\t\t %s\n\t\t Hidden: %s\n'%(name,','.join(inames),','.join(hnames))) else: outmess('\t\tConstructing COMMON block support for "%s"...\n\t\t %s\n'%(name,','.join(inames))) fadd('subroutine f2pyinit%s(setupfunc)'%name) fadd('external setupfunc') for n in vnames: fadd(func2subr.var2fixfortran(vars,n)) if name=='_BLNK_': fadd('common %s'%(','.join(vnames))) else: fadd('common /%s/ %s'%(name,','.join(vnames))) fadd('call setupfunc(%s)'%(','.join(inames))) fadd('end\n') cadd('static FortranDataDef f2py_%s_def[] = {'%(name)) idims=[] for n in inames: ct = capi_maps.getctype(vars[n]) at = capi_maps.c2capi_map[ct] dm = capi_maps.getarrdims(n,vars[n]) if dm['dims']: idims.append('(%s)'%(dm['dims'])) else: idims.append('') dms=dm['dims'].strip() if not dms: dms='-1' cadd('\t{\"%s\",%s,{{%s}},%s},'%(n,dm['rank'],dms,at)) cadd('\t{NULL}\n};') inames1 = rmbadname(inames) inames1_tps = ','.join(map(lambda s:'char *'+s,inames1)) cadd('static void f2py_setup_%s(%s) {'%(name,inames1_tps)) cadd('\tint i_f2py=0;') for n in inames1: cadd('\tf2py_%s_def[i_f2py++].data = %s;'%(name,n)) cadd('}') if '_' in lower_name: F_FUNC='F_FUNC_US' else: F_FUNC='F_FUNC' cadd('extern void %s(f2pyinit%s,F2PYINIT%s)(void(*)(%s));'\ %(F_FUNC,lower_name,name.upper(), ','.join(['char*']*len(inames1)))) cadd('static void f2py_init_%s(void) {'%name) cadd('\t%s(f2pyinit%s,F2PYINIT%s)(f2py_setup_%s);'\ %(F_FUNC,lower_name,name.upper(),name)) cadd('}\n') iadd('\tF2PyDict_SetItemString(d, \"%s\", PyFortranObject_New(f2py_%s_def,f2py_init_%s));'%(name,name,name)) tname = name.replace('_','\\_') dadd('\\subsection{Common block \\texttt{%s}}\n'%(tname)) dadd('\\begin{description}') for n in inames: dadd('\\item[]{{}\\verb@%s@{}}'%(capi_maps.getarrdocsign(n,vars[n]))) if hasnote(vars[n]): note = vars[n]['note'] if type(note) is type([]): note='\n'.join(note) dadd('--- %s'%(note)) dadd('\\end{description}') ret['docs'].append('"\t/%s/ %s\\n"'%(name,','.join(map(lambda v,d:v+d,inames,idims)))) ret['commonhooks']=chooks ret['initcommonhooks']=ihooks ret['latexdoc']=doc[0] if len(ret['docs'])<=1: ret['docs']='' return ret,fwrap[0]
def buildhooks(m): ret = {"commonhooks": [], "initcommonhooks": [], "docs": ['"COMMON blocks:\\n"']} fwrap = [""] def fadd(line, s=fwrap): s[0] = "%s\n %s" % (s[0], line) chooks = [""] def cadd(line, s=chooks): s[0] = "%s\n%s" % (s[0], line) ihooks = [""] def iadd(line, s=ihooks): s[0] = "%s\n%s" % (s[0], line) doc = [""] def dadd(line, s=doc): s[0] = "%s\n%s" % (s[0], line) for (name, vnames, vars) in findcommonblocks(m): lower_name = name.lower() hnames, inames = [], [] for n in vnames: if isintent_hide(vars[n]): hnames.append(n) else: inames.append(n) if hnames: outmess( '\t\tConstructing COMMON block support for "%s"...\n\t\t %s\n\t\t Hidden: %s\n' % (name, ",".join(inames), ",".join(hnames)) ) else: outmess('\t\tConstructing COMMON block support for "%s"...\n\t\t %s\n' % (name, ",".join(inames))) fadd("subroutine f2pyinit%s(setupfunc)" % name) fadd("external setupfunc") for n in vnames: fadd(func2subr.var2fixfortran(vars, n)) if name == "_BLNK_": fadd("common %s" % (",".join(vnames))) else: fadd("common /%s/ %s" % (name, ",".join(vnames))) fadd("call setupfunc(%s)" % (",".join(inames))) fadd("end\n") cadd("static FortranDataDef f2py_%s_def[] = {" % (name)) idims = [] for n in inames: ct = capi_maps.getctype(vars[n]) at = capi_maps.c2capi_map[ct] dm = capi_maps.getarrdims(n, vars[n]) if dm["dims"]: idims.append("(%s)" % (dm["dims"])) else: idims.append("") dms = dm["dims"].strip() if not dms: dms = "-1" cadd('\t{"%s",%s,{{%s}},%s},' % (n, dm["rank"], dms, at)) cadd("\t{NULL}\n};") inames1 = rmbadname(inames) inames1_tps = ",".join(map(lambda s: "char *" + s, inames1)) cadd("static void f2py_setup_%s(%s) {" % (name, inames1_tps)) cadd("\tint i_f2py=0;") for n in inames1: cadd("\tf2py_%s_def[i_f2py++].data = %s;" % (name, n)) cadd("}") if "_" in lower_name: F_FUNC = "F_FUNC_US" else: F_FUNC = "F_FUNC" cadd( "extern void %s(f2pyinit%s,F2PYINIT%s)(void(*)(%s));" % (F_FUNC, lower_name, name.upper(), ",".join(["char*"] * len(inames1))) ) cadd("static void f2py_init_%s(void) {" % name) cadd("\t%s(f2pyinit%s,F2PYINIT%s)(f2py_setup_%s);" % (F_FUNC, lower_name, name.upper(), name)) cadd("}\n") iadd('\tF2PyDict_SetItemString(d, "%s", PyFortranObject_New(f2py_%s_def,f2py_init_%s));' % (name, name, name)) tname = name.replace("_", "\\_") dadd("\\subsection{Common block \\texttt{%s}}\n" % (tname)) dadd("\\begin{description}") for n in inames: dadd("\\item[]{{}\\verb@%s@{}}" % (capi_maps.getarrdocsign(n, vars[n]))) if hasnote(vars[n]): note = vars[n]["note"] if type(note) is type([]): note = "\n".join(note) dadd("--- %s" % (note)) dadd("\\end{description}") ret["docs"].append('"\t/%s/ %s\\n"' % (name, ",".join(map(lambda v, d: v + d, inames, idims)))) ret["commonhooks"] = chooks ret["initcommonhooks"] = ihooks ret["latexdoc"] = doc[0] if len(ret["docs"]) <= 1: ret["docs"] = "" return ret, fwrap[0]