~jtaylor/ubuntu/precise/python-numpy/multiarch-fix-818867

« back to all changes in this revision

Viewing changes to numpy/f2py/crackfortran.py

  • Committer: Bazaar Package Importer
  • Author(s): Ondrej Certik, Riku Voipio, Tiziano Zito, Carlos Galisteo, Ondrej Certik
  • Date: 2008-07-08 15:08:16 UTC
  • mfrom: (0.1.21 intrepid)
  • Revision ID: james.westby@ubuntu.com-20080708150816-ekf992jcp2k1eua3
Tags: 1:1.1.0-3
[ Riku Voipio ]
* debian/control: atlas is not available on armel, and after a quick look
  neither on alpha. I'd also suggest dropping
  libatlas-sse-dev|libatlas-sse2-dev|libatlas-3dnow-dev alternative combo
  away, these are potentially dangerous on buildd's. Ondrej: dropped.
  (Closes: #489568)

[ Tiziano Zito ]
* patch: build _dotblas.c when ATLAS is not installed, build-conflict with
  atlas, build-depend on blas+lapack only, as it used to be (Closes: #489726)

[ Carlos Galisteo ]
* debian/control
  - Added Homepage field.

[ Ondrej Certik ]
* Checked the package on i386 and amd64, both with and without atlas, all
  tests run and the numpy package is faster if atlas is around. 

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
__version__ = "$Revision: 1.177 $"[10:-1]
16
16
 
17
17
import __version__
 
18
import string
18
19
f2py_version = __version__.version
19
20
 
20
21
"""
143
144
     The above may be solved by creating appropriate preprocessor program, for example.
144
145
"""
145
146
#
146
 
import sys,string,fileinput,re,pprint,os,copy
 
147
import sys
 
148
import string
 
149
import fileinput
 
150
import re
 
151
import pprint
 
152
import os
 
153
import copy
147
154
from auxfuncs import *
148
155
 
149
156
# Global flags:
201
208
          'struct','static','register','new','break','do','goto','switch',
202
209
          'continue','else','inline','extern','delete','const','auto',
203
210
          'len','rank','shape','index','slen','size','_i',
 
211
          'max', 'min',
204
212
          'flen','fshape',
205
213
          'string','complex_double','float_double','stdin','stderr','stdout',
206
214
          'type','default']:
207
215
    badnames[n]=n+'_bn'
208
216
    invbadnames[n+'_bn']=n
209
217
def rmbadname1(name):
210
 
    if badnames.has_key(name):
 
218
    if name in badnames:
211
219
        errmess('rmbadname1: Replacing "%s" with "%s".\n'%(name,badnames[name]))
212
220
        return badnames[name]
213
221
    return name
214
222
def rmbadname(names): return map(rmbadname1,names)
215
223
 
216
224
def undo_rmbadname1(name):
217
 
    if invbadnames.has_key(name):
 
225
    if name in invbadnames:
218
226
        errmess('undo_rmbadname1: Replacing "%s" with "%s".\n'\
219
227
                %(name,invbadnames[name]))
220
228
        return invbadnames[name]
222
230
def undo_rmbadname(names): return map(undo_rmbadname1,names)
223
231
 
224
232
def getextension(name):
225
 
    i=string.rfind(name,'.')
 
233
    i=name.rfind('.')
226
234
    if i==-1: return ''
227
235
    if '\\' in name[i:]: return ''
228
236
    if '/' in name[i:]: return ''
247
255
        n = 0
248
256
        result = 1
249
257
    while n>0 and line:
250
 
        if line[0]!='!':
 
258
        if line[0]!='!' and line.strip():
251
259
            n -= 1
252
260
            if (line[0]!='\t' and _free_f90_start(line[:5])) or line[-2:-1]=='&':
253
261
                result = 1
307
315
                    %(`currentfilename`,sourcecodeform,
308
316
                      strictf77 and ',strict' or ''))
309
317
 
310
 
        l=string.expandtabs(l).replace('\xa0',' ')
 
318
        l=l.expandtabs().replace('\xa0',' ')
311
319
        while not l=='':                       # Get rid of newline characters
312
320
            if l[-1] not in "\n\r\f": break
313
321
            l=l[:-1]
316
324
            if r:
317
325
                l=r.group('line')+' ' # Strip comments starting with `!'
318
326
                rl=r.group('rest')
319
 
                if string.lower(rl[:4])=='f2py': # f2py directive
 
327
                if rl[:4].lower()=='f2py': # f2py directive
320
328
                    l = l + 4*' '
321
329
                    r=commentline.match(rl[4:])
322
330
                    if r: l=l+r('line')
323
331
                    else: l = l + rl[4:]
324
 
        if string.strip(l)=='': # Skip empty line
 
332
        if l.strip()=='': # Skip empty line
325
333
            cont=0
326
334
            continue
327
335
        if sourcecodeform=='fix':
328
336
            if l[0] in ['*','c','!','C','#']:
329
 
                if string.lower(l[1:5])=='f2py': # f2py directive
 
337
                if l[1:5].lower()=='f2py': # f2py directive
330
338
                    l='     '+l[5:]
331
339
                else: # Skip comment line
332
340
                    cont=0
352
360
                        origfinalline=''
353
361
                    else:
354
362
                        l='     '+l[5:] # clean up line beginning from possible digits.
355
 
                        if localdolowercase: finalline=string.lower(ll)
 
363
                        if localdolowercase: finalline=ll.lower()
356
364
                        else: finalline=ll
357
365
                        origfinalline=ll
358
366
                        ll=l
359
367
                    cont=(r is not None)
360
368
                else:
361
369
                    l='     '+l[5:] # clean up line beginning from possible digits.
362
 
                    if localdolowercase: finalline=string.lower(ll)
 
370
                    if localdolowercase: finalline=ll.lower()
363
371
                    else: finalline=ll
364
372
                    origfinalline =ll
365
373
                    ll=l
383
391
                finalline=''
384
392
                origfinalline=''
385
393
            else:
386
 
                if localdolowercase: finalline=string.lower(ll)
 
394
                if localdolowercase: finalline=ll.lower()
387
395
                else: finalline=ll
388
396
                origfinalline =ll
389
397
                ll=l
411
419
            dowithline(finalline)
412
420
        l1=ll
413
421
    if localdolowercase:
414
 
        finalline=string.lower(ll)
 
422
        finalline=ll.lower()
415
423
    else: finalline=ll
416
424
    origfinalline = ll
417
425
    filepositiontext='Line #%d in %s:"%s"\n\t' % (fin.filelineno()-1,currentfilename,l1)
449
457
#
450
458
groupbegins77=r'program|block\s*data'
451
459
beginpattern77=re.compile(beforethisafter%('',groupbegins77,groupbegins77,'.*'),re.I),'begin'
452
 
groupbegins90=groupbegins77+r'|module|python\s*module|interface|type(?!\s*\()'
 
460
groupbegins90=groupbegins77+r'|module(?!\s*procedure)|python\s*module|interface|type(?!\s*\()'
453
461
beginpattern90=re.compile(beforethisafter%('',groupbegins90,groupbegins90,'.*'),re.I),'begin'
454
462
groupends=r'end|endprogram|endblockdata|endmodule|endpythonmodule|endinterface'
455
463
endpattern=re.compile(beforethisafter%('',groupends,groupends,'[\w\s]*'),re.I),'end'
482
490
 
483
491
def _simplifyargs(argsline):
484
492
    a = []
485
 
    for n in string.split(markoutercomma(argsline),'@,@'):
 
493
    for n in markoutercomma(argsline).split('@,@'):
486
494
        for r in '(),':
487
 
            n = string.replace(n,r,'_')
 
495
            n = n.replace(r,'_')
488
496
        a.append(n)
489
 
    return string.join(a,',')
 
497
    return ','.join(a)
490
498
 
491
499
crackline_re_1 = re.compile(r'\s*(?P<result>\b[a-z]+[\w]*\b)\s*[=].*',re.I)
492
500
def crackline(line,reset=0):
561
569
    if not m:
562
570
        re_1 = crackline_re_1
563
571
        if 0<=skipblocksuntil<=groupcounter:return
564
 
        if groupcache[groupcounter].has_key('externals'):
 
572
        if 'externals' in groupcache[groupcounter]:
565
573
            for name in groupcache[groupcounter]['externals']:
566
 
                if invbadnames.has_key(name):
 
574
                if name in invbadnames:
567
575
                    name=invbadnames[name]
568
 
                if groupcache[groupcounter].has_key('interfaced') and name in groupcache[groupcounter]['interfaced']: continue
 
576
                if 'interfaced' in groupcache[groupcounter] and name in groupcache[groupcounter]['interfaced']:
 
577
                    continue
569
578
                m1=re.match(r'(?P<before>[^"]*)\b%s\b\s*@\(@(?P<args>[^@]*)@\)@.*\Z'%name,markouterparen(line),re.I)
570
579
                if m1:
571
580
                    m2 = re_1.match(m1.group('before'))
650
659
    assert not f,`f,line,l,cc`
651
660
    return l
652
661
def unmarkouterparen(line):
653
 
    r = string.replace(string.replace(line,'@(@','('),'@)@',')')
 
662
    r = line.replace('@(@','(').replace('@)@',')')
654
663
    return r
655
664
def appenddecl(decl,decl2,force=1):
656
665
    if not decl: decl={}
658
667
    if decl is decl2: return decl
659
668
    for k in decl2.keys():
660
669
        if k=='typespec':
661
 
            if force or not decl.has_key(k): decl[k]=decl2[k]
 
670
            if force or k not in decl:
 
671
                decl[k]=decl2[k]
662
672
        elif k=='attrspec':
663
673
            for l in decl2[k]:
664
674
                decl=setattrspec(decl,l,force)
667
677
        elif k=='charselector':
668
678
            decl=setcharselector(decl,decl2[k],force)
669
679
        elif k in ['=','typename']:
670
 
            if force or not decl.has_key(k): decl[k]=decl2[k]
 
680
            if force or k not in decl:
 
681
                decl[k]=decl2[k]
671
682
        elif k=='note':
672
683
            pass
673
684
        elif k in ['intent','check','dimension','optional','required']:
706
717
        previous_context = None
707
718
    if expectbegin and case not in ['begin','call','callfun','type'] \
708
719
       and not skipemptyends and groupcounter<1:
709
 
        newname=string.split(os.path.basename(currentfilename),'.')[0]
 
720
        newname=os.path.basename(currentfilename).split('.')[0]
710
721
        outmess('analyzeline: no group yet. Creating program group with name "%s".\n'%newname)
711
722
        gotnextfile=0
712
723
        groupcounter=groupcounter+1
734
745
                outmess('analyzeline: No name/args pattern found for line.\n')
735
746
 
736
747
        previous_context = (block,name,groupcounter)
737
 
        if args: args=rmbadname(map(string.strip,string.split(markoutercomma(args),'@,@')))
 
748
        if args: args=rmbadname([x.strip() for x in markoutercomma(args).split('@,@')])
738
749
        else: args=[]
739
750
        if '' in args:
740
751
            while '' in args:
747
758
 
748
759
        if case in ['call','callfun']:
749
760
            needinterface=1
750
 
            if not groupcache[groupcounter].has_key('args'): return
 
761
            if 'args' not in groupcache[groupcounter]:
 
762
                return
751
763
            if name not in groupcache[groupcounter]['args']:
752
764
                return
753
765
            for it in grouplist[groupcounter]:
754
 
                if it['name']==name: return
755
 
            if name in groupcache[groupcounter]['interfaced']: return
 
766
                if it['name']==name:
 
767
                    return
 
768
            if name in groupcache[groupcounter]['interfaced']:
 
769
                return
756
770
            block={'call':'subroutine','callfun':'function'}[case]
757
771
        if f77modulename and neededmodule==-1 and groupcounter<=1:
758
772
            neededmodule=groupcounter+2
778
792
            grouplist[groupcounter]=[]
779
793
        if needinterface:
780
794
            if verbose>1:
781
 
                outmess('analyzeline: Creating additional interface block.\n',0)
 
