Chris@87
|
1 #!/usr/bin/env python
|
Chris@87
|
2 """
|
Chris@87
|
3
|
Chris@87
|
4 Build common block mechanism for f2py2e.
|
Chris@87
|
5
|
Chris@87
|
6 Copyright 2000 Pearu Peterson all rights reserved,
|
Chris@87
|
7 Pearu Peterson <pearu@ioc.ee>
|
Chris@87
|
8 Permission to use, modify, and distribute this software is given under the
|
Chris@87
|
9 terms of the NumPy License
|
Chris@87
|
10
|
Chris@87
|
11 NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
|
Chris@87
|
12 $Date: 2005/05/06 10:57:33 $
|
Chris@87
|
13 Pearu Peterson
|
Chris@87
|
14
|
Chris@87
|
15 """
|
Chris@87
|
16 from __future__ import division, absolute_import, print_function
|
Chris@87
|
17
|
Chris@87
|
18 __version__ = "$Revision: 1.19 $"[10:-1]
|
Chris@87
|
19
|
Chris@87
|
20 from . import __version__
|
Chris@87
|
21 f2py_version = __version__.version
|
Chris@87
|
22
|
Chris@87
|
23 import pprint
|
Chris@87
|
24 import sys
|
Chris@87
|
25 errmess=sys.stderr.write
|
Chris@87
|
26 outmess=sys.stdout.write
|
Chris@87
|
27 show=pprint.pprint
|
Chris@87
|
28
|
Chris@87
|
29 from .auxfuncs import *
|
Chris@87
|
30 from . import capi_maps
|
Chris@87
|
31 from . import func2subr
|
Chris@87
|
32 from .crackfortran import rmbadname
|
Chris@87
|
33 ##############
|
Chris@87
|
34
|
Chris@87
|
35 def findcommonblocks(block,top=1):
|
Chris@87
|
36 ret = []
|
Chris@87
|
37 if hascommon(block):
|
Chris@87
|
38 for n in block['common'].keys():
|
Chris@87
|
39 vars={}
|
Chris@87
|
40 for v in block['common'][n]:
|
Chris@87
|
41 vars[v]=block['vars'][v]
|
Chris@87
|
42 ret.append((n, block['common'][n], vars))
|
Chris@87
|
43 elif hasbody(block):
|
Chris@87
|
44 for b in block['body']:
|
Chris@87
|
45 ret=ret+findcommonblocks(b, 0)
|
Chris@87
|
46 if top:
|
Chris@87
|
47 tret=[]
|
Chris@87
|
48 names=[]
|
Chris@87
|
49 for t in ret:
|
Chris@87
|
50 if t[0] not in names:
|
Chris@87
|
51 names.append(t[0])
|
Chris@87
|
52 tret.append(t)
|
Chris@87
|
53 return tret
|
Chris@87
|
54 return ret
|
Chris@87
|
55
|
Chris@87
|
56 def buildhooks(m):
|
Chris@87
|
57 ret = {'commonhooks':[],'initcommonhooks':[],'docs':['"COMMON blocks:\\n"']}
|
Chris@87
|
58 fwrap = ['']
|
Chris@87
|
59 def fadd(line,s=fwrap): s[0] = '%s\n %s'%(s[0], line)
|
Chris@87
|
60 chooks = ['']
|
Chris@87
|
61 def cadd(line,s=chooks): s[0] = '%s\n%s'%(s[0], line)
|
Chris@87
|
62 ihooks = ['']
|
Chris@87
|
63 def iadd(line,s=ihooks): s[0] = '%s\n%s'%(s[0], line)
|
Chris@87
|
64 doc = ['']
|
Chris@87
|
65 def dadd(line,s=doc): s[0] = '%s\n%s'%(s[0], line)
|
Chris@87
|
66 for (name, vnames, vars) in findcommonblocks(m):
|
Chris@87
|
67 lower_name = name.lower()
|
Chris@87
|
68 hnames, inames = [], []
|
Chris@87
|
69 for n in vnames:
|
Chris@87
|
70 if isintent_hide(vars[n]): hnames.append(n)
|
Chris@87
|
71 else: inames.append(n)
|
Chris@87
|
72 if hnames:
|
Chris@87
|
73 outmess('\t\tConstructing COMMON block support for "%s"...\n\t\t %s\n\t\t Hidden: %s\n'%(name, ','.join(inames), ','.join(hnames)))
|
Chris@87
|
74 else:
|
Chris@87
|
75 outmess('\t\tConstructing COMMON block support for "%s"...\n\t\t %s\n'%(name, ','.join(inames)))
|
Chris@87
|
76 fadd('subroutine f2pyinit%s(setupfunc)'%name)
|
Chris@87
|
77 fadd('external setupfunc')
|
Chris@87
|
78 for n in vnames:
|
Chris@87
|
79 fadd(func2subr.var2fixfortran(vars, n))
|
Chris@87
|
80 if name=='_BLNK_':
|
Chris@87
|
81 fadd('common %s'%(','.join(vnames)))
|
Chris@87
|
82 else:
|
Chris@87
|
83 fadd('common /%s/ %s'%(name, ','.join(vnames)))
|
Chris@87
|
84 fadd('call setupfunc(%s)'%(','.join(inames)))
|
Chris@87
|
85 fadd('end\n')
|
Chris@87
|
86 cadd('static FortranDataDef f2py_%s_def[] = {'%(name))
|
Chris@87
|
87 idims=[]
|
Chris@87
|
88 for n in inames:
|
Chris@87
|
89 ct = capi_maps.getctype(vars[n])
|
Chris@87
|
90 at = capi_maps.c2capi_map[ct]
|
Chris@87
|
91 dm = capi_maps.getarrdims(n, vars[n])
|
Chris@87
|
92 if dm['dims']: idims.append('(%s)'%(dm['dims']))
|
Chris@87
|
93 else: idims.append('')
|
Chris@87
|
94 dms=dm['dims'].strip()
|
Chris@87
|
95 if not dms: dms='-1'
|
Chris@87
|
96 cadd('\t{\"%s\",%s,{{%s}},%s},'%(n, dm['rank'], dms, at))
|
Chris@87
|
97 cadd('\t{NULL}\n};')
|
Chris@87
|
98 inames1 = rmbadname(inames)
|
Chris@87
|
99 inames1_tps = ','.join(['char *'+s for s in inames1])
|
Chris@87
|
100 cadd('static void f2py_setup_%s(%s) {'%(name, inames1_tps))
|
Chris@87
|
101 cadd('\tint i_f2py=0;')
|
Chris@87
|
102 for n in inames1:
|
Chris@87
|
103 cadd('\tf2py_%s_def[i_f2py++].data = %s;'%(name, n))
|
Chris@87
|
104 cadd('}')
|
Chris@87
|
105 if '_' in lower_name:
|
Chris@87
|
106 F_FUNC='F_FUNC_US'
|
Chris@87
|
107 else:
|
Chris@87
|
108 F_FUNC='F_FUNC'
|
Chris@87
|
109 cadd('extern void %s(f2pyinit%s,F2PYINIT%s)(void(*)(%s));'\
|
Chris@87
|
110 %(F_FUNC, lower_name, name.upper(),
|
Chris@87
|
111 ','.join(['char*']*len(inames1))))
|
Chris@87
|
112 cadd('static void f2py_init_%s(void) {'%name)
|
Chris@87
|
113 cadd('\t%s(f2pyinit%s,F2PYINIT%s)(f2py_setup_%s);'\
|
Chris@87
|
114 %(F_FUNC, lower_name, name.upper(), name))
|
Chris@87
|
115 cadd('}\n')
|
Chris@87
|
116 iadd('\tF2PyDict_SetItemString(d, \"%s\", PyFortranObject_New(f2py_%s_def,f2py_init_%s));'%(name, name, name))
|
Chris@87
|
117 tname = name.replace('_', '\\_')
|
Chris@87
|
118 dadd('\\subsection{Common block \\texttt{%s}}\n'%(tname))
|
Chris@87
|
119 dadd('\\begin{description}')
|
Chris@87
|
120 for n in inames:
|
Chris@87
|
121 dadd('\\item[]{{}\\verb@%s@{}}'%(capi_maps.getarrdocsign(n, vars[n])))
|
Chris@87
|
122 if hasnote(vars[n]):
|
Chris@87
|
123 note = vars[n]['note']
|
Chris@87
|
124 if isinstance(note, list): note='\n'.join(note)
|
Chris@87
|
125 dadd('--- %s'%(note))
|
Chris@87
|
126 dadd('\\end{description}')
|
Chris@87
|
127 ret['docs'].append('"\t/%s/ %s\\n"'%(name, ','.join(map(lambda v, d:v+d, inames, idims))))
|
Chris@87
|
128 ret['commonhooks']=chooks
|
Chris@87
|
129 ret['initcommonhooks']=ihooks
|
Chris@87
|
130 ret['latexdoc']=doc[0]
|
Chris@87
|
131 if len(ret['docs'])<=1: ret['docs']=''
|
Chris@87
|
132 return ret, fwrap[0]
|