diff options
author | Travis Oliphant <oliphant@enthought.com> | 2006-01-04 17:26:31 +0000 |
---|---|---|
committer | Travis Oliphant <oliphant@enthought.com> | 2006-01-04 17:26:31 +0000 |
commit | 8e2654541c6eae0f308908f501cccbc86b2f9101 (patch) | |
tree | bfcfe3b282c8fb659832bf86a841ce76852094ad /numpy/f2py/common_rules.py | |
parent | ddaed649c23bbd0ad36cdafdfe9cd92397ce69e3 (diff) | |
download | numpy-8e2654541c6eae0f308908f501cccbc86b2f9101.tar.gz |
Moved scipy directory to numpy
Diffstat (limited to 'numpy/f2py/common_rules.py')
-rw-r--r-- | numpy/f2py/common_rules.py | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/numpy/f2py/common_rules.py b/numpy/f2py/common_rules.py new file mode 100644 index 000000000..e7b4decca --- /dev/null +++ b/numpy/f2py/common_rules.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python +""" + +Build common block 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 LGPL. See http://www.fsf.org + +NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. +$Date: 2005/05/06 10:57:33 $ +Pearu Peterson +""" + +__version__ = "$Revision: 1.19 $"[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 +import cfuncs +import func2subr +from crackfortran import rmbadname +############## + +def findcommonblocks(block,top=1): + ret = [] + if hascommon(block): + for n in block['common'].keys(): + vars={} + for v in block['common'][n]: + vars[v]=block['vars'][v] + ret.append((n,block['common'][n],vars)) + elif hasbody(block): + for b in block['body']: + ret=ret+findcommonblocks(b,0) + if top: + tret=[] + names=[] + for t in ret: + if t[0] not in names: + names.append(t[0]) + tret.append(t) + return tret + return ret + +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 = string.lower(name) + 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,string.join(inames,','),string.join(hnames,','))) + else: + outmess('\t\tConstructing COMMON block support for "%s"...\n\t\t %s\n'%(name,string.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'%(string.join(vnames,','))) + else: + fadd('common /%s/ %s'%(name,string.join(vnames,','))) + fadd('call setupfunc(%s)'%(string.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=string.strip(dm['dims']) + 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 = string.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,string.upper(name), + string.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,string.upper(name),name)) + cadd('}\n') + iadd('\tPyDict_SetItemString(d, \"%s\", PyFortranObject_New(f2py_%s_def,f2py_init_%s));'%(name,name,name)) + tname = string.replace(name,'_','\\_') + 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=string.join(note,'\n') + dadd('--- %s'%(note)) + dadd('\\end{description}') + ret['docs'].append('"\t/%s/ %s\\n"'%(name,string.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] + |