795
                outmess('analyzeline: Creating additional interface block (groupcounter=%s).\n' % (groupcounter),0)
782
796
            groupname[groupcounter]='interface'
783
797
            groupcache[groupcounter]['block']='interface'
784
798
            groupcache[groupcounter]['name']='unknown_interface'
827
841
            try: groupcache[groupcounter]['vars'][name]=appenddecl(groupcache[groupcounter]['vars'][name],groupcache[groupcounter-2]['vars'][''])
828
842
            except: pass
829
843
            if case=='callfun': # return type
830
 
                if result and groupcache[groupcounter]['vars'].has_key(result):
 
844
                if result and result in groupcache[groupcounter]['vars']:
831
845
                    if not name==result:
832
846
                        groupcache[groupcounter]['vars'][name]=appenddecl(groupcache[groupcounter]['vars'][name],groupcache[groupcounter]['vars'][result])
833
847
            #if groupcounter>1: # name is interfaced
851
865
        name,args,result=_resolvenameargspattern(m.group('after'))
852
866
        if name is not None:
853
867
            if args:
854
 
                args=rmbadname(map(string.strip,string.split(markoutercomma(args),'@,@')))
 
868
                args=rmbadname([x.strip() for x in markoutercomma(args).split('@,@')])
855
869
            else: args=[]
856
870
            assert result is None,`result`
857
871
            groupcache[groupcounter]['entry'][name] = args
864
878
    elif case in ['dimension','intent','optional','required','external','public','private','intrisic']:
865
879
        edecl=groupcache[groupcounter]['vars']
866
880
        ll=m.group('after').strip()
867
 
        i=string.find(ll,'::')
 
881
        i=ll.find('::')
868
882
        if i<0 and case=='intent':
869
 
            i=string.find(markouterparen(ll),'@)@')-2
 
883
            i=markouterparen(ll).find('@)@')-2
870
884
            ll=ll[:i+1]+'::'+ll[i+1:]
871
 
            i=string.find(ll,'::')
872
 
            if ll[i:]=='::' and groupcache[groupcounter].has_key('args'):
 
885
            i=ll.find('::')
 
886
            if ll[i:]=='::' and 'args' in groupcache[groupcounter]:
873
887
                outmess('All arguments will have attribute %s%s\n'%(m.group('this'),ll[:i]))
874
 
                ll = ll + string.join(groupcache[groupcounter]['args'],',')
 
888
                ll = ll + ','.join(groupcache[groupcounter]['args'])
875
889
        if i<0:i=0;pl=''
876
 
        else: pl=string.strip(ll[:i]);ll=ll[i+2:]
877
 
        ch = string.split(markoutercomma(pl),'@,@')
 
890
        else: pl=ll[:i].strip();ll=ll[i+2:]
 
891
        ch = markoutercomma(pl).split('@,@')
878
892
        if len(ch)>1:
879
893
            pl = ch[0]
880
894
            outmess('analyzeline: cannot handle multiple attributes without type specification. Ignoring %r.\n' % (','.join(ch[1:])))
881
895
        last_name = None
882
 
        for e in map(string.strip,string.split(markoutercomma(ll),'@,@')):
 
896
 
 
897
        for e in [x.strip() for x in markoutercomma(ll).split('@,@')]:
883
898
            m1=namepattern.match(e)
884
899
            if not m1:
885
900
                if case in ['public','private']: k=''
889
904
                    continue
890
905
            else:
891
906
                k=rmbadname1(m1.group('name'))
892
 
            if not edecl.has_key(k): edecl[k]={}
893
 
            if case=='dimension': ap=case+m1.group('after')
 
907
            if k not in edecl:
 
908
                edecl[k]={}
 
909
            if case=='dimension':
 
910
                ap=case+m1.group('after')
894
911
            if case=='intent':
895
912
                ap=m.group('this')+pl
896
913
                if _intentcallbackpattern.match(ap):
897
914
                    if k not in groupcache[groupcounter]['args']:
898
 
                        if groupcounter>1 and \
899
 
                               string.find(groupcache[groupcounter-2]['name'],
900
 
                                           '__user__')==-1:
 
915
                        if groupcounter>1:
901
916
                            outmess('analyzeline: appending intent(callback) %s'\
902
917
                                    ' to %s arguments\n' % (k,groupcache[groupcounter]['name']))
 
918
                            if '__user__' not in groupcache[groupcounter-2]['name']:
 
919
                                outmess('analyzeline: missing __user__ module (could be nothing)\n')
903
920
                            groupcache[groupcounter]['args'].append(k)
 
921
                        else:
 
922
                            errmess('analyzeline: intent(callback) %s is ignored' % (k))
904
923
                    else:
905
924
                        errmess('analyzeline: intent(callback) %s is already'\
906
925
                                ' in argument list' % (k))
907
 
            if case in ['optional','required','public','external','private','intrisic']: ap=case
908
 
            if edecl[k].has_key('attrspec'): edecl[k]['attrspec'].append(ap)
909
 
            else: edecl[k]['attrspec']=[ap]
 
926
            if case in ['optional','required','public','external','private','intrisic']:
 
927
                ap=case
 
928
            if 'attrspec' in edecl[k]:
 
929
                edecl[k]['attrspec'].append(ap)
 
930
            else:
 
931
                edecl[k]['attrspec']=[ap]
910
932
            if case=='external':
911
933
                if groupcache[groupcounter]['block']=='program':
912
934
                    outmess('analyzeline: ignoring program arguments\n')
914
936
                if k not in groupcache[groupcounter]['args']:
915
937
                    #outmess('analyzeline: ignoring external %s (not in arguments list)\n'%(`k`))
916
938
                    continue
917
 
                if not groupcache[groupcounter].has_key('externals'):
 
939
                if 'externals' not in groupcache[groupcounter]:
918
940
                    groupcache[groupcounter]['externals']=[]
919
941
                groupcache[groupcounter]['externals'].append(k)
920
942
            last_name = k
923
945
            previous_context = ('variable',last_name,groupcounter)
924
946
    elif case=='parameter':
925
947
        edecl=groupcache[groupcounter]['vars']
926
 
        ll=string.strip(m.group('after'))[1:-1]
 
948
        ll=m.group('after').strip()[1:-1]
927
949
        last_name = None
928
 
        for e in string.split(markoutercomma(ll),'@,@'):
 
950
        for e in markoutercomma(ll).split('@,@'):
929
951
            try:
930
 
                k,initexpr=map(string.strip,string.split(e,'='))
 
952
                k,initexpr=[x.strip() for x in e.split('=')]
931
953
            except:
932
954
                outmess('analyzeline: could not extract name,expr in parameter statement "%s" of "%s"\n'%(e,ll));continue
933
955
            params = get_parameters(edecl)
934
956
            k=rmbadname1(k)
935
 
            if not edecl.has_key(k): edecl[k]={}
936
 
            if edecl[k].has_key('=') and (not edecl[k]['=']==initexpr):
 
957
            if k not in edecl:
 
958
                edecl[k]={}
 
959
            if '=' in edecl[k] and (not edecl[k]['=']==initexpr):
937
960
                outmess('analyzeline: Overwriting the value of parameter "%s" ("%s") with "%s".\n'%(k,edecl[k]['='],initexpr))
938
961
            t = determineexprtype(initexpr,params)
939
962
            if t:
942
965
                    for m in real16pattern.finditer(initexpr):
943
966
                        tt[m.start():m.end()] = list(\
944
967
                            initexpr[m.start():m.end()].lower().replace('d', 'e'))
945
 
                    initexpr = "".join(tt)
 
968
                    initexpr = ''.join(tt)
946
969
                elif t.get('typespec')=='complex':
947
970
                    initexpr = initexpr[1:].lower().replace('d','e').\
948
971
                               replace(',','+1j*(')
953
976
                        % (initexpr, msg))
954
977
                continue
955
978
            edecl[k]['='] = repr(v)
956
 
            if edecl[k].has_key('attrspec'):
 
979
            if 'attrspec' in edecl[k]:
957
980
                edecl[k]['attrspec'].append('parameter')
958
981
            else: edecl[k]['attrspec']=['parameter']
959
982
            last_name = k
961
984
        if last_name is not None:
962
985
            previous_context = ('variable',last_name,groupcounter)
963
986
    elif case=='implicit':
964
 
        if string.lower(string.strip(m.group('after')))=='none':
 
987
        if m.group('after').strip().lower()=='none':
965
988
            groupcache[groupcounter]['implicit']=None
966
989
        elif m.group('after'):
967
 
            if groupcache[groupcounter].has_key('implicit'):
 
990
            if 'implicit' in groupcache[groupcounter]:
968
991
                impl=groupcache[groupcounter]['implicit']
969
992
            else: impl={}
970
993
            if impl is None:
971
994
                outmess('analyzeline: Overwriting earlier "implicit none" statement.\n')
972
995
                impl={}
973
 
            for e in string.split(markoutercomma(m.group('after')),'@,@'):
 
996
            for e in markoutercomma(m.group('after')).split('@,@'):
974
997
                decl={}
975
998
                m1=re.match(r'\s*(?P<this>.*?)\s*(\(\s*(?P<after>[a-z-, ]+)\s*\)\s*|)\Z',e,re.I)
976
999
                if not m1:
986
1009
                decl['typename']=typename
987
1010
                for k in decl.keys():
988
1011
                    if not decl[k]: del decl[k]
989
 
                for r in string.split(markoutercomma(m1.group('after')),'@,@'):
 
1012
                for r in markoutercomma(m1.group('after')).split('@,@'):
990
1013
                    if '-' in r:
991
 
                        try: begc,endc=map(string.strip,string.split(r,'-'))
 
1014
                        try: begc,endc=[x.strip() for x in r.split('-')]
992
1015
                        except:
993
1016
                            outmess('analyzeline: expected "<char>-<char>" instead of "%s" in range list of implicit statement\n'%r);continue
994
 
                    else: begc=endc=string.strip(r)
 
1017
                    else: begc=endc=r.strip()
995
1018
                    if not len(begc)==len(endc)==1:
996
1019
                        outmess('analyzeline: expected "<char>-<char>" instead of "%s" in range list of implicit statement (2)\n'%r);continue
997
1020
                    for o in range(ord(begc),ord(endc)+1):
1020
1043
                dl = dl[1:].strip()
1021
1044
            ll.append([dl,il])
1022
1045
        vars={}
1023
 
        if groupcache[groupcounter].has_key('vars'):
 
1046
        if 'vars' in groupcache[groupcounter]:
1024
1047
            vars=groupcache[groupcounter]['vars']
1025
1048
        last_name = None
1026
1049
        for l in ll:
1027
 
            l=map(string.strip,l)
 
1050
            l=[x.strip() for x in l]
1028
1051
            if l[0][0]==',':l[0]=l[0][1:]
1029
1052
            if l[0][0]=='(':
1030
1053
                outmess('analyzeline: implied-DO list "%s" is not supported. Skipping.\n'%l[0])
1033
1056
            #    #outmess('analyzeline: ignoring this data statement.\n')
1034
1057
            #    continue
1035
1058
            i=0;j=0;llen=len(l[1])
1036
 
            for v in rmbadname(map(string.strip,string.split(markoutercomma(l[0]),'@,@'))):
 
1059
            for v in rmbadname([x.strip() for x in markoutercomma(l[0]).split('@,@')]):
1037
1060
                if v[0]=='(':
1038
1061
                    outmess('analyzeline: implied-DO list "%s" is not supported. Skipping.\n'%v)
1039
1062
                    # XXX: subsequent init expressions may get wrong values.
1045
1068
                    i=i+1
1046
1069
                i=i+1
1047
1070
                #v,l[1][j:i-1]=name,initvalue
1048
 
                if not vars.has_key(v):
 
1071
                if v not in vars:
1049
1072
                    vars[v]={}
1050
 
                if vars[v].has_key('=') and not vars[v]['=']==l[1][j:i-1]:
 
1073
                if '=' in vars[v] and not vars[v]['=']==l[1][j:i-1]:
