Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/mingw32/Python27/Lib/site-packages/numpy/f2py/func2subr.py @ 87:2a2c65a20a8b
Add Python libs and headers
author | Chris Cannam |
---|---|
date | Wed, 25 Feb 2015 14:05:22 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/mingw32/Python27/Lib/site-packages/numpy/f2py/func2subr.py Wed Feb 25 14:05:22 2015 +0000 @@ -0,0 +1,291 @@ +#!/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 NumPy License. + +NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. +$Date: 2004/11/26 11:13:06 $ +Pearu Peterson + +""" +from __future__ import division, absolute_import, print_function + +__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) + + extra_args = [] + vars = rout['vars'] + for a in rout['args']: + v = rout['vars'][a] + for i, d in enumerate(v.get('dimension', [])): + if d==':': + dn = 'f2py_%s_d%s' % (a, i) + dv = dict(typespec='integer', intent=['hide']) + dv['='] = 'shape(%s, %s)' % (a, i) + extra_args.append(dn) + vars[dn] = dv + v['dimension'][i] = dn + rout['args'].extend(extra_args) + need_interface = bool(extra_args) + + 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) + + 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' + sargs = ', '.join(args) + if f90mode: + 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, sargs)) + if not need_interface: + add('external %s'%(fortranname)) + l = l + ', '+fortranname + if need_interface: + for line in rout['saved_interface'].split('\n'): + if line.lstrip().startswith('use '): + add(line) + + 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 + if isintent_in(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 need_interface: + if f90mode: + # f90 module already defines needed interface + pass + else: + add('interface') + add(rout['saved_interface'].lstrip()) + add('end interface') + + sargs = ', '.join([a for a in args if a not in extra_args]) + + if not signature: + if islogicalfunction(rout): + add('%s = .not.(.not.%s(%s))'%(newname, fortranname, sargs)) + else: + add('%s = %s(%s)'%(newname, fortranname, sargs)) + 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 createsubrwrapper(rout,signature=0): + assert issubroutine(rout) + + extra_args = [] + vars = rout['vars'] + for a in rout['args']: + v = rout['vars'][a] + for i, d in enumerate(v.get('dimension', [])): + if d==':': + dn = 'f2py_%s_d%s' % (a, i) + dv = dict(typespec='integer', intent=['hide']) + dv['='] = 'shape(%s, %s)' % (a, i) + extra_args.append(dn) + vars[dn] = dv + v['dimension'][i] = dn + rout['args'].extend(extra_args) + need_interface = bool(extra_args) + + ret = [''] + def add(line,ret=ret): + ret[0] = '%s\n %s'%(ret[0], line) + name = rout['name'] + fortranname = getfortranname(rout) + f90mode = ismoduleroutine(rout) + + args = rout['args'] + + sargs = ', '.join(args) + if f90mode: + 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, sargs)) + if not need_interface: + add('external %s'%(fortranname)) + + if need_interface: + for line in rout['saved_interface'].split('\n'): + if line.lstrip().startswith('use '): + add(line) + + 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)) + + if need_interface: + if f90mode: + # f90 module already defines needed interface + pass + else: + add('interface') + add(rout['saved_interface'].lstrip()) + add('end interface') + + sargs = ', '.join([a for a in args if a not in extra_args]) + + if not signature: + add('call %s(%s)'%(fortranname, sargs)) + 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 isfunction_wrap(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) + if issubroutine_wrap(rout): + fortranname = getfortranname(rout) + name = rout['name'] + outmess('\t\tCreating wrapper for Fortran subroutine "%s"("%s")...\n'%(name, fortranname)) + rout = copy.copy(rout) + return rout, createsubrwrapper(rout) + return rout, ''