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/func2subr.py | |
parent | ddaed649c23bbd0ad36cdafdfe9cd92397ce69e3 (diff) | |
download | numpy-8e2654541c6eae0f308908f501cccbc86b2f9101.tar.gz |
Moved scipy directory to numpy
Diffstat (limited to 'numpy/f2py/func2subr.py')
-rw-r--r-- | numpy/f2py/func2subr.py | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/numpy/f2py/func2subr.py b/numpy/f2py/func2subr.py new file mode 100644 index 000000000..4039c9996 --- /dev/null +++ b/numpy/f2py/func2subr.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python +""" + +Rules for building C/API module with f2py2e. + +Copyright 1999,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: 2004/11/26 11:13:06 $ +Pearu Peterson +""" + +__version__ = "$Revision: 1.16 $"[10:-1] + +f2py_version='See `f2py -v`' + +import pprint,copy +import sys,string,time,types,copy +errmess=sys.stderr.write +outmess=sys.stdout.write +show=pprint.pprint + +from auxfuncs import * +def var2fixfortran(vars,a,fa=None,f90mode=None): + if fa is None: + fa = a + if not vars.has_key(a): + show(vars) + outmess('var2fixfortran: No definition for argument "%s".\n'%a) + return '' + if not vars[a].has_key('typespec'): + show(vars[a]) + outmess('var2fixfortran: No typespec for argument "%s".\n'%a) + return '' + vardef=vars[a]['typespec'] + if vardef=='type' and vars[a].has_key('typename'): + vardef='%s(%s)'%(vardef,vars[a]['typename']) + selector={} + lk = '' + if vars[a].has_key('kindselector'): + selector=vars[a]['kindselector'] + lk = 'kind' + elif vars[a].has_key('charselector'): + selector=vars[a]['charselector'] + lk = 'len' + if selector.has_key('*'): + if f90mode: + if selector['*'] in ['*',':','(*)']: + vardef='%s(len=*)'%(vardef) + else: + vardef='%s(%s=%s)'%(vardef,lk,selector['*']) + else: + if selector['*'] in ['*',':']: + vardef='%s*(%s)'%(vardef,selector['*']) + else: + vardef='%s*%s'%(vardef,selector['*']) + else: + if selector.has_key('len'): + vardef='%s(len=%s'%(vardef,selector['len']) + if selector.has_key('kind'): + vardef='%s,kind=%s)'%(vardef,selector['kind']) + else: + vardef='%s)'%(vardef) + elif selector.has_key('kind'): + vardef='%s(kind=%s)'%(vardef,selector['kind']) + + vardef='%s %s'%(vardef,fa) + if vars[a].has_key('dimension'): + vardef='%s(%s)'%(vardef,string.join(vars[a]['dimension'],',')) + return vardef + +def createfuncwrapper(rout,signature=0): + assert isfunction(rout) + ret = [''] + def add(line,ret=ret): + ret[0] = '%s\n %s'%(ret[0],line) + name = rout['name'] + fortranname = getfortranname(rout) + f90mode = ismoduleroutine(rout) + newname = '%sf2pywrap'%(name) + vars = rout['vars'] + if not vars.has_key(newname): + vars[newname] = vars[name] + args = [newname]+rout['args'][1:] + else: + args = [newname]+rout['args'] + + l = var2fixfortran(vars,name,newname,f90mode) + return_char_star = 0 + if l[:13]=='character*(*)': + return_char_star = 1 + if f90mode: l = 'character(len=10)'+l[13:] + else: l = 'character*10'+l[13:] + charselect = vars[name]['charselector'] + if charselect.get('*','')=='(*)': + charselect['*'] = '10' + if f90mode: + sargs = string.join(args,', ') + add('subroutine f2pywrap_%s_%s (%s)'%(rout['modulename'],name,sargs)) + if not signature: + add('use %s, only : %s'%(rout['modulename'],fortranname)) + else: + add('subroutine f2pywrap%s (%s)'%(name,string.join(args,', '))) + add('external %s'%(fortranname)) + #if not return_char_star: + l = l + ', '+fortranname + args = args[1:] + dumped_args = [] + for a in args: + if isexternal(vars[a]): + add('external %s'%(a)) + dumped_args.append(a) + for a in args: + if a in dumped_args: continue + if isscalar(vars[a]): + add(var2fixfortran(vars,a,f90mode=f90mode)) + dumped_args.append(a) + for a in args: + if a in dumped_args: continue + add(var2fixfortran(vars,a,f90mode=f90mode)) + + add(l) + + if not signature: + if islogicalfunction(rout): + add('%s = .not.(.not.%s(%s))'%(newname,fortranname,string.join(args,', '))) + else: + add('%s = %s(%s)'%(newname,fortranname,string.join(args,', '))) + if f90mode: + add('end subroutine f2pywrap_%s_%s'%(rout['modulename'],name)) + else: + add('end') + #print '**'*10 + #print ret[0] + #print '**'*10 + return ret[0] + +def assubr(rout): + if not isfunction_wrap(rout): return rout,'' + fortranname = getfortranname(rout) + name = rout['name'] + outmess('\t\tCreating wrapper for Fortran function "%s"("%s")...\n'%(name,fortranname)) + rout = copy.copy(rout) + fname = name + rname = fname + if rout.has_key('result'): + rname = rout['result'] + rout['vars'][fname]=rout['vars'][rname] + fvar = rout['vars'][fname] + if not isintent_out(fvar): + if not fvar.has_key('intent'): fvar['intent']=[] + fvar['intent'].append('out') + flag=1 + for i in fvar['intent']: + if i.startswith('out='): + flag = 0 + break + if flag: + fvar['intent'].append('out=%s' % (rname)) + + rout['args'] = [fname] + rout['args'] + return rout,createfuncwrapper(rout) |