1051
1074
                    outmess('analyzeline: changing init expression of "%s" ("%s") to "%s"\n'%(v,vars[v]['='],l[1][j:i-1]))
1052
1075
                vars[v]['=']=l[1][j:i-1]
1053
1076
                j=i
1056
1079
        if last_name is not None:
1057
1080
            previous_context = ('variable',last_name,groupcounter)
1058
1081
    elif case=='common':
1059
 
        line=string.strip(m.group('after'))
 
1082
        line=m.group('after').strip()
1060
1083
        if not line[0]=='/':line='//'+line
1061
1084
        cl=[]
1062
1085
        f=0;bn='';ol=''
1063
1086
        for c in line:
1064
1087
            if c=='/':f=f+1;continue
1065
1088
            if f>=3:
1066
 
                bn = string.strip(bn)
 
1089
                bn = bn.strip()
1067
1090
                if not bn: bn='_BLNK_'
1068
1091
                cl.append([bn,ol])
1069
1092
                f=f-2;bn='';ol=''
1070
1093
            if f%2: bn=bn+c
1071
1094
            else: ol=ol+c
1072
 
        bn = string.strip(bn)
 
1095
        bn = bn.strip()
1073
1096
        if not bn: bn='_BLNK_'
1074
1097
        cl.append([bn,ol])
1075
1098
        commonkey={}
1076
 
        if groupcache[groupcounter].has_key('common'):
 
1099
        if 'common' in groupcache[groupcounter]:
1077
1100
            commonkey=groupcache[groupcounter]['common']
1078
1101
        for c in cl:
1079
 
            if commonkey.has_key(c[0]):
 
1102
            if c[0] in commonkey:
1080
1103
                outmess('analyzeline: previously defined common block encountered. Skipping.\n')
1081
1104
                continue
1082
1105
            commonkey[c[0]]=[]
1083
 
            for i in map(string.strip,string.split(markoutercomma(c[1]),'@,@')):
 
1106
            for i in [x.strip() for x in markoutercomma(c[1]).split('@,@')]:
1084
1107
                if i: commonkey[c[0]].append(i)
1085
1108
        groupcache[groupcounter]['common']=commonkey
1086
1109
        previous_context = ('common',bn,groupcounter)
1088
1111
        m1=re.match(r'\A\s*(?P<name>\b[\w]+\b)\s*((,(\s*\bonly\b\s*:|(?P<notonly>))\s*(?P<list>.*))|)\s*\Z',m.group('after'),re.I)
1089
1112
        if m1:
1090
1113
            mm=m1.groupdict()
1091
 
            if not groupcache[groupcounter].has_key('use'): groupcache[groupcounter]['use']={}
 
1114
            if 'use' not in groupcache[groupcounter]:
 
1115
                groupcache[groupcounter]['use']={}
1092
1116
            name=m1.group('name')
1093
1117
            groupcache[groupcounter]['use'][name]={}
1094
1118
            isonly=0
1095
 
            if mm.has_key('list') and mm['list'] is not None:
1096
 
                if mm.has_key('notonly') and mm['notonly'] is None:isonly=1
 
1119
            if 'list' in mm and mm['list'] is not None:
 
1120
                if 'notonly' in mm and mm['notonly'] is None:
 
1121
                    isonly=1
1097
1122
                groupcache[groupcounter]['use'][name]['only']=isonly
1098
 
                ll=map(string.strip,string.split(mm['list'],','))
 
1123
                ll=[x.strip() for x in mm['list'].split(',')]
1099
1124
                rl={}
1100
1125
                for l in ll:
1101
1126
                    if '=' in l:
1102
1127
                        m2=re.match(r'\A\s*(?P<local>\b[\w]+\b)\s*=\s*>\s*(?P<use>\b[\w]+\b)\s*\Z',l,re.I)
1103
 
                        if m2: rl[string.strip(m2.group('local'))]=string.strip(m2.group('use'))
 
1128
                        if m2: rl[m2.group('local').strip()]=m2.group('use').strip()
1104
1129
                        else:
1105
1130
                            outmess('analyzeline: Not local=>use pattern found in %s\n'%`l`)
1106
1131
                    else:
1113
1138
            print m.groupdict()
1114
1139
            outmess('analyzeline: Could not crack the use statement.\n')
1115
1140
    elif case in ['f2pyenhancements']:
1116
 
        if not groupcache[groupcounter].has_key ('f2pyenhancements'):
 
1141
        if 'f2pyenhancements' not in groupcache[groupcounter]:
1117
1142
            groupcache[groupcounter]['f2pyenhancements'] = {}
1118
1143
        d = groupcache[groupcounter]['f2pyenhancements']
1119
 
        if m.group('this')=='usercode' and d.has_key('usercode'):
 
1144
        if m.group('this')=='usercode' and 'usercode' in d:
1120
1145
            if type(d['usercode']) is type(''):
1121
1146
                d['usercode'] = [d['usercode']]
1122
1147
            d['usercode'].append(m.group('after'))
1138
1163
            outmess('analyzeline: No code implemented for line.\n')
1139
1164
 
1140
1165
def appendmultiline(group, context_name,ml):
1141
 
    if not group.has_key('f2pymultilines'):
 
1166
    if 'f2pymultilines' not in group:
1142
1167
        group['f2pymultilines'] = {}
1143
1168
    d = group['f2pymultilines']
1144
 
    if not d.has_key(context_name):
 
1169
    if context_name not in d:
1145
1170
        d[context_name] = []
1146
1171
    d[context_name].append(ml)
1147
1172
    return
1151
1176
    attr=None
1152
1177
    if re.match(r'double\s*complex',typespec,re.I): typespec='double complex'
1153
1178
    elif re.match(r'double\s*precision',typespec,re.I): typespec='double precision'
1154
 
    else: typespec=string.lower(string.strip(typespec))
 
1179
    else: typespec=typespec.strip().lower()
1155
1180
    m1=selectpattern.match(markouterparen(ll))
1156
1181
    if not m1:
1157
1182
        outmess('cracktypespec0: no kind/char_selector pattern found for line.\n')
1161
1186
    if typespec in ['complex','integer','logical','real','character','type']:
1162
1187
        selector=d['this']
1163
1188
        ll=d['after']
1164
 
    i=string.find(ll,'::')
 
1189
    i=ll.find('::')
1165
1190
    if i>=0:
1166
 
        attr=string.strip(ll[:i])
 
1191
        attr=ll[:i].strip()
1167
1192
        ll=ll[i+2:]
1168
1193
    return typespec,selector,attr,ll
1169
1194
#####
1173
1198
lenkindpattern=re.compile(r'\s*(kind\s*=\s*(?P<kind>.*?)\s*(@,@\s*len\s*=\s*(?P<len>.*)|)|(len\s*=\s*|)(?P<len2>.*?)\s*(@,@\s*(kind\s*=\s*|)(?P<kind2>.*)|))\s*\Z',re.I)
1174
1199
lenarraypattern=re.compile(r'\s*(@\(@\s*(?!/)\s*(?P<array>.*?)\s*@\)@\s*[*]\s*(?P<len>.*?)|([*]\s*(?P<len2>.*?)|)\s*(@\(@\s*(?!/)\s*(?P<array2>.*?)\s*@\)@|))\s*(=\s*(?P<init>.*?)|(@\(@|)/\s*(?P<init2>.*?)\s*/(@\)@|)|)\s*\Z',re.I)
1175
1200
def removespaces(expr):
1176
 
    expr=string.strip(expr)
 
1201
    expr=expr.strip()
1177
1202
    if len(expr)<=1: return expr
1178
1203
    expr2=expr[0]
1179
1204
    for i in range(1,len(expr)-1):
1180
1205
        if expr[i]==' ' and \
1181
 
           ((expr[i+1] in "()[]{}= ") or (expr[i-1] in "()[]{}= ")): continue
 
1206
           ((expr[i+1] in "()[]{}=+-/* ") or (expr[i-1] in "()[]{}=+-/* ")): continue
1182
1207
        expr2=expr2+expr[i]
1183
1208
    expr2=expr2+expr[-1]
1184
1209
    return expr2
1203
1228
    last_name = None
1204
1229
    kindselect,charselect,typename=cracktypespec(typespec,selector)
1205
1230
    if attrspec:
1206
 
        attrspec=map(string.strip,string.split(markoutercomma(attrspec),'@,@'))
 
1231
        attrspec=[x.strip() for x in markoutercomma(attrspec).split('@,@')]
1207
1232
        l = []
1208
1233
        c = re.compile(r'(?P<start>[a-zA-Z]+)')
1209
1234
        for a in attrspec:
1210
1235
            m = c.match(a)
1211
1236
            if m:
1212
 
                s = string.lower(m.group('start'))
 
1237
                s = m.group('start').lower()
1213
1238
                a = s + a[len(s):]
1214
1239
            l.append(a)
1215
1240
        attrspec = l
1216
 
    el=map(string.strip,string.split(markoutercomma(entitydecl),'@,@'))
 
1241
    el=[x.strip() for x in markoutercomma(entitydecl).split('@,@')]
1217
1242
    el1=[]
1218
1243
    for e in el:
1219
 
        for e1 in map(string.strip,string.split(markoutercomma(removespaces(markinnerspaces(e)),comma=' '),'@ @')):
1220
 
            if e1: el1.append(string.replace(e1,'@_@',' '))
 
1244
        for e1 in [x.strip() for x in markoutercomma(removespaces(markinnerspaces(e)),comma=' ').split('@ @')]:
 
1245
            if e1: el1.append(e1.replace('@_@',' '))
1221
1246
    for e in el1:
1222
1247
        m=namepattern.match(e)
1223
1248
        if not m:
1225
1250
            continue
1226
1251
        ename=rmbadname1(m.group('name'))
1227
1252
        edecl={}
1228
 
        if groupcache[groupcounter]['vars'].has_key(ename):
 
1253
        if ename in groupcache[groupcounter]['vars']:
1229
1254
            edecl=groupcache[groupcounter]['vars'][ename].copy()
1230
 
            has_typespec = edecl.has_key('typespec')
1231
 
            if not has_typespec:
 
1255
            not_has_typespec = 'typespec' not in edecl
 
1256
            if not_has_typespec:
1232
1257
                edecl['typespec']=typespec
1233
1258
            elif typespec and (not typespec==edecl['typespec']):
1234
1259
                outmess('updatevars: attempt to change the type of "%s" ("%s") to "%s". Ignoring.\n' % (ename,edecl['typespec'],typespec))
1235
 
            if not edecl.has_key('kindselector'):
 
1260
            if 'kindselector' not in edecl:
1236
1261
                edecl['kindselector']=copy.copy(kindselect)
1237
1262
            elif kindselect:
1238
1263
                for k in kindselect.keys():
1239
 
                    if edecl['kindselector'].has_key(k) and (not kindselect[k]==edecl['kindselector'][k]):
 
1264
                    if k in edecl['kindselector'] and (not kindselect[k]==edecl['kindselector'][k]):
1240
1265
                        outmess('updatevars: attempt to change the kindselector "%s" of "%s" ("%s") to "%s". Ignoring.\n' % (k,ename,edecl['kindselector'][k],kindselect[k]))
1241
1266
                    else: edecl['kindselector'][k]=copy.copy(kindselect[k])
1242
 
            if not edecl.has_key('charselector') and charselect:
1243
 
                if not has_typespec:
 
1267
            if 'charselector' not in edecl and charselect:
 
1268
                if not_has_typespec:
1244
1269
                    edecl['charselector']=charselect
1245
1270
                else:
1246
1271
                    errmess('updatevars:%s: attempt to change empty charselector to %r. Ignoring.\n' \
1247
1272
                            %(ename,charselect))
1248
1273
            elif charselect:
1249
1274
                for k in charselect.keys():
1250
 
                    if edecl['charselector'].has_key(k) and (not charselect[k]==edecl['charselector'][k]):
 
1275
                    if k in edecl['charselector'] and (not charselect[k]==edecl['charselector'][k]):
