summaryrefslogtreecommitdiff
path: root/numpy/f2py/func2subr.py
diff options
context:
space:
mode:
authorTravis Oliphant <oliphant@enthought.com>2006-01-04 17:26:31 +0000
committerTravis Oliphant <oliphant@enthought.com>2006-01-04 17:26:31 +0000
commit8e2654541c6eae0f308908f501cccbc86b2f9101 (patch)
treebfcfe3b282c8fb659832bf86a841ce76852094ad /numpy/f2py/func2subr.py
parentddaed649c23bbd0ad36cdafdfe9cd92397ce69e3 (diff)
downloadnumpy-8e2654541c6eae0f308908f501cccbc86b2f9101.tar.gz
Moved scipy directory to numpy
Diffstat (limited to 'numpy/f2py/func2subr.py')
-rw-r--r--numpy/f2py/func2subr.py165
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)