98
114
charselect = vars[name]['charselector']
99
115
if charselect.get('*','')=='(*)':
100
116
charselect['*'] = '10'
117
sargs = ', '.join(args)
102
sargs = ', '.join(args)
103
119
add('subroutine f2pywrap_%s_%s (%s)'%(rout['modulename'],name,sargs))
104
120
if not signature:
105
121
add('use %s, only : %s'%(rout['modulename'],fortranname))
107
add('subroutine f2pywrap%s (%s)'%(name,', '.join(args)))
108
add('external %s'%(fortranname))
109
#if not return_char_star:
110
l = l + ', '+fortranname
123
add('subroutine f2pywrap%s (%s)'%(name,sargs))
124
if not need_interface:
125
add('external %s'%(fortranname))
126
l = l + ', '+fortranname
128
for line in rout['saved_interface'].split('\n'):
129
if line.lstrip().startswith('use '):
121
142
dumped_args.append(a)
123
144
if a in dumped_args: continue
145
if isintent_in(vars[a]):
146
add(var2fixfortran(vars,a,f90mode=f90mode))
147
dumped_args.append(a)
149
if a in dumped_args: continue
124
150
add(var2fixfortran(vars,a,f90mode=f90mode))
156
# f90 module already defines needed interface
160
add(rout['saved_interface'].lstrip())
163
sargs = ', '.join([a for a in args if a not in extra_args])
128
165
if not signature:
129
166
if islogicalfunction(rout):
130
add('%s = .not.(.not.%s(%s))'%(newname,fortranname,', '.join(args)))
132
add('%s = %s(%s)'%(newname,fortranname,', '.join(args)))
134
add('end subroutine f2pywrap_%s_%s'%(rout['modulename'],name))
167
add('%s = .not.(.not.%s(%s))'%(newname,fortranname,sargs))
169
add('%s = %s(%s)'%(newname,fortranname,sargs))
171
add('end subroutine f2pywrap_%s_%s'%(rout['modulename'],name))
179
def createsubrwrapper(rout,signature=0):
180
assert issubroutine(rout)
184
for a in rout['args']:
186
for i,d in enumerate(v.get('dimension',[])):
188
dn = 'f2py_%s_d%s' % (a, i)
189
dv = dict(typespec='integer', intent=['hide'])
190
dv['='] = 'shape(%s, %s)' % (a, i)
191
extra_args.append(dn)
193
v['dimension'][i] = dn
194
rout['args'].extend(extra_args)
195
need_interface = bool(extra_args)
198
def add(line,ret=ret):
199
ret[0] = '%s\n %s'%(ret[0],line)
201
fortranname = getfortranname(rout)
202
f90mode = ismoduleroutine(rout)
206
sargs = ', '.join(args)
208
add('subroutine f2pywrap_%s_%s (%s)'%(rout['modulename'],name,sargs))
210
add('use %s, only : %s'%(rout['modulename'],fortranname))
212
add('subroutine f2pywrap%s (%s)'%(name,sargs))
213
if not need_interface:
214
add('external %s'%(fortranname))
217
for line in rout['saved_interface'].split('\n'):
218
if line.lstrip().startswith('use '):
223
if isexternal(vars[a]):
224
add('external %s'%(a))
225
dumped_args.append(a)
227
if a in dumped_args: continue
228
if isscalar(vars[a]):
229
add(var2fixfortran(vars,a,f90mode=f90mode))
230
dumped_args.append(a)
232
if a in dumped_args: continue
233
add(var2fixfortran(vars,a,f90mode=f90mode))
237
# f90 module already defines needed interface
241
add(rout['saved_interface'].lstrip())
244
sargs = ', '.join([a for a in args if a not in extra_args])
247
add('call %s(%s)'%(fortranname,sargs))
249
add('end subroutine f2pywrap_%s_%s'%(rout['modulename'],name))
142
258
def assubr(rout):
143
if not isfunction_wrap(rout): return rout,''
144
fortranname = getfortranname(rout)
146
outmess('\t\tCreating wrapper for Fortran function "%s"("%s")...\n'%(name,fortranname))
147
rout = copy.copy(rout)
151
rname = rout['result']
152
rout['vars'][fname]=rout['vars'][rname]
153
fvar = rout['vars'][fname]
154
if not isintent_out(fvar):
155
if 'intent' not in fvar:
157
fvar['intent'].append('out')
159
for i in fvar['intent']:
160
if i.startswith('out='):
164
fvar['intent'].append('out=%s' % (rname))
259
if isfunction_wrap(rout):
260
fortranname = getfortranname(rout)
262
outmess('\t\tCreating wrapper for Fortran function "%s"("%s")...\n'%(name,fortranname))
263
rout = copy.copy(rout)
267
rname = rout['result']
268
rout['vars'][fname]=rout['vars'][rname]
269
fvar = rout['vars'][fname]
270
if not isintent_out(fvar):
271
if 'intent' not in fvar:
273
fvar['intent'].append('out')
275
for i in fvar['intent']:
276
if i.startswith('out='):
280
fvar['intent'].append('out=%s' % (rname))
281
rout['args'][:] = [fname] + rout['args']
282
return rout,createfuncwrapper(rout)
283
if issubroutine_wrap(rout):
284
fortranname = getfortranname(rout)
286
outmess('\t\tCreating wrapper for Fortran subroutine "%s"("%s")...\n'%(name,fortranname))
287
rout = copy.copy(rout)
288
return rout,createsubrwrapper(rout)
166
rout['args'] = [fname] + rout['args']
167
return rout,createfuncwrapper(rout)