1251
1276
                        outmess('updatevars: attempt to change the charselector "%s" of "%s" ("%s") to "%s". Ignoring.\n' % (k,ename,edecl['charselector'][k],charselect[k]))
1252
1277
                    else: edecl['charselector'][k]=copy.copy(charselect[k])
1253
 
            if not edecl.has_key('typename'):
 
1278
            if 'typename' not in edecl:
1254
1279
                edecl['typename']=typename
1255
1280
            elif typename and (not edecl['typename']==typename):
1256
1281
                outmess('updatevars: attempt to change the typename of "%s" ("%s") to "%s". Ignoring.\n' % (ename,edecl['typename'],typename))
1257
 
            if not edecl.has_key('attrspec'):
 
1282
            if 'attrspec' not in edecl:
1258
1283
                edecl['attrspec']=copy.copy(attrspec)
1259
1284
            elif attrspec:
1260
1285
                for a in attrspec:
1275
1300
                for k in d1.keys():
1276
1301
                    if d1[k] is not None: d1[k]=unmarkouterparen(d1[k])
1277
1302
                    else: del d1[k]
1278
 
                if d1.has_key('len') and d1.has_key('array'):
 
1303
                if 'len' in d1 and 'array' in d1:
1279
1304
                    if d1['len']=='':
1280
1305
                        d1['len']=d1['array']
1281
1306
                        del d1['array']
1283
1308
                        d1['array']=d1['array']+','+d1['len']
1284
1309
                        del d1['len']
1285
1310
                        errmess('updatevars: "%s %s" is mapped to "%s %s(%s)"\n'%(typespec,e,typespec,ename,d1['array']))
1286
 
                if d1.has_key('array'):
 
1311
                if 'array' in d1:
1287
1312
                    dm = 'dimension(%s)'%d1['array']
1288
 
                    if not edecl.has_key('attrspec') or (not edecl['attrspec']):
 
1313
                    if 'attrspec' not in edecl or (not edecl['attrspec']):
1289
1314
                        edecl['attrspec']=[dm]
1290
1315
                    else:
1291
1316
                        edecl['attrspec'].append(dm)
1296
1321
                                        % (ename,dm1,dm))
1297
1322
                                break
1298
1323
 
1299
 
                if d1.has_key('len'):
 
1324
                if 'len' in d1:
1300
1325
                    if typespec in ['complex','integer','logical','real']:
1301
 
                        if (not edecl.has_key('kindselector')) or (not edecl['kindselector']):
 
1326
                        if ('kindselector' not in edecl) or (not edecl['kindselector']):
1302
1327
                            edecl['kindselector']={}
1303
1328
                        edecl['kindselector']['*']=d1['len']
1304
1329
                    elif typespec == 'character':
1305
 
                        if (not edecl.has_key('charselector')) or (not edecl['charselector']): edecl['charselector']={}
1306
 
                        if edecl['charselector'].has_key('len'): del edecl['charselector']['len']
 
1330
                        if ('charselector' not in edecl) or (not edecl['charselector']):
 
1331
                            edecl['charselector']={}
 
1332
                        if 'len' in edecl['charselector']:
 
1333
                            del edecl['charselector']['len']
1307
1334
                        edecl['charselector']['*']=d1['len']
1308
 
                if d1.has_key('init'):
1309
 
                    if edecl.has_key('=') and (not edecl['=']==d1['init']):
 
1335
                if 'init' in d1:
 
1336
                    if '=' in edecl and (not edecl['=']==d1['init']):
1310
1337
                        outmess('updatevars: attempt to change the init expression of "%s" ("%s") to "%s". Ignoring.\n' % (ename,edecl['='],d1['init']))
1311
1338
                    else:
1312
1339
                        edecl['=']=d1['init']
1313
1340
            else:
1314
1341
                outmess('updatevars: could not crack entity declaration "%s". Ignoring.\n'%(ename+m.group('after')))
1315
1342
        for k in edecl.keys():
1316
 
            if not edecl[k]: del edecl[k]
 
1343
            if not edecl[k]:
 
1344
                del edecl[k]
1317
1345
        groupcache[groupcounter]['vars'][ename]=edecl
1318
 
        if groupcache[groupcounter].has_key('varnames'):
 
1346
        if 'varnames' in groupcache[groupcounter]:
1319
1347
            groupcache[groupcounter]['varnames'].append(ename)
1320
1348
        last_name = ename
1321
1349
    return last_name
1367
1395
    return kindselect,charselect,typename
1368
1396
######
1369
1397
def setattrspec(decl,attr,force=0):
1370
 
    if not decl: decl={}
1371
 
    if not attr: return decl
1372
 
    if not decl.has_key('attrspec'):
 
1398
    if not decl:
 
1399
        decl={}
 
1400
    if not attr:
 
1401
        return decl
 
1402
    if 'attrspec' not in decl:
1373
1403
        decl['attrspec']=[attr]
1374
1404
        return decl
1375
1405
    if force: decl['attrspec'].append(attr)
1385
1415
    else:
1386
1416
        decl['attrspec'].append(attr)
1387
1417
    return decl
 
1418
 
1388
1419
def setkindselector(decl,sel,force=0):
1389
 
    if not decl: decl={}
1390
 
    if not sel: return decl
1391
 
    if not decl.has_key('kindselector'):
 
1420
    if not decl:
 
1421
        decl={}
 
1422
    if not sel:
 
1423
        return decl
 
1424
    if 'kindselector' not in decl:
1392
1425
        decl['kindselector']=sel
1393
1426
        return decl
1394
1427
    for k in sel.keys():
1395
 
        if force or not decl['kindselector'].has_key(k):
 
1428
        if force or k not in decl['kindselector']:
1396
1429
            decl['kindselector'][k]=sel[k]
1397
1430
    return decl
 
1431
 
1398
1432
def setcharselector(decl,sel,force=0):
1399
 
    if not decl: decl={}
1400
 
    if not sel: return decl
1401
 
    if not decl.has_key('charselector'):
 
1433
    if not decl:
 
1434
        decl={}
 
1435
    if not sel:
 
1436
        return decl
 
1437
    if 'charselector' not in decl:
1402
1438
        decl['charselector']=sel
1403
1439
        return decl
1404
1440
    for k in sel.keys():
1405
 
        if force or not decl['charselector'].has_key(k):
 
1441
        if force or k not in decl['charselector']:
1406
1442
            decl['charselector'][k]=sel[k]
1407
1443
    return decl
 
1444
 
1408
1445
def getblockname(block,unknown='unknown'):
1409
 
    if block.has_key('name'): return block['name']
 
1446
    if 'name' in block:
 
1447
        return block['name']
1410
1448
    return unknown
 
1449
 
1411
1450
###### post processing
 
1451
 
1412
1452
def setmesstext(block):
1413
1453
    global filepositiontext
1414
 
    try: filepositiontext='In: %s:%s\n'%(block['from'],block['name'])
1415
 
    except: pass
 
1454
    try:
 
1455
        filepositiontext='In: %s:%s\n'%(block['from'],block['name'])
 
1456
    except:
 
1457
        pass
1416
1458
 
1417
1459
def get_usedict(block):
1418
1460
    usedict = {}
1419
 
    if block.has_key('parent_block'):
 
1461
    if 'parent_block' in block:
1420
1462
        usedict = get_usedict(block['parent_block'])
1421
 
    if block.has_key('use'):
 
1463
    if 'use' in block:
1422
1464
        usedict.update(block['use'])
1423
1465
    return usedict
1424
1466
 
1430
1472
    if not usedict:
1431
1473
        return param_map
1432
1474
    for usename,mapping in usedict.items():
1433
 
        usename = string.lower(usename)
1434
 
        if not f90modulevars.has_key(usename):
 
1475
        usename = usename.lower()
 
1476
        if usename not in f90modulevars:
1435
1477
            continue
1436
1478
        mvars = f90modulevars[usename]
1437
1479
        params = get_parameters(mvars)
1441
1483
        if mapping:
1442
1484
            errmess('get_useparameters: mapping for %s not impl.' % (mapping))
1443
1485
        for k,v in params.items():
1444
 
            if param_map.has_key(k):
 
1486
            if k in param_map:
1445
1487
                outmess('get_useparameters: overriding parameter %s with'\
1446
1488
                        ' value from module %s' % (`k`,`usename`))
1447
1489
            param_map[k] = v
1463
1505
    if param_map is None:
1464
1506
        param_map = get_useparameters(block)
1465
1507
 
1466
 
    if param_map is not None and block.has_key('vars'):
 
1508
    if param_map is not None and 'vars' in block:
1467
1509
        vars = block['vars']
1468
1510
        for n in vars.keys():
1469
1511
            var = vars[n]
1470
 
            if var.has_key('kindselector'):
 
1512
            if 'kindselector' in var:
1471
1513
                kind = var['kindselector']
1472
 
                if kind.has_key('kind'):
 
1514
                if 'kind' in kind:
1473
1515
                    val = kind['kind']
1474
 
                    if param_map.has_key(val):
 
1516
                    if val in param_map:
1475
1517
                        kind['kind'] = param_map[val]
1476
1518
    new_body = []
1477
1519
    for b in block['body']:
1494
1536
        for g in block:
1495
1537
            setmesstext(g)
1496
1538
            g=postcrack(g,tab=tab+'\t')
1497
 
            if g.has_key('name') and string.find(g['name'],'__user__')>=0: # sort user routines to appear first
 
1539
            if 'name' in g and '__user__' in g['name']: # sort user routines to appear first
1498
1540
                uret.append(g)
1499
1541
            else:
1500
1542
                gret.append(g)
1501
1543
        return uret+gret
1502
1544
    setmesstext(block)
1503
 
    if (not type(block)==types.DictType) and not block.has_key('block'):
 
1545
    if (not type(block)==types.DictType) and 'block' not in block:
1504
1546
        raise 'postcrack: Expected block dictionary instead of ',block
1505
 
    if block.has_key('name') and not block['name']=='unknown_interface':
 
1547
    if 'name' in block and not block['name']=='unknown_interface':
1506
1548
        outmess('%sBlock: %s\n'%(tab,block['name']),0)
1507
1549
    blocktype=block['block']
1508
1550
    block=analyzeargs(block)
1509
1551
    block=analyzecommon(block)
1510
1552
    block['vars']=analyzevars(block)
1511
1553
    block['sortvars']=sortvarnames(block['vars'])
1512
 
    if block.has_key('args') and block['args']:
 
1554
    if 'args' in block and block['args']:
1513
1555
        args=block['args']
1514
1556
    block['body']=analyzebody(block,args,tab=tab)
1515
1557
 
1516
1558
    userisdefined=[]
1517
1559
##     fromuser = []
1518
 
    if block.has_key('use'):
 
1560
    if 'use' in block:
1519
1561
        useblock=block['use']
1520
1562
        for k in useblock.keys():
1521
 
            if string.find(k,'__user__')>=0:
 
1563
            if '__user__' in k:
1522
1564
                userisdefined.append(k)
1523
 
##                 if useblock[k].has_key('map'):
 
1565
##                 if 'map' in useblock[k]:
1524
1566
##                     for n in useblock[k]['map'].values():
1525
1567
##                         if n not in fromuser: fromuser.append(n)
1526
1568
    else: useblock={}
1527
1569
    name=''
1528
 
    if block.has_key('name'):name=block['name']
1529
 
    if block.has_key('externals') and block['externals']:# and not userisdefined: # Build a __user__ module
 
1570
    if 'name' in block:
 
1571
        name=block['name']
 
1572
    if 'externals' in block and block['externals']:# and not userisdefined: # Build a __user__ module
1530
1573
        interfaced=[]
1531
 
        if block.has_key('interfaced'): interfaced=block['interfaced']
 
1574
        if 'interfaced' in block:
 
1575
            interfaced=block['interfaced']
1532
1576
        mvars=copy.copy(block['vars'])
1533
 
        if name: mname=name+'__user__routines'
1534
 
        else: mname='unknown__user__routines'
 
1577
        if name:
 
1578
            mname=name+'__user__routines'
 
