#!/usr/bin/env python """ Rules for building C/API module with f2py2e. Copyright 1999,2000 Pearu Peterson all rights reserved, Pearu Peterson Permission to use, modify, and distribute this software is given under the terms of the NumPy License. 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 import copy import sys 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 a not in vars: show(vars) outmess('var2fixfortran: No definition for argument "%s".\n'%a) return '' if 'typespec' not in vars[a]: show(vars[a]) outmess('var2fixfortran: No typespec for argument "%s".\n'%a) return '' vardef=vars[a]['typespec'] if vardef=='type' and 'typename' in vars[a]: vardef='%s(%s)'%(vardef,vars[a]['typename']) selector={} lk = '' if 'kindselector' in vars[a]: selector=vars[a]['kindselector'] lk = 'kind' elif 'charselector' in vars[a]: selector=vars[a]['charselector'] lk = 'len' if '*' in selector: 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 'len' in selector: vardef='%s(len=%s'%(vardef,selector['len']) if 'kind' in selector: vardef='%s,kind=%s)'%(vardef,selector['kind']) else: vardef='%s)'%(vardef) elif 'kind' in selector: vardef='%s(kind=%s)'%(vardef,selector['kind']) vardef='%s %s'%(vardef,fa) if 'dimension' in vars[a]: vardef='%s(%s)'%(vardef,','.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 newname not in vars: 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 = ', '.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,', '.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,', '.join(args))) else: add('%s = %s(%s)'%(newname,fortranname,', '.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 'result' in rout: rname = rout['result'] rout['vars'][fname]=rout['vars'][rname] fvar = rout['vars'][fname] if not isintent_out(fvar): if 'intent' not in fvar: 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)