Chris@87: #!/usr/bin/env python Chris@87: """ Chris@87: Chris@87: Build common block mechanism for f2py2e. Chris@87: Chris@87: Copyright 2000 Pearu Peterson all rights reserved, Chris@87: Pearu Peterson Chris@87: Permission to use, modify, and distribute this software is given under the Chris@87: terms of the NumPy License Chris@87: Chris@87: NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. Chris@87: $Date: 2005/05/06 10:57:33 $ Chris@87: Pearu Peterson Chris@87: Chris@87: """ Chris@87: from __future__ import division, absolute_import, print_function Chris@87: Chris@87: __version__ = "$Revision: 1.19 $"[10:-1] Chris@87: Chris@87: from . import __version__ Chris@87: f2py_version = __version__.version Chris@87: Chris@87: import pprint Chris@87: import sys Chris@87: errmess=sys.stderr.write Chris@87: outmess=sys.stdout.write Chris@87: show=pprint.pprint Chris@87: Chris@87: from .auxfuncs import * Chris@87: from . import capi_maps Chris@87: from . import func2subr Chris@87: from .crackfortran import rmbadname Chris@87: ############## Chris@87: Chris@87: def findcommonblocks(block,top=1): Chris@87: ret = [] Chris@87: if hascommon(block): Chris@87: for n in block['common'].keys(): Chris@87: vars={} Chris@87: for v in block['common'][n]: Chris@87: vars[v]=block['vars'][v] Chris@87: ret.append((n, block['common'][n], vars)) Chris@87: elif hasbody(block): Chris@87: for b in block['body']: Chris@87: ret=ret+findcommonblocks(b, 0) Chris@87: if top: Chris@87: tret=[] Chris@87: names=[] Chris@87: for t in ret: Chris@87: if t[0] not in names: Chris@87: names.append(t[0]) Chris@87: tret.append(t) Chris@87: return tret Chris@87: return ret Chris@87: Chris@87: def buildhooks(m): Chris@87: ret = {'commonhooks':[],'initcommonhooks':[],'docs':['"COMMON blocks:\\n"']} Chris@87: fwrap = [''] Chris@87: def fadd(line,s=fwrap): s[0] = '%s\n %s'%(s[0], line) Chris@87: chooks = [''] Chris@87: def cadd(line,s=chooks): s[0] = '%s\n%s'%(s[0], line) Chris@87: ihooks = [''] Chris@87: def iadd(line,s=ihooks): s[0] = '%s\n%s'%(s[0], line) Chris@87: doc = [''] Chris@87: def dadd(line,s=doc): s[0] = '%s\n%s'%(s[0], line) Chris@87: for (name, vnames, vars) in findcommonblocks(m): Chris@87: lower_name = name.lower() Chris@87: hnames, inames = [], [] Chris@87: for n in vnames: Chris@87: if isintent_hide(vars[n]): hnames.append(n) Chris@87: else: inames.append(n) Chris@87: if hnames: Chris@87: outmess('\t\tConstructing COMMON block support for "%s"...\n\t\t %s\n\t\t Hidden: %s\n'%(name, ','.join(inames), ','.join(hnames))) Chris@87: else: Chris@87: outmess('\t\tConstructing COMMON block support for "%s"...\n\t\t %s\n'%(name, ','.join(inames))) Chris@87: fadd('subroutine f2pyinit%s(setupfunc)'%name) Chris@87: fadd('external setupfunc') Chris@87: for n in vnames: Chris@87: fadd(func2subr.var2fixfortran(vars, n)) Chris@87: if name=='_BLNK_': Chris@87: fadd('common %s'%(','.join(vnames))) Chris@87: else: Chris@87: fadd('common /%s/ %s'%(name, ','.join(vnames))) Chris@87: fadd('call setupfunc(%s)'%(','.join(inames))) Chris@87: fadd('end\n') Chris@87: cadd('static FortranDataDef f2py_%s_def[] = {'%(name)) Chris@87: idims=[] Chris@87: for n in inames: Chris@87: ct = capi_maps.getctype(vars[n]) Chris@87: at = capi_maps.c2capi_map[ct] Chris@87: dm = capi_maps.getarrdims(n, vars[n]) Chris@87: if dm['dims']: idims.append('(%s)'%(dm['dims'])) Chris@87: else: idims.append('') Chris@87: dms=dm['dims'].strip() Chris@87: if not dms: dms='-1' Chris@87: cadd('\t{\"%s\",%s,{{%s}},%s},'%(n, dm['rank'], dms, at)) Chris@87: cadd('\t{NULL}\n};') Chris@87: inames1 = rmbadname(inames) Chris@87: inames1_tps = ','.join(['char *'+s for s in inames1]) Chris@87: cadd('static void f2py_setup_%s(%s) {'%(name, inames1_tps)) Chris@87: cadd('\tint i_f2py=0;') Chris@87: for n in inames1: Chris@87: cadd('\tf2py_%s_def[i_f2py++].data = %s;'%(name, n)) Chris@87: cadd('}') Chris@87: if '_' in lower_name: Chris@87: F_FUNC='F_FUNC_US' Chris@87: else: Chris@87: F_FUNC='F_FUNC' Chris@87: cadd('extern void %s(f2pyinit%s,F2PYINIT%s)(void(*)(%s));'\ Chris@87: %(F_FUNC, lower_name, name.upper(), Chris@87: ','.join(['char*']*len(inames1)))) Chris@87: cadd('static void f2py_init_%s(void) {'%name) Chris@87: cadd('\t%s(f2pyinit%s,F2PYINIT%s)(f2py_setup_%s);'\ Chris@87: %(F_FUNC, lower_name, name.upper(), name)) Chris@87: cadd('}\n') Chris@87: iadd('\tF2PyDict_SetItemString(d, \"%s\", PyFortranObject_New(f2py_%s_def,f2py_init_%s));'%(name, name, name)) Chris@87: tname = name.replace('_', '\\_') Chris@87: dadd('\\subsection{Common block \\texttt{%s}}\n'%(tname)) Chris@87: dadd('\\begin{description}') Chris@87: for n in inames: Chris@87: dadd('\\item[]{{}\\verb@%s@{}}'%(capi_maps.getarrdocsign(n, vars[n]))) Chris@87: if hasnote(vars[n]): Chris@87: note = vars[n]['note'] Chris@87: if isinstance(note, list): note='\n'.join(note) Chris@87: dadd('--- %s'%(note)) Chris@87: dadd('\\end{description}') Chris@87: ret['docs'].append('"\t/%s/ %s\\n"'%(name, ','.join(map(lambda v, d:v+d, inames, idims)))) Chris@87: ret['commonhooks']=chooks Chris@87: ret['initcommonhooks']=ihooks Chris@87: ret['latexdoc']=doc[0] Chris@87: if len(ret['docs'])<=1: ret['docs']='' Chris@87: return ret, fwrap[0]