1579
        else:
 
1580
            mname='unknown__user__routines'
1535
1581
        if mname in userisdefined:
1536
1582
            i=1
1537
1583
            while '%s_%i'%(mname,i) in userisdefined: i=i+1
1550
1596
                        i=-1
1551
1597
                        for bb in b['body']:
1552
1598
                            i=i+1
1553
 
                            if bb.has_key('name') and bb['name']==e:
 
1599
                            if 'name' in bb and bb['name']==e:
1554
1600
                                edef=copy.copy(bb)
1555
1601
                                del b['body'][i]
1556
1602
                                break
1560
1606
                            break
1561
1607
                interface['body'].append(edef)
1562
1608
            else:
1563
 
                if mvars.has_key(e) and not isexternal(mvars[e]):
 
1609
                if e in mvars and not isexternal(mvars[e]):
1564
1610
                    interface['vars'][e]=mvars[e]
1565
1611
        if interface['vars'] or interface['body']:
1566
1612
            block['interfaced']=interfaced
1575
1621
    indep = []
1576
1622
    dep = []
1577
1623
    for v in vars.keys():
1578
 
        if vars[v].has_key('depend') and vars[v]['depend']:
 
1624
        if 'depend' in vars[v] and vars[v]['depend']:
1579
1625
            dep.append(v)
1580
1626
            #print '%s depends on %s'%(v,vars[v]['depend'])
1581
1627
        else: indep.append(v)
1594
1640
            if i>n:
1595
1641
                errmess('sortvarnames: failed to compute dependencies because'
1596
1642
                        ' of cyclic dependencies between '
1597
 
                        +string.join(dep,', ')+'\n')
 
1643
                        +', '.join(dep)+'\n')
1598
1644
                indep = indep + dep
1599
1645
                break
1600
1646
        else:
1615
1661
            if m:
1616
1662
                dims=[]
1617
1663
                if m.group('dims'):
1618
 
                    dims=map(string.strip,string.split(markoutercomma(m.group('dims')),'@,@'))
1619
 
                n=string.strip(m.group('name'))
1620
 
                if block['vars'].has_key(n):
1621
 
                    if block['vars'][n].has_key('attrspec'):
1622
 
                        block['vars'][n]['attrspec'].append('dimension(%s)'%(string.join(dims,',')))
 
1664
                    dims=[x.strip() for x in markoutercomma(m.group('dims')).split('@,@')]
 
1665
                n=m.group('name').strip()
 
1666
                if n in block['vars']:
 
1667
                    if 'attrspec' in block['vars'][n]:
 
1668
                        block['vars'][n]['attrspec'].append('dimension(%s)'%(','.join(dims)))
1623
1669
                    else:
1624
 
                        block['vars'][n]['attrspec']=['dimension(%s)'%(string.join(dims,','))]
 
1670
                        block['vars'][n]['attrspec']=['dimension(%s)'%(','.join(dims))]
1625
1671
                else:
1626
1672
                    if dims:
1627
 
                        block['vars'][n]={'attrspec':['dimension(%s)'%(string.join(dims,','))]}
 
1673
                        block['vars'][n]={'attrspec':['dimension(%s)'%(','.join(dims))]}
1628
1674
                    else: block['vars'][n]={}
1629
1675
                if n not in commonvars: commonvars.append(n)
1630
1676
            else:
1632
1678
                errmess('analyzecommon: failed to extract "<name>[(<dims>)]" from "%s" in common /%s/.\n'%(e,k))
1633
1679
            comvars.append(n)
1634
1680
        block['common'][k]=comvars
1635
 
    if not block.has_key('commonvars'):
 
1681
    if 'commonvars' not in block:
1636
1682
        block['commonvars']=commonvars
1637
1683
    else:
1638
1684
        block['commonvars']=block['commonvars']+commonvars
1639
1685
    return block
 
1686
 
1640
1687
def analyzebody(block,args,tab=''):
1641
1688
    global usermodules,skipfuncs,onlyfuncs,f90modulevars
1642
1689
    setmesstext(block)
1655
1702
        else: as_=args
1656
1703
        b=postcrack(b,as_,tab=tab+'\t')
1657
1704
        if b['block']=='interface' and not b['body']:
1658
 
            if not b.has_key('f2pyenhancements'):
 
1705
            if 'f2pyenhancements' not in b:
1659
1706
                continue
1660
 
        if string.replace(b['block'],' ','')=='pythonmodule':
 
1707
        if b['block'].replace(' ','')=='pythonmodule':
1661
1708
            usermodules.append(b)
1662
1709
        else:
1663
1710
            if b['block']=='module':
1664
1711
                f90modulevars[b['name']] = b['vars']
1665
1712
            body.append(b)
1666
1713
    return body
 
1714
 
1667
1715
def buildimplicitrules(block):
1668
1716
    setmesstext(block)
1669
1717
    implicitrules=defaultimplicitrules
1670
1718
    attrrules={}
1671
 
    if block.has_key('implicit'):
 
1719
    if 'implicit' in block:
1672
1720
        if block['implicit'] is None:
1673
1721
            implicitrules=None
1674
1722
            if verbose>1:
1685
1733
    r = eval(e,g,l)
1686
1734
    if type(r) in [type(0),type(0.0)]:
1687
1735
        return r
1688
 
    raise ValueError,'r=%r' % (r)
 
1736
    raise ValueError('r=%r' % (r))
1689
1737
 
1690
1738
getlincoef_re_1 = re.compile(r'\A\b\w+\b\Z',re.I)
1691
1739
def getlincoef(e,xset): # e = a*x+b ; x in xset
1698
1746
    len_e = len(e)
1699
1747
    for x in xset:
1700
1748
        if len(x)>len_e: continue
 
1749
        if re.search(r'\w\s*\([^)]*\b'+x+r'\b', e):
 
1750
            # skip function calls having x as an argument, e.g max(1, x)
 
1751
            continue
1701
1752
        re_1 = re.compile(r'(?P<before>.*?)\b'+x+r'\b(?P<after>.*)',re.I)
1702
1753
        m = re_1.match(e)
1703
1754
        if m:
1717
1768
                    ee = '%s(%s)%s'%(m1.group('before'),0.5,m1.group('after'))
1718
1769
                    m1 = re_1.match(ee)
1719
1770
                c = myeval(ee,{},{})
1720
 
                if (a*0.5+b==c):
 
1771
                # computing another point to be sure that expression is linear
 
1772
                m1 = re_1.match(e)
 
1773
                while m1:
 
1774
                    ee = '%s(%s)%s'%(m1.group('before'),1.5,m1.group('after'))
 
1775
                    m1 = re_1.match(ee)
 
1776
                c2 = myeval(ee,{},{})
 
1777
                if (a*0.5+b==c and a*1.5+b==c2):
1721
1778
                    return a,b,x
1722
1779
            except: pass
1723
1780
            break
1828
1885
word_pattern = re.compile(r'\b[a-z][\w$]*\b',re.I)
1829
1886
 
1830
1887
def _get_depend_dict(name, vars, deps):
1831
 
    if vars.has_key(name):
 
1888
    if name in vars:
1832
1889
        words = vars[name].get('depend',[])
1833
1890
 
1834
 
        if vars[name].has_key('=') and not isstring(vars[name]):
 
1891
        if '=' in vars[name] and not isstring(vars[name]):
1835
1892
            for word in word_pattern.findall(vars[name]['=']):
1836
 
                if word not in words and vars.has_key(word):
 
1893
                if word not in words and word in vars:
1837
1894
                    words.append(word)
1838
1895
        for word in words[:]:
1839
1896
            for w in deps.get(word,[]) \
1864
1921
            del depend_dict[name]
1865
1922
    while depend_dict:
1866
1923
        for name, lst in depend_dict.items():
1867
 
            new_lst = [n for n in lst if depend_dict.has_key(n)]
 
1924
            new_lst = [n for n in lst if n in depend_dict]
1868
1925
            if not new_lst:
1869
1926
                names.append(name)
1870
1927
                del depend_dict[name]
1871
1928
            else:
1872
1929
                depend_dict[name] = new_lst
1873
 
    return [name for name in names if vars.has_key(name)]
 
1930
    return [name for name in names if name in vars]
1874
1931
 
1875
1932
def _kind_func(string):
1876
1933
    #XXX: return something sensible.
1898
1955
    for name,func in [('kind',_kind_func),
1899
1956
                      ('selected_int_kind',_selected_int_kind_func),
1900
1957
                      ]:
1901
 
        if not g_params.has_key(name):
 
1958
        if name not in g_params:
1902
1959
            g_params[name] = func
1903
1960
    param_names = []
1904
1961
    for n in get_sorted_names(vars):
1905
 
        if vars[n].has_key('attrspec') and 'parameter' in vars[n]['attrspec']:
 
1962
        if 'attrspec' in vars[n] and 'parameter' in vars[n]['attrspec']:
1906
1963
            param_names.append(n)
1907
1964
    kind_re = re.compile(r'\bkind\s*\(\s*(?P<value>.*)\s*\)',re.I)
1908
1965
    selected_int_kind_re = re.compile(r'\bselected_int_kind\s*\(\s*(?P<value>.*)\s*\)',re.I)
1909
1966
    for n in param_names:
1910
 
        if vars[n].has_key('='):
 
1967
        if '=' in vars[n]:
1911
1968
            v = vars[n]['=']
1912
1969
            if islogical(vars[n]):
1913
1970
                v = v.lower()
1926
1983
                for m in real16pattern.finditer(v):
1927
1984
                    tt[m.start():m.end()] = list(\
1928
1985
                            v[m.start():m.end()].lower().replace('d', 'e'))
1929
 
                v = string.join(tt,'')
 
1986
                v = ''.join(tt)
1930
1987
            if iscomplex(vars[n]):
1931
1988
                if v[0]=='(' and v[-1]==')':
1932
1989
                    l = markoutercomma(v[1:-1]).split('@,@')
1939
1996
                outmess('get_parameters: got "%s" on %s\n' % (msg,`v`))
1940
1997
            if isstring(vars[n]) and type(params[n]) is type(0):
1941
1998
                params[n] = chr(params[n])
1942
 
            nl = string.lower(n)
 
1999
            nl = n.lower()
1943
2000
            if nl!=n:
1944
2001
                params[nl] = params[n]
1945
2002
        else:
1972
2029
    setmesstext(block)
1973
2030
    implicitrules,attrrules=buildimplicitrules(block)
1974
2031
    vars=copy.copy(block['vars'])
1975
 
    if block['block']=='function' and not vars.has_key(block['name']):
 
2032
    if block['block']=='function' and block['name'] not in vars:
1976
2033
        vars[block['name']]={}
1977
 
    if block['vars'].has_key(''):
 
2034
    if '' in block['vars']:
1978
2035
        del vars['']
1979
 
        if block['vars'][''].has_key('attrspec'):
 
2036
        if 'attrspec' in block['vars']['']:
1980
2037
            gen=block['vars']['']['attrspec']
1981
2038
            for n in vars.keys():
1982
2039
                for k in ['public','private']:
2008
2065
    for n in svars:
2009
2066
        if n[0] in attrrules.keys():
2010
2067
            vars[n]=setattrspec(vars[n],attrrules[n[0]])
2011
 
        if not vars[n].has_key('typespec'):
2012
 
            if not(vars[n].has_key('attrspec') and 'external' in vars[n]['attrspec']):
 
2068
        if 'typespec' not in vars[n]:
 
2069
            if not('attrspec' in vars[n] and 'external' in vars[n]['attrspec']):
2013
2070
                if implicitrules:
2014
 
                    ln0 = string.lower(n[0])
 
2071
                    ln0 = n[0].lower()
2015
2072
                    for k in implicitrules[ln0].keys():
2016
2073
                        if k=='typespec' and implicitrules[ln0][k]=='undefined':
2017
2074
                            continue
2018
 
                        if not vars[n].has_key(k):
 
2075
                        if k not in vars[n]:
2019
2076
                            vars[n][k]=implicitrules[ln0][k]
2020
2077
                        elif k=='attrspec':
2021
2078
                            for l in implicitrules[ln0][k]:
2023
2080
                elif n in block['args']:
2024
2081
                    outmess('analyzevars: typespec of variable %s is not defined in routine %s.\n'%(`n`,block['name']))
2025
2082
 
2026
 
        if vars[n].has_key('charselector'):
2027
 
            if vars[n]['charselector'].has_key('len'):
 
2083
        if 'charselector' in vars[n]:
 
2084
            if 'len' in vars[n]['charselector']:
2028
2085
                l = vars[n]['charselector']['len']
2029
2086
                try:
2030
2087
                    l = str(eval(l,{},params))
2032
2089
                    pass
2033
2090
                vars[n]['charselector']['len'] = l
2034
2091
 
2035
 
        if vars[n].has_key('kindselector'):
2036
 
            if vars[n]['kindselector'].has_key('kind'):
 
2092
        if 'kindselector' in vars[n]:
 
2093
            if 'kind' in vars[n]['kindselector']:
2037
2094
                l = vars[n]['kindselector']['kind']
2038
2095
                try:
2039
2096
                    l = str(eval(l,{},params))
2042
2099
                vars[n]['kindselector']['kind'] = l
2043
2100
 
2044
2101
        savelindims = {}
2045
 
        if vars[n].has_key('attrspec'):
 
2102
        if 'attrspec' in vars[n]:
2046
2103
            attr=vars[n]['attrspec']
2047
2104
            attr.reverse()
2048
2105
            vars[n]['attrspec']=[]
2049
2106
            dim,intent,depend,check,note=None,None,None,None,None
2050
2107
            for a in attr:
2051
 
                if a[:9]=='dimension': dim=(string.strip(a[9:]))[1:-1]
2052
 
                elif a[:6]=='intent': intent=(string.strip(a[6:]))[1:-1]
2053
 
                elif a[:6]=='depend': depend=(string.strip(a[6:]))[1:-1]
2054
 
                elif a[:5]=='check': check=(string.strip(a[5:]))[1:-1]
2055
 
                elif a[:4]=='note': note=(string.strip(a[4:]))[1:-1]
 
2108
                if a[:9]=='dimension': dim=(a[9:].strip())[1:-1]
 
2109
                elif a[:6]=='intent': intent=(a[6:].strip())[1:-1]
 
2110
                elif a[:6]=='depend': depend=(a[6:].strip())[1:-1]
 
2111
                elif a[:5]=='check': check=(a[5:].strip())[1:-1]
 
2112
                elif a[:4]=='note': note=(a[4:].strip())[1:-1]
2056
2113
                else: vars[n]=setattrspec(vars[n],a)
2057
2114
                if intent:
2058
 
                    if not vars[n].has_key('intent'): vars[n]['intent']=[]
2059
 
                    for c in map(string.strip,string.split(markoutercomma(intent),'@,@')):
 
2115
                    if 'intent' not in vars[n]:
 
2116
                        vars[n]['intent']=[]
 
2117
                    for c in [x.strip() for x in markoutercomma(intent).split('@,@')]:
2060
2118
                        if not c in vars[n]['intent']:
2061
2119
                            vars[n]['intent'].append(c)
2062
2120
                    intent=None
2063
2121
                if note:
2064
 
                    note=string.replace(note,'\\n\\n','\n\n')
2065
 
                    note=string.replace(note,'\\n ','\n')
2066
 
                    if not vars[n].has_key('note'): vars[n]['note']=[note]
2067
 
                    else: vars[n]['note'].append(note)
 
2122
                    note=note.replace('\\n\\n','\n\n')
 
2123
                    note=note.replace('\\n ','\n')
 
2124
                    if 'note' not in vars[n]:
 
2125
                        vars[n]['note']=[note]
 
2126
                    else:
 
2127
                        vars[n]['note'].append(note)
2068
2128
                    note=None
2069
2129
                if depend is not None:
2070
 
                    if not vars[n].has_key('depend'): vars[n]['depend']=[]
2071
 
                    for c in rmbadname(map(string.strip,string.split(markoutercomma(depend),'@,@'))):
 
2130
                    if 'depend' not in vars[n]:
 
2131
                        vars[n]['depend']=[]
 
2132
                    for c in rmbadname([x.strip() for x in markoutercomma(depend).split('@,@')]):
2072
2133
                        if c not in vars[n]['depend']:
2073
2134
                            vars[n]['depend'].append(c)
2074
2135
                    depend=None
2075
2136
                if check is not None:
2076
 
                    if not vars[n].has_key('check'): vars[n]['check']=[]
2077
 
                    for c in map(string.strip,string.split(markoutercomma(check),'@,@')):
 
2137
                    if 'check' not in vars[n]:
 
2138
                        vars[n]['check']=[]
 
2139
                    for c in [x.strip() for x in markoutercomma(check).split('@,@')]:
2078
2140
                        if not c in vars[n]['check']:
2079
2141
                            vars[n]['check'].append(c)
2080
2142
                    check=None
2081
 
            if dim and not vars[n].has_key('dimension'):
 
2143
            if dim and 'dimension' not in vars[n]:
2082
2144
                vars[n]['dimension']=[]
2083
 
                for d in rmbadname(map(string.strip,string.split(markoutercomma(dim),'@,@'))):
 
2145
                for d in rmbadname([x.strip() for x in markoutercomma(dim).split('@,@')]):
2084
2146
                    star = '*'
2085
 
                    if d==':': star=':'
2086
 
                    if params.has_key(d):
 
2147
                    if d==':':
 
2148
                        star=':'
 
2149
                    if d in params:
2087
2150
                        d = str(params[d])
2088
2151
                    for p in params.keys():
2089
2152
                        m = re.match(r'(?P<before>.*?)\b'+p+r'\b(?P<after>.*)',d,re.I)
2093
2156
                    if d==star:
2094
2157
                        dl = [star]
2095
2158
                    else:
2096
 
                        dl=string.split(markoutercomma(d,':'),'@:@')
 
2159
                        dl=markoutercomma(d,':').split('@:@')
2097
2160
                    if len(dl)==2 and '*' in dl: # e.g. dimension(5:*)
2098
2161
                        dl = ['*']
2099
2162
                        d = '*'
2104
2167
                        if di and di[-4:] == '/(1)': di = di[:-4]
2105
2168
                        if v: savelindims[d] = v,di
2106
2169
                    vars[n]['dimension'].append(d)
2107
 
        if vars[n].has_key('dimension'):
 
2170
        if 'dimension' in vars[n]:
2108
2171
            if isintent_c(vars[n]):
2109
2172
                shape_macro = 'shape'
2110
2173
            else:
2111
2174
                shape_macro = 'shape'#'fshape'
2112
2175
            if isstringarray(vars[n]):
2113
 
                if vars[n].has_key('charselector'):
 
2176
                if 'charselector' in vars[n]:
2114
2177
                    d = vars[n]['charselector']
2115
 
                    if d.has_key('*'):
 
2178
                    if '*' in d:
2116
2179
                        d = d['*']
2117
2180
                        errmess('analyzevars: character array "character*%s %s(%s)" is considered as "character %s(%s)"; "intent(c)" is forced.\n'\
2118
2181
                                %(d,n,
2120
2183
                                  n,','.join(vars[n]['dimension']+[d])))
2121
2184
                        vars[n]['dimension'].append(d)
2122
2185
                        del vars[n]['charselector']
2123
 
                        if not vars[n].has_key('intent'):
 
2186
                        if 'intent' not in vars[n]:
2124
2187
                            vars[n]['intent'] = []
2125
2188
                        if 'c' not in vars[n]['intent']:
2126
2189
                            vars[n]['intent'].append('c')
2127
2190
                    else:
2128
2191
                        errmess("analyzevars: charselector=%r unhandled." % (d))
2129
 
        if not vars[n].has_key('check') and block.has_key('args') and n in block['args']:
2130
 
            flag=not vars[n].has_key('depend')
2131
 
            if flag: vars[n]['depend']=[]
 
2192
        if 'check' not in vars[n] and 'args' in block and n in block['args']:
 
2193
            flag = 'depend' not in vars[n]
 
2194
            if flag:
 
2195
                vars[n]['depend']=[]
2132
2196
            vars[n]['check']=[]
2133
 
            if vars[n].has_key('dimension'):
 
2197
            if 'dimension' in vars[n]:
2134
2198
                #/----< no check
2135
2199
                #vars[n]['check'].append('rank(%s)==%s'%(n,len(vars[n]['dimension'])))
2136
2200
                i=-1; ni=len(vars[n]['dimension'])
2139
2203
                    ad=''
2140
2204
                    pd=''
2141
2205
                    #origd = d
2142
 
                    if not vars.has_key(d):
2143
 
                        if savelindims.has_key(d):
 
2206
                    if d not in vars:
 
2207
                        if d in savelindims:
2144
2208
                            pd,ad='(',savelindims[d][1]
2145
2209
                            d = savelindims[d][0]
2146
2210
                        else:
2147
2211
                            for r in block['args']:
2148
2212
                            #for r in block['vars'].keys():
2149
 
                                if not vars.has_key(r): continue
 
2213
                                if r not in vars:
 
2214
                                    continue
2150
2215
                                if re.match(r'.*?\b'+r+r'\b',d,re.I):
2151
2216
                                    ddeps.append(r)
2152
 
                    if vars.has_key(d):
2153
 
                        if vars[d].has_key('attrspec'):
 
2217
                    if d in vars:
 
2218
                        if 'attrspec' in vars[d]:
2154
2219
                            for aa in vars[d]['attrspec']:
2155
2220
                                if aa[:6]=='depend':
2156
 
                                    ddeps=ddeps+string.split((string.strip(aa[6:]))[1:-1],',')
2157
 
                        if vars[d].has_key('depend'):
 
2221
                                    ddeps += aa[6:].strip()[1:-1].split(',')
 
2222
                        if 'depend' in vars[d]:
2158
2223
                            ddeps=ddeps+vars[d]['depend']
2159
2224
                    i=i+1
2160
 
                    if vars.has_key(d) and (not vars[d].has_key('depend')) \
2161
 
                       and (not vars[d].has_key('=')) and (d not in vars[n]['depend']) \
2162
 
                       and l_or(isintent_in,isintent_inout,isintent_inplace)(vars[n]):
 
2225
                    if d in vars and ('depend' not in vars[d]) \
 
2226
                       and ('=' not in vars[d]) and (d not in vars[n]['depend']) \
 
2227
                       and l_or(isintent_in, isintent_inout, isintent_inplace)(vars[n]):
2163
2228
                        vars[d]['depend']=[n]
2164
2229
                        if ni>1:
2165
2230
                            vars[d]['=']='%s%s(%s,%s)%s'% (pd,shape_macro,n,i,ad)
2166
2231
                        else:
2167
2232
                            vars[d]['=']='%slen(%s)%s'% (pd,n,ad)
2168
2233
                        #  /---< no check
2169
 
                        if 1 and not vars[d].has_key('check'):
 
2234
                        if 1 and 'check' not in vars[d]:
2170
2235
                            if ni>1:
2171
2236
                                vars[d]['check']=['%s%s(%s,%i)%s==%s'\
2172
2237
                                                  %(pd,shape_macro,n,i,ad,d)]
2173
2238
                            else:
2174
2239
                                vars[d]['check']=['%slen(%s)%s>=%s'%(pd,n,ad,d)]
2175
 
                        if not vars[d].has_key('attrspec'): vars[d]['attrspec']=['optional']
 
2240
                        if 'attrspec' not in vars[d]:
 
2241
                            vars[d]['attrspec']=['optional']
2176
2242
                        if ('optional' not in vars[d]['attrspec']) and\
2177
2243
                           ('required' not in vars[d]['attrspec']):
2178
2244
                            vars[d]['attrspec'].append('optional')
2181
2247
                        #if ni>1: vars[n]['check'].append('shape(%s,%i)==%s'%(n,i,d))
2182
2248
                        #else: vars[n]['check'].append('len(%s)>=%s'%(n,d))
2183
2249
                        if flag:
2184
 
                            if vars.has_key(d):
 
2250
                            if d in vars:
2185
2251
                                if n not in ddeps:
2186
2252
                                    vars[n]['depend'].append(d)
2187
2253
                            else:
2188
2254
                                vars[n]['depend'] = vars[n]['depend'] + ddeps
2189
2255
            elif isstring(vars[n]):
2190
2256
                length='1'
2191
 
                if vars[n].has_key('charselector'):
2192
 
                    if vars[n]['charselector'].has_key('*'):
 
2257
                if 'charselector' in vars[n]:
 
2258
                    if '*' in vars[n]['charselector']:
2193
2259
                        length = _eval_length(vars[n]['charselector']['*'],
2194
2260
                                              params)
2195
2261
                        vars[n]['charselector']['*']=length
2196
 
                    elif vars[n]['charselector'].has_key('len'):
 
2262
                    elif 'len' in vars[n]['charselector']:
2197
2263
                        length = _eval_length(vars[n]['charselector']['len'],
2198
2264
                                              params)
2199
2265
                        del vars[n]['charselector']['len']
2200
2266
                        vars[n]['charselector']['*']=length
2201
2267
 
2202
 
            if not vars[n]['check']: del vars[n]['check']
2203
 
            if flag and not vars[n]['depend']: del vars[n]['depend']
2204
 
        if vars[n].has_key('='):
2205
 
            if not vars[n].has_key('attrspec'): vars[n]['attrspec']=[]
 
2268
            if not vars[n]['check']:
 
2269
                del vars[n]['check']
 
2270
            if flag and not vars[n]['depend']:
 
2271
                del vars[n]['depend']
 
2272
        if '=' in vars[n]:
 
2273
            if 'attrspec' not in vars[n]:
 
2274
                vars[n]['attrspec']=[]
2206
2275
            if ('optional' not in vars[n]['attrspec']) and \
2207
2276
               ('required' not in vars[n]['attrspec']):
2208
2277
                vars[n]['attrspec'].append('optional')
2209
 
            if not vars[n].has_key('depend'):
 
2278
            if 'depend' not in vars[n]:
2210
2279
                vars[n]['depend']=[]
2211
2280
                for v,m in dep_matches.items():
2212
2281
                    if m(vars[n]['=']): vars[n]['depend'].append(v)
2216
2285
 
2217
2286
    for n in vars.keys():
2218
2287
        if n==block['name']: # n is block name
2219
 
            if vars[n].has_key('note'):
 
2288
            if 'note' in vars[n]:
2220
2289
                block['note']=vars[n]['note']
2221
2290
            if block['block']=='function':
2222
 
                if block.has_key('result') and vars.has_key(block['result']):
 
2291
                if 'result' in block and block['result'] in vars:
2223
2292
                    vars[n]=appenddecl(vars[n],vars[block['result']])
2224
 
                if block.has_key('prefix'):
 
2293
                if 'prefix' in block:
2225
2294
                    pr=block['prefix']; ispure=0; isrec=1
2226
 
                    pr1=string.replace(pr,'pure','')
 
2295
                    pr1=pr.replace('pure','')
2227
2296
                    ispure=(not pr==pr1)
2228
 
                    pr=string.replace(pr1,'recursive','')
 
2297
                    pr=pr1.replace('recursive','')
2229
2298
                    isrec=(not pr==pr1)
2230
2299
                    m=typespattern[0].match(pr)
2231
2300
                    if m:
2233
2302
                        kindselect,charselect,typename=cracktypespec(typespec,selector)
2234
2303
                        vars[n]['typespec']=typespec
2235
2304
                        if kindselect:
2236
 
                            if kindselect.has_key('kind'):
 
2305
                            if 'kind' in kindselect:
2237
2306
                                try:
2238
2307
                                    kindselect['kind'] = eval(kindselect['kind'],{},params)
2239
2308
                                except:
2246
2315
                    else:
2247
2316
                        outmess('analyzevars: prefix (%s) were not used\n'%`block['prefix']`)
2248
2317
    if not block['block'] in ['module','pythonmodule','python module','block data']:
2249
 
        if block.has_key('commonvars'):
 
2318
        if 'commonvars' in block:
2250
2319
            neededvars=copy.copy(block['args']+block['commonvars'])
2251
2320
        else:
2252
2321
            neededvars=copy.copy(block['args'])
2253
2322
        for n in vars.keys():
2254
2323
            if l_or(isintent_callback,isintent_aux)(vars[n]):
2255
2324
                neededvars.append(n)
2256
 
        if block.has_key('entry'):
 
2325
        if 'entry' in block:
2257
2326
            neededvars.extend(block['entry'].keys())
2258
2327
            for k in block['entry'].keys():
2259
2328
                for n in block['entry'][k]:
2260
2329
                    if n not in neededvars:
2261
2330
                        neededvars.append(n)
2262
2331
        if block['block']=='function':
2263
 
            if block.has_key('result'):
 
2332
            if 'result' in block:
2264
2333
                neededvars.append(block['result'])
2265
2334
            else:
2266
2335
                neededvars.append(block['name'])
2267
2336
        if block['block'] in ['subroutine','function']:
2268
2337
            name = block['name']
2269
 
            if vars.has_key(name) and vars[name].has_key('intent'):
 
2338
            if name in vars and 'intent' in vars[name]:
2270
2339
                block['intent'] = vars[name]['intent']
2271
2340
        if block['block'] == 'type':
2272
2341
            neededvars.extend(vars.keys())
2274
2343
            if n not in neededvars:
2275
2344
                del vars[n]
2276
2345
    return vars
 
2346
 
2277
2347
analyzeargs_re_1 = re.compile(r'\A[a-z]+[\w$]*\Z',re.I)
2278
2348
def analyzeargs(block):
2279
2349
    setmesstext(block)
2280
2350
    implicitrules,attrrules=buildimplicitrules(block)
2281
 
    if not block.has_key('args'): block['args']=[]
 
2351
    if 'args' not in block:
 
2352
        block['args']=[]
2282
2353
    args=[]
2283
2354
    re_1 = analyzeargs_re_1
2284
2355
    for a in block['args']:
2291
2362
            if na[-1]=='_': na=na+'e'
2292
2363
            else: na=na+'_e'
2293
2364
            a=na
2294
 
            while block['vars'].has_key(a) or a in block['args']: a=a+'r'
 
2365
            while a in block['vars'] or a in block['args']:
 
2366
                a=a+'r'
2295
2367
            block['vars'][a]=at
2296
2368
        args.append(a)
2297
 
        if not block['vars'].has_key(a):
 
2369
        if a not in block['vars']:
2298
2370
            block['vars'][a]={}
2299
 
        if block.has_key('externals') and a in block['externals']+block['interfaced']:
 
2371
        if 'externals' in block and a in block['externals']+block['interfaced']:
2300
2372
            block['vars'][a]=setattrspec(block['vars'][a],'external')
2301
2373
    block['args']=args
2302
2374
 
2303
 
    if block.has_key('entry'):
 
2375
    if 'entry' in block:
2304
2376
        for k,args1 in block['entry'].items():
2305
2377
            for a in args1:
2306
 
                if not block['vars'].has_key(a):
 
2378
                if a not in block['vars']:
2307
2379
                    block['vars'][a]={}
2308
2380
 
2309
2381
    for b in block['body']:
2310
2382
        if b['name'] in args:
2311
 
            if not block.has_key('externals'): block['externals']=[]
 
2383
            if 'externals' not in block:
 
2384
                block['externals']=[]
2312
2385
            if b['name'] not in block['externals']:
2313
2386
                block['externals'].append(b['name'])
2314
 
    if block.has_key('result') and not block['vars'].has_key(block['result']):
 
2387
    if 'result' in block and block['result'] not in block['vars']:
2315
2388
        block['vars'][block['result']]={}
2316
2389
    return block
 
2390
 
2317
2391
determineexprtype_re_1 = re.compile(r'\A\(.+?[,].+?\)\Z',re.I)
2318
2392
determineexprtype_re_2 = re.compile(r'\A[+-]?\d+(_(P<name>[\w]+)|)\Z',re.I)
2319
2393
determineexprtype_re_3 = re.compile(r'\A[+-]?[\d.]+[\d+-de.]*(_(P<name>[\w]+)|)\Z',re.I)
2330
2404
    return r
2331
2405
 
2332
2406
def determineexprtype(expr,vars,rules={}):
2333
 
    if vars.has_key(expr):
 
2407
    if expr in vars:
2334
2408
        return _ensure_exprdict(vars[expr])
2335
 
    expr=string.strip(expr)
 
2409
    expr=expr.strip()
2336
2410
    if determineexprtype_re_1.match(expr):
2337
2411
        return {'typespec':'complex'}
2338
2412
    m=determineexprtype_re_2.match(expr)
2339
2413
    if m:
2340
 
        if m.groupdict().has_key('name') and m.group('name'):
 
2414
        if 'name' in m.groupdict() and m.group('name'):
2341
2415
            outmess('determineexprtype: selected kind types not supported (%s)\n'%`expr`)
2342
2416
        return {'typespec':'integer'}
2343
2417
    m = determineexprtype_re_3.match(expr)
2344
2418
    if m:
2345
 
        if m.groupdict().has_key('name') and m.group('name'):
 
2419
        if 'name' in m.groupdict() and m.group('name'):
2346
2420
            outmess('determineexprtype: selected kind types not supported (%s)\n'%`expr`)
2347
2421
        return {'typespec':'real'}
2348
2422
    for op in ['+','-','*','/']:
2349
 
        for e in map(string.strip,string.split(markoutercomma(expr,comma=op),'@'+op+'@')):
2350
 
            if vars.has_key(e):
 
2423
        for e in [x.strip() for x in markoutercomma(expr,comma=op).split('@'+op+'@')]:
 
2424
            if e in vars:
2351
2425
                return _ensure_exprdict(vars[e])
2352
2426
    t={}
2353
2427
    if determineexprtype_re_4.match(expr): # in parenthesis
2357
2431
        if m:
2358
2432
            rn=m.group('name')
2359
2433
            t=determineexprtype(m.group('name'),vars,rules)
2360
 
            if t and t.has_key('attrspec'): del t['attrspec']
 
2434
            if t and 'attrspec' in t:
 
2435
                del t['attrspec']
2361
2436
            if not t:
2362
 
                if rules.has_key(rn[0]):
 
2437
                if rn[0] in rules:
2363
2438
                    return _ensure_exprdict(rules[rn[0]])
2364
2439
    if expr[0] in '\'"':
2365
2440
        return {'typespec':'character','charselector':{'*':'*'}}
2366
2441
    if not t:
2367
2442
        outmess('determineexprtype: could not determine expressions (%s) type.\n'%(`expr`))
2368
2443
    return t
 
2444
 
2369
2445
######
2370
2446
def crack2fortrangen(block,tab='\n'):
2371
2447
    global skipfuncs, onlyfuncs
2386
2462
    blocktype=block['block']
2387
2463
    if blocktype=='program': return ''
2388
2464
    al=[]
2389
 
    if block.has_key('name'): name=block['name']
2390
 
    if block.has_key('args'):
 
2465
    if 'name' in block:
 
2466
        name=block['name']
 
2467
    if 'args' in block:
2391
2468
        vars = block['vars']
2392
2469
        al = [a for a in block['args'] if not isintent_callback(vars[a])]
2393
2470
        if block['block']=='function' or al:
2394
 
            args='(%s)'%string.join(al,',')
 
2471
            args='(%s)'%','.join(al)
2395
2472
    f2pyenhancements = ''
2396
 
    if block.has_key('f2pyenhancements'):
 
2473
    if 'f2pyenhancements' in block:
2397
2474
        for k in block['f2pyenhancements'].keys():
2398
2475
            f2pyenhancements = '%s%s%s %s'%(f2pyenhancements,tab+tabchar,k,block['f2pyenhancements'][k])
2399
2476
    intent_lst = block.get('intent',[])[:]
2402
2479
    if intent_lst:
2403
2480
        f2pyenhancements = '%s%sintent(%s) %s'%\
2404
2481
                           (f2pyenhancements,tab+tabchar,
2405
 
                            string.join(intent_lst,','),name)
 
2482
                            ','.join(intent_lst),name)
2406
2483
    use=''
2407
 
    if block.has_key('use'):
 
2484
    if 'use' in block:
2408
2485
        use=use2fortran(block['use'],tab+tabchar)
2409
2486
    common=''
2410
 
    if block.has_key('common'):
 
2487
    if 'common' in block:
2411
2488
        common=common2fortran(block['common'],tab+tabchar)
2412
2489
    if name=='unknown_interface': name=''
2413
2490
    result=''
2414
 
    if block.has_key('result'):
 
2491
    if 'result' in block:
2415
2492
        result=' result (%s)'%block['result']
2416
2493
        if block['result'] not in al:
2417
2494
            al.append(block['result'])
2418
 
    #if block.has_key('prefix'): prefix=block['prefix']+' '
 
2495
    #if 'prefix' in block:
 
2496
    #    prefix=block['prefix']+' '
2419
2497
    body=crack2fortrangen(block['body'],tab+tabchar)
2420
2498
    vars=vars2fortran(block,block['vars'],al,tab+tabchar)
2421
2499
    mess=''
2422
 
    if block.has_key('from'):
 
2500
    if 'from' in block:
2423
2501
        mess='! in %s'%block['from']
2424
 
    if block.has_key('entry'):
 
2502
    if 'entry' in block:
2425
2503
        entry_stmts = ''
2426
2504
        for k,i in block['entry'].items():
2427
2505
            entry_stmts = '%s%sentry %s(%s)' \
2428
 
                          % (entry_stmts,tab+tabchar,k,string.join(i,','))
 
2506
                          % (entry_stmts,tab+tabchar,k,','.join(i))
2429
2507
        body = body + entry_stmts
2430
2508
    if blocktype=='block data' and name=='_BLOCK_DATA_':
2431
2509
        name = ''
2432
2510
    ret='%s%s%s %s%s%s %s%s%s%s%s%s%send %s %s'%(tab,prefix,blocktype,name,args,result,mess,f2pyenhancements,use,vars,common,body,tab,blocktype,name)
2433
2511
    return ret
 
2512
 
2434
2513
def common2fortran(common,tab=''):
2435
2514
    ret=''
2436
2515
    for k in common.keys():
2437
2516
        if k=='_BLNK_':
2438
 
            ret='%s%scommon %s'%(ret,tab,string.join(common[k],','))
 
2517
            ret='%s%scommon %s'%(ret,tab,','.join(common[k]))
2439
2518
        else:
2440
 
            ret='%s%scommon /%s/ %s'%(ret,tab,k,string.join(common[k],','))
 
2519
            ret='%s%scommon /%s/ %s'%(ret,tab,k,','.join(common[k]))
2441
2520
    return ret
 
2521
 
2442
2522
def use2fortran(use,tab=''):
2443
2523
    ret=''
2444
2524
    for m in use.keys():
2446
2526
        if use[m]=={}:
2447
2527
            if ret and ret[-1]==',': ret=ret[:-1]
2448
2528
            continue
2449
 
        if use[m].has_key('only') and use[m]['only']:
 
2529
        if 'only' in use[m] and use[m]['only']:
2450
2530
            ret='%s,only:'%(ret)
2451
 
        if use[m].has_key('map') and use[m]['map']:
 
2531
        if 'map' in use[m] and use[m]['map']:
2452
2532
            c=' '
2453
2533
            for k in use[m]['map'].keys():
2454
2534
                if k==use[m]['map'][k]:
2457
2537
                    ret='%s%s%s=>%s'%(ret,c,k,use[m]['map'][k]); c=','
2458
2538
        if ret and ret[-1]==',': ret=ret[:-1]
2459
2539
    return ret
 
2540
 
2460
2541
def true_intent_list(var):
2461
2542
    lst = var['intent']
2462
2543
    ret = []
2468
2549
        if c:
2469
2550
            ret.append(intent)
2470
2551
    return ret
 
2552
 
2471
2553
def vars2fortran(block,vars,args,tab=''):
2472
2554
    """
2473
2555
    TODO:
2478
2560
    ret=''
2479
2561
    nout=[]
2480
2562
    for a in args:
2481
 
        if block['vars'].has_key(a): nout.append(a)
2482
 
    if block.has_key('commonvars'):
 
2563
        if a in block['vars']:
 
2564
            nout.append(a)
 
2565
    if 'commonvars' in block:
2483
2566
        for a in block['commonvars']:
2484
 
            if vars.has_key(a):
2485
 
                if a not in nout: nout.append(a)
2486
 
            else: errmess('vars2fortran: Confused?!: "%s" is not defined in vars.\n'%a)
2487
 
    if block.has_key('varnames'):
 
2567
            if a in vars:
 
2568
                if a not in nout:
 
2569
                    nout.append(a)
 
2570
            else:
 
2571
                errmess('vars2fortran: Confused?!: "%s" is not defined in vars.\n'%a)
 
2572
    if 'varnames' in block:
2488
2573
        nout.extend(block['varnames'])
2489
2574
    for a in vars.keys():
2490
 
        if a not in nout: nout.append(a)
 
2575
        if a not in nout:
 
2576
            nout.append(a)
2491
2577
    for a in nout:
2492
 
        if vars[a].has_key('depend'):
 
2578
        if 'depend' in vars[a]:
2493
2579
            for d in vars[a]['depend']:
2494
 
                if vars.has_key(d) and vars[d].has_key('depend') and a in vars[d]['depend']:
 
2580
                if d in vars and 'depend' in vars[d] and a in vars[d]['depend']:
2495
2581
                    errmess('vars2fortran: Warning: cross-dependence between variables "%s" and "%s"\n'%(a,d))
2496
 
        if block.has_key('externals') and a in block['externals']:
 
2582
        if 'externals' in block and a in block['externals']:
2497
2583
            if isintent_callback(vars[a]):
2498
2584
                ret='%s%sintent(callback) %s'%(ret,tab,a)
2499
2585
            ret='%s%sexternal %s'%(ret,tab,a)
2500
2586
            if isoptional(vars[a]):
2501
2587
                ret='%s%soptional %s'%(ret,tab,a)
2502
 
            if vars.has_key(a) and not vars[a].has_key('typespec'):
 
2588
            if a in vars and 'typespec' not in vars[a]:
2503
2589
                continue
2504
2590
            cont=1
2505
2591
            for b in block['body']:
2506
 
                if a==b['name'] and b['block']=='function': cont=0;break
2507
 
            if cont: continue
2508
 
        if not vars.has_key(a):
 
2592
                if a==b['name'] and b['block']=='function':
 
2593
                    cont=0;break
 
2594
            if cont:
 
2595
                continue
 
2596
        if a not in vars:
2509
2597
            show(vars)
2510
2598
            outmess('vars2fortran: No definition for argument "%s".\n'%a)
2511
2599
            continue
2512
2600
        if a==block['name'] and not block['block']=='function':
2513
2601
            continue
2514
 
        if not vars[a].has_key('typespec'):
2515
 
            if vars[a].has_key('attrspec') and 'external' in vars[a]['attrspec']:
 
2602
        if 'typespec' not in vars[a]:
 
2603
            if 'attrspec' in vars[a] and 'external' in vars[a]['attrspec']:
2516
2604
                if a in args:
2517
2605
                    ret='%s%sexternal %s'%(ret,tab,a)
2518
2606
                continue
2520
2608
            outmess('vars2fortran: No typespec for argument "%s".\n'%a)
2521
2609
            continue
2522
2610
        vardef=vars[a]['typespec']
2523
 
        if vardef=='type' and vars[a].has_key('typename'):
 
2611
        if vardef=='type' and 'typename' in vars[a]:
2524
2612
            vardef='%s(%s)'%(vardef,vars[a]['typename'])
2525
2613
        selector={}
2526
 
        if vars[a].has_key('kindselector'): selector=vars[a]['kindselector']
2527
 
        elif vars[a].has_key('charselector'): selector=vars[a]['charselector']
2528
 
        if selector.has_key('*'):
 
2614
        if 'kindselector' in vars[a]:
 
2615
            selector=vars[a]['kindselector']
 
2616
        elif 'charselector' in vars[a]:
 
2617
            selector=vars[a]['charselector']
 
2618
        if '*' in selector:
2529
2619
            if selector['*'] in ['*',':']:
2530
2620
                vardef='%s*(%s)'%(vardef,selector['*'])
2531
2621
            else:
2532
2622
                vardef='%s*%s'%(vardef,selector['*'])
2533
2623
        else:
2534
 
            if selector.has_key('len'):
 
2624
            if 'len' in selector:
2535
2625
                vardef='%s(len=%s'%(vardef,selector['len'])
2536
 
                if selector.has_key('kind'):
 
2626
                if 'kind' in selector:
2537
2627
                    vardef='%s,kind=%s)'%(vardef,selector['kind'])
2538
2628
                else:
2539
2629
                    vardef='%s)'%(vardef)
2540
 
            elif selector.has_key('kind'):
 
2630
            elif 'kind' in selector:
2541
2631
                vardef='%s(kind=%s)'%(vardef,selector['kind'])
2542
2632
        c=' '
2543
 
        if vars[a].has_key('attrspec'):
 
2633
        if 'attrspec' in vars[a]:
2544
2634
            attr=[]
2545
2635
            for l in vars[a]['attrspec']:
2546
2636
                if l not in ['external']:
2547
2637
                    attr.append(l)
2548
2638
            if attr:
2549
 
                vardef='%s %s'%(vardef,string.join(attr,','))
 
2639
                vardef='%s %s'%(vardef,','.join(attr))
2550
2640
                c=','
2551
 
        if vars[a].has_key('dimension'):
 
2641
        if 'dimension' in vars[a]:
2552
2642
#             if not isintent_c(vars[a]):
2553
2643
#                 vars[a]['dimension'].reverse()
2554
 
            vardef='%s%sdimension(%s)'%(vardef,c,string.join(vars[a]['dimension'],','))
 
2644
            vardef='%s%sdimension(%s)'%(vardef,c,','.join(vars[a]['dimension']))
2555
2645
            c=','
2556
 
        if vars[a].has_key('intent'):
 
2646
        if 'intent' in vars[a]:
2557
2647
            lst = true_intent_list(vars[a])
2558
2648
            if lst:
2559
 
                vardef='%s%sintent(%s)'%(vardef,c,string.join(lst,','))
2560
 
            c=','
2561
 
        if vars[a].has_key('check'):
2562
 
            vardef='%s%scheck(%s)'%(vardef,c,string.join(vars[a]['check'],','))
2563
 
            c=','
2564
 
        if vars[a].has_key('depend'):
2565
 
            vardef='%s%sdepend(%s)'%(vardef,c,string.join(vars[a]['depend'],','))
2566
 
            c=','
2567
 
        if vars[a].has_key('='):
 
2649
                vardef='%s%sintent(%s)'%(vardef,c,','.join(lst))
 
2650
            c=','
 
2651
        if 'check' in vars[a]:
 
2652
            vardef='%s%scheck(%s)'%(vardef,c,','.join(vars[a]['check']))
 
2653
            c=','
 
2654
        if 'depend' in vars[a]:
 
2655
            vardef='%s%sdepend(%s)'%(vardef,c,','.join(vars[a]['depend']))
 
2656
            c=','
 
2657
        if '=' in vars[a]:
2568
2658
            v = vars[a]['=']
2569
2659
            if vars[a]['typespec'] in ['complex','double complex']:
2570
2660
                try:
2589
2679
    outmess('Post-processing (stage 2)...\n',0)
2590
2680
    postlist=postcrack2(postlist)
2591
2681
    return usermodules+postlist
 
2682
 
2592
2683
def crack2fortran(block):
2593
2684
    global f2py_version
2594
2685
    pyf=crack2fortrangen(block)+'\n'