o 6a @s" dZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl Te j a dadadadadadadadadadagadadadaiadadadada t gia!da"ga#d a$ga%da&d a'ga(ga)ga*d d Z+dd d Z,de_-iZ.dD]Z/ddie.e/<q{dD]Z/ddie.e/<q[/iZ0iZ1dD]Z2e2de0e2<e2e1e2d<qddZ3ddZ4ddZ5ddZ6ddZ7e8d ej9j:Z;e8d!ej9je8d#ej9jej9d?fZTe8eDd@ej9dAfZUe8eDdBej9dCfZVe8eDdDej9dEfZWe8eDdFej9dGfZXe8eDdHej9dIfZYe8eDdJej9dKfZZe8eDdLej9dMfZ[e8eDdNej9dOfZ\e8eDdPej9dQfZ]e8eDdRej9dSfZ^e8eDdTej9dUfZ_e8eDdVej9dWfZ`e8eDdXej9dYfZae8eDdZej9d[fZbe8eDd\ej9d]fZce8eDd^ej9ejdBd_fZee8d`ejddafZfdbdcZgdddeZhe8dfej9ZiddgdhZjdidjZkddldmZldndoZmddpdqZne8drej9Zoe8dsej9Zpe8dtej9Zqe8duZre8dvZse8dwej9ZtdxdyZudzd{Zvd|d}Zwd~dZxddZye8dej9Zze8dej9Z{e8dej9Z|e8dej9Z}e8dej9Z~ddZddZddZddZdddZdddZdddZdddZddZddZdddZdddZdddZddZddZdddZddZdddZe8dej9ZddZe8dj:ZdddZe8dej9ZddZddZddZddZddZdddZifddZddÄZe8dġj:ZddƄZddȄZe8dej9Zgfdd˄Zdd̈́Ze8dej9Ze8dej9Ze8dej9Ze8dej9Ze8dej9ZddԄZifddքZdddڄZddd܄ZdddބZddZdddZddZddZedkr gZgZdZdZdZdZejddD]ZedkrqeddkrdZqedkr dadaqedkrdadaqedkr*tr$e,dddadaqedkr3daqedkr Permission to use, modify, and distribute this software is given under the terms of the NumPy License. NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. $Date: 2005/09/27 07:13:49 $ Pearu Peterson Usage of crackfortran: ====================== Command line keys: -quiet,-verbose,-fix,-f77,-f90,-show,-h -m ,--ignore-contains Functions: crackfortran, crack2fortran The following Fortran statements/constructions are supported (or will be if needed): block data,byte,call,character,common,complex,contains,data, dimension,double complex,double precision,end,external,function, implicit,integer,intent,interface,intrinsic, logical,module,optional,parameter,private,public, program,real,(sequence?),subroutine,type,use,virtual, include,pythonmodule Note: 'virtual' is mapped to 'dimension'. Note: 'implicit integer (z) static (z)' is 'implicit static (z)' (this is minor bug). Note: code after 'contains' will be ignored until its scope ends. Note: 'common' statement is extended: dimensions are moved to variable definitions Note: f2py directive: f2py is read as Note: pythonmodule is introduced to represent Python module Usage: `postlist=crackfortran(files)` `postlist` contains declaration information read from the list of files `files`. `crack2fortran(postlist)` returns a fortran code to be saved to pyf-file `postlist` has the following structure: *** it is a list of dictionaries containing `blocks': B = {'block','body','vars','parent_block'[,'name','prefix','args','result', 'implicit','externals','interfaced','common','sortvars', 'commonvars','note']} B['block'] = 'interface' | 'function' | 'subroutine' | 'module' | 'program' | 'block data' | 'type' | 'pythonmodule' | 'abstract interface' B['body'] --- list containing `subblocks' with the same structure as `blocks' B['parent_block'] --- dictionary of a parent block: C['body'][]['parent_block'] is C B['vars'] --- dictionary of variable definitions B['sortvars'] --- dictionary of variable definitions sorted by dependence (independent first) B['name'] --- name of the block (not if B['block']=='interface') B['prefix'] --- prefix string (only if B['block']=='function') B['args'] --- list of argument names if B['block']== 'function' | 'subroutine' B['result'] --- name of the return value (only if B['block']=='function') B['implicit'] --- dictionary {'a':,'b':...} | None B['externals'] --- list of variables being external B['interfaced'] --- list of variables being external and defined B['common'] --- dictionary of common blocks (list of objects) B['commonvars'] --- list of variables used in common blocks (dimensions are moved to variable definitions) B['from'] --- string showing the 'parents' of the current block B['use'] --- dictionary of modules used in current block: {:{['only':<0|1>],['map':{:,...}]}} B['note'] --- list of LaTeX comments on the block B['f2pyenhancements'] --- optional dictionary {'threadsafe':'','fortranname':, 'callstatement':|, 'callprotoargument':, 'usercode':|, 'pymethoddef:' } B['entry'] --- dictionary {entryname:argslist,..} B['varnames'] --- list of variable names given in the order of reading the Fortran code, useful for derived types. B['saved_interface'] --- a string of scanned routine signature, defines explicit interface *** Variable definition is a dictionary D = B['vars'][] = {'typespec'[,'attrspec','kindselector','charselector','=','typename']} D['typespec'] = 'byte' | 'character' | 'complex' | 'double complex' | 'double precision' | 'integer' | 'logical' | 'real' | 'type' D['attrspec'] --- list of attributes (e.g. 'dimension()', 'external','intent(in|out|inout|hide|c|callback|cache|aligned4|aligned8|aligned16)', 'optional','required', etc) K = D['kindselector'] = {['*','kind']} (only if D['typespec'] = 'complex' | 'integer' | 'logical' | 'real' ) C = D['charselector'] = {['*','len','kind']} (only if D['typespec']=='character') D['='] --- initialization expression string D['typename'] --- name of the type if D['typespec']=='type' D['dimension'] --- list of dimension bounds D['intent'] --- list of intent specifications D['depend'] --- list of variable names on which current variable depends on D['check'] --- list of C-expressions; if C-expr returns zero, exception is raised D['note'] --- list of LaTeX comments on the variable *** Meaning of kind/char selectors (few examples): D['typespec>']*K['*'] D['typespec'](kind=K['kind']) character*C['*'] character(len=C['len'],kind=C['kind']) (see also fortran type declaration statement formats below) Fortran 90 type declaration statement format (F77 is subset of F90) ==================================================================== (Main source: IBM XL Fortran 5.1 Language Reference Manual) type declaration = [[]::] = byte | character[] | complex[] | double complex | double precision | integer[] | logical[] | real[] | type() = * | ([len=][,[kind=]]) | (kind=[,len=]) = * | ([kind=]) = comma separated list of attributes. Only the following attributes are used in building up the interface: external (parameter --- affects '=' key) optional intent Other attributes are ignored. = in | out | inout = comma separated list of dimension bounds. = [[*][()] | [()]*] [// | =] [,] In addition, the following attributes are used: check,depend,note TODO: * Apply 'parameter' attribute (e.g. 'integer parameter :: i=2' 'real x(i)' -> 'real x(2)') The above may be solved by creating appropriate preprocessor program, for example. N) __version__)*fix cCspdadadadadadadadadada ga da t gia da dadagaiadadadagagagagadadS)Nrrrrrr) strictf77sourcecodeformquietverbosetabchar pyffilename f77modulename skipemptyendsignorecontains dolowercasedebug groupcounter grouplist neededmodule expectbeginskipblocksuntil usermodules f90modulevars gotnextfilefilepositiontextcurrentfilename skipfunctions skipfuncs onlyfuncs include_pathsprevious_contextr#r#9/usr/lib/python3/dist-packages/numpy/f2py/crackfortran.pyreset_global_f2py_varss4 r%cCs0tsdSts|rtjttj|dSdSN)r r sysstdoutwriter)lineflagr#r#r$outmesss r,2zabcdefghopqrstuvwxyz$_typespecrealijklmninteger)3intdoublefloatcharshortlongvoidcasewhilereturnsignedunsignediffortypedefsizeofunionstructstaticregisternewbreakdogotoswitchcontinueelseinlineexterndeleteconstautolenrankshapeindexslensize_imaxminflenfshapestringcomplex_double float_doublestdinstderrr(typedefault_bncC(|tvrtd|t|ft|S|S)Nz&rmbadname1: Replacing "%s" with "%s". )badnameserrmessnamer#r#r$ rmbadname1   rjcCdd|DS)NcSg|]}t|qSr#)rj.0_mr#r#r$ zrmbadname..r#namesr#r#r$ rmbadnamerucCre)Nz+undo_rmbadname1: Replacing "%s" with "%s". ) invbadnamesrgrhr#r#r$undo_rmbadname1rkrxcCrl)NcSrmr#)rxrnr#r#r$rqrrz"undo_rmbadname..r#rsr#r#r$undo_rmbadnamervrycCsN|d}|dkr dSd||dvrdSd||dvrdS||ddS)N.rr\/r)rfind)riir#r#r$ getextension!s rz.*\.(for|ftn|f77|f)\Zz-\*-\s*fortran\s*-\*-z-\*-\s*f90\s*-\*-z-\*-\s*fix\s*-\*-z[^c*]\s*[^\s\d\t]cCs d}t|du}|}d}t|rd}nt|rd}d}|dkr\|rd|ddkrJ|rJ|d8}|ddkr?t|ddsG|d d d krJd}n*|}|dkrl|s#Wd|SWd|SWd|SWd|SWd|S1swY|S) z(Check if file is in free format Fortran.rrr! Nr&)openreadline _has_f_header_has_f90_headerstrip_free_f90_start)fileresultfr*nr#r#r$is_free_format2sB  ,     rc Cs$|s tttttttttf }|gkrdSt}d}d}d}t dt j }t d} t d} t d} |r8|ddd \}} d gd d t d D} dat |} |}|sXn*|rda|ada|} dadatjtd}ttrt|st|sdan ttrt|sdatrtantatdttttrdpdf|dd }|dks|ddvrn |dd}|dkrtst|d\}}|d 7}|dd dkrt|d|ddd\}}|!dkrtdkrnd}qOtdkr|ddvr|dd dkrd|dd}nd}qOtr%t"|dkr%|dd}|d| vr4t#dt||r:trUt"|dkrU|dd ksU||d d}d}d}nts| $|}|re|%d!}|rw|| $|%d!}d}d}nd|dd}|r| }n|}|}|}|du}nd|dd}|r| }n|}|}|}notdkr|s|d"kr| $|r|d#} |}|st&d$n ||}| $|rnq|'}| $|}|r|%d!}|r|| $|%d!}d}d}n|r| }n|}|}|}|du}nt(d%ttd&|)dt| fa|$|}|r{|%d'}tj*|r?t+||dd(n@tj,tgt-}d}|D]}tj.||}tj*|rgd}t+||dd(nqL|sztd)t|tj/.|fn|||} qP|r| }n|}|}d&|)dt| fa|$|}|r|%d'}tj*|rt+||dd(n@tj,tgt-}d}|D]}tj.||}tj*|rd}t+||dd(nq|std)t|tj/.|fn||da|0|r|dddS|\ aaaaaaaaadS)*z Read fortran codes from files and 1) Get rid of comments, line continuations, and empty lines; lower cases. 2) Call dowithline(line) on every line. 3) Recursively call itself when statement "include ''" is met. NFrz*\s*include\s*(\'|")(?P[^\'"]*)(\'|")z(?P.*)&\s*\Zz(\s*&|)(?P.*)z.*?'''r)rr cSrmr#)strrnr#r#r$rqgrrz#readfortrancode.. Trrrfreez Reading file %s (format:%s%s) z,strict z rrz!f2pyr)rcrC#f2pyz Hzxreadfortrancode: Found non-(space,digit) char in the first column. Are you sure that this code is in fix form? line=%sr*.pyf z.Unexpected end of file when reading multiline z6Flag sourcecodeform must be either 'fix' or 'free': %szLine #%d in %s:"%s" ri) dowithlineistopzAreadfortrancode: could not find include file %s in %s. Ignoring. )1rrrr r beginpatternr r rrecompileIrange fileinput FileInputr isfirstlinefilenameospathsplitext is_f_filer_has_fix_headerrbeginpattern77beginpattern90r,repr expandtabsreplacesplit_by_unquotedlowerrrR Exceptionmatchgrouprgrstrip ValueError filelinenoisfilereadfortrancodedirnamer!joinpathsepclose)ffilerr saveglobalslocaldolowercasecont finallinell includelinecont1cont2 mline_markl1 spacedigitsfinlextrl_ origfinallinerlcmfn include_dirs foundfileinc_dirfn1r#r#r$rJs            (                   rzN\s*(?P%s(?=\s*(\b(%s)\b)))\s*(?P(\b(%s)\b))\s*(?P%s)\s*\Zzqcharacter|logical|integer|real|complex|double\s*(precision\s*(complex|)|complex)|type(?=\s*\([\w\s,=(*)]*\))|byte.*rbz|static|automatic|undefined)z([a-z]+[\w\s(=*+-/)]*?|)functionrrbegin)z [a-z\s]*? subroutinerrzprogram|block\s*dataz@|module(?!\s*procedure)|python\s*module|(abstract|)\s*interface|z type(?!\s*\()z\end|endprogram|endblockdata|endmodule|endpythonmodule|endinterface|endsubroutine|endfunctionz[\w\s]*endza(end\s*(if|do|where|select|while|forall|associate|block|critical|enum|team))|(module\s*procedure)z[\w]*?endif)rimplicitrrr)rdimension|virtualrr dimension)rexternalrrr)roptionalrrr)rrequiredrrr)rpublicrrr)rprivaterrr)r intrinsicrrr)rintent|depend|note|checkrz \s*\(.*?\).*intent)r parameterrz\s*\(.*r)rdatarrr)rcallrrr)rentryrrr)rcallfunrrr)rcommonrrr)ruserrr)rcontainsrrr)rformatrrr)rKthreadsafe|fortranname|callstatement|callprotoargument|usercode|pymethoddefrrf2pyenhancementsz2\s*(?P''')(?P.*?)(?P''')\s*\Z multilinec Csvtdt|@r Jdtdjdt|dt|ddd}||}|r7|}|d |d fS|d fS) z Splits the line into (line[:i], line[i:]), where i is the index of first occurrence of one of the characters not within quotes, or len(line) if no such index exists z"'zcannot split by unquoted quoteszR\A(?P({single_quoted}|{double_quoted}|{not_quoted})*)(?P{char}.*)\Zz[^"'{}]z[{}]z('([^'\\]|(\\.))*')z("([^"\\]|(\\.))*")) not_quotedr5 single_quoted double_quotedbeforeafterr)setrrrescaper groupdict)r* charactersrrdr#r#r$rss rcCsBg}t|dD]}dD]}||d}q ||q d|S)N@,@z(),r,)markoutercommasplitrappendr)argslinearrr#r#r$ _simplifyargss   r z"\s*(?P\b[a-z]+\w*\b)\s*=.*cCst|d\}}|rCtd|sCtd|sC|dks!Jt|t|d\}}|r[^"]*)\b%s\b\s*@\(@(?P[^@]*)@\)@.*\Zrargszcallfun %s(%s) result (%s)rzcallfun %s(%s)z8crackline: could not resolve function call for line=%s. rrz"crackline:%d: No pattern for line rz>crackline: groupcounter(=%s) is nonpositive. Check the blocks.thiszGcrackline: End group %s does not match with previous Begin group %s %srrr):rf2pyenhancementspatternrmultilinepatternr crackliner groupname groupcacherrrrr,rdimensionpatternexternalpattern intentpatternoptionalpatternrequiredpatternparameterpattern datapattern publicpatternprivatepatternintrinsicpattern endifpattern endpattern formatpatternrfunctionpatternsubroutinepatternimplicitpattern typespattern commonpattern callpattern usepatterncontainspattern entrypatterncrackline_re_1rwrmarkouterparenrrr callfunpattern analyzeliner rrendswithr"rrrrrr)r*resetr has_semicolonsemicolon_lineflr+patrre_1rim1m2rr#r#r$rs.                   $    rcCsdd}d}|D])}|dkr|d}|dkr|d}qn|dkr+|d}|dkr+|d}q||}q|S)Nrr(r@(@)@)@r#)r*rrrr#r#r$r/.s  r/rcCsd}d}t||d\}}||7}|rT|d|kr&|dkr&|d|d7}n||d7}|ddkr7|d7}n |ddkrA|d8}t|dd|d\}}||7}|s|r_Jt|||f|S)Nrrz()@r;rr=)rr)r*commarrrrr#r#r$r@s"     rcCs|dddd}|S)Nr<r;r>r=)r)r*rr#r#r$unmarkouterparenSsrAcCs|si}|s|S||ur|St|D]g}|dkr'|s ||vr&||||<q|dkr9||D]}t|||}q/q|dkrFt||||}q|dkrSt||||}q|dvrd|s]||vrc||||<q|dkriq|dvrttd|qtd t||S) Nr.attrspec kindselector charselector)=typenamenote)rcheckrrrz"appenddecl: "%s" not implemented. z,appenddecl: Unknown variable definition key:)listkeys setattrspecsetkindselectorsetcharselectorrgrr)decldecl2forcekrr#r#r$ appenddeclXs>     rRzD\s*(?P(@\(@.*?@\)@|\*[\d*]+|\*\s*@\(@.*?@\)@|))(?P.*)\Zz\s*(?P\b[\w$]+\b)\s*(@\(@\s*(?P[\w\s,]*)\s*@\)@|)\s*((result(\s*@\(@\s*(?P\b[\w$]+\b)\s*@\)@|))|(bind\s*@\(@\s*(?P.*)\s*@\)@))*\s*\Zz9\s*(?P\b[\w$]+\b)\s*@\(@\s*(?P.*)\s*@\)@\s*\Zz4([-+]?(?:\d+(?:\.\d*)?|\d*\.\d+))[dD]((?:[-+]?\d+)?)zA([-+]?((?:\d+(?:\.\d*)?|\d*\.\d+))[eE]((?:[-+]?\d+)?)|(\d+\.\d*))zintent\s*\(.*?\bcallback\bcCs&|dgD] }t|rdSqdS)NrBrr)get_intentcallbackpatternr)vdeclrr#r#r$_is_intent_callbacks  rVcCslt|}t|}|r|d|d|d|dfSt|}|r0|d|dddfSdgddfS)Nrirrbind)r/nameargspatternrrcallnameargspattern)r*r9r#r#r$_resolvenameargspatterns $  rZc< CsT|d}|dkr datrZ|dvrZtsZtdkrZtjt dd}t d|da tdadt t<it t<gtt<gt td <it td <dt td <|t td <d t td<da|dvr|}td|tjrnd}ntd|tjryd}n td|tjrd}t|d\}}}}|dur|dkrd}nd}|dvrt d||tfa|rtddt| dD}ng}d|vrd|vr|dd|vst dd} d} |dvrd} d t tvrdS|t td vrdSttD] } | d |krdSq|t td!vrdSd"d#d|}tr)td$kr)tdkr)td%ad} |d&vr)d} tdait t<gtt<| rtdkrFt d'ttdd(t t<dt td <tt td <dt td<gt td <gt td)<gt td!<it td <tdait t<gtt<| rtdkrt d*tdd+t t<d+t td <d,t td <d-t tddt tdd ft td<gt td <gt td)<gt td!<it td <tdait t<gtt<|t t<|t td <|sd.|d/d0}|d1t td2<t|t td <|t td3<tdkrtt td<n/tr*td4kr*d-t tddtft td<nd-t tddt tdd ft td<tt tD]} t t| sVt t| =qH|t td <gt td <gt td)<gt td!<it td <it td5<|d6krgt td7<|dvr|t td%d)vrt td%d)|t !t td%d t td <zt td |t td |d8"d9=Wn t#yYnw|d:vrBzt$t td |t td%d dt td |<Wn t#yYnw|d;kr*|r*|t td vr*||ks*t$t td |t td |t td |<z t td%d!|Wn t#yAYnw|d#krnt%d|d1d/|} | rnt&| d| d\}}}}t'|||||dvrttdt tttttdd$d <tt=tdattdt tttttdd$d <tt=tdadSdS|d5krt|d\}}}}|dur|rtdvrt td }|d(}|)d?}|dkr|d@krt*|)dAd%}|d|dd?||dd}|)d?}||dd?krd t tvrt dB|d|d|f|dC+t td }|dkrd}d}n|d|(}||d%d}t| d}t,|dkr|d}t dDdC+|ddd}dEdt| dDD]}t-|}|s|dFvrd} nt.|/t dG|t|fqt|d } | |vri|| <|dHkr||d}|d@krk|d|}t0|rk| t td vretdkr^dIt td%d vr?t dJ| t td kr]t dK| t td ft td | n t1dL| nt1dM| |dNvrr|}d8|| vr|| d8|n|g|| d8<|d9krt td dkrt dOq| t td vrqd)t tvrgt td)<t td)| | }q|t td <|durd=|tfadSdS|dPkrt td }|d(dd$}d}t| dD]}zdQd| dRD\} }Wnt#yt dS||fYqwt2|}t| } | |vr+i|| <dR|| vrH|| dR|ksHt dT| || dR|ft3||} | r| 4dUdVkrt|}t56|D]}t||7|8dWdX||7|8<qad+|}n| 4dUdYkr|dddWdXdCdZ}zt9|i|}Wnt:t;t||\}"}#}$|| dU<|"| db<|#| dc<|$| dd<t| D] } | | s| | =qt|d dD]\}%de|%vrzdfd|% deD\}&}'Wnt#yt dg|%Yqw|%(}&}'t,|&t,|'krdksnt dh|%qt?t@|&t@|'dD] }(| |tA|(<qqqA|t td\<dSdS|dik rg}d})d}*d}+d},d}-|dD]i}.|-sH|.djkr:|, },|.dkkrH|,rH|+d}+q-|.dlkrR|-d}-n |.dmkr[|-d}-|+dkrf|)|.})q-|+dkrq|*|.}*q-|+d%kr|)(})|)BdCr|)dd(})||)|*g|.})d}*d}+q-|+d%kr|)(})|)BdCr|)dd(})||)|*gi}/d t tvrt td }/d}|D]}0dnd|0D}0|0dddCkr|0ddd|0d<|0dddlkrt do|0dqd}d}1t,|0d}2tdpdt|0d dDD]}|ddlk r"t do| qd},||2k rV|, s5|0d|dCk sV|0d|djk rA|, },|d}||2k rV|, s5|0d|dCk r5|d}||/v rci|/|<dR|/|v r|/|dR|0d|1|dk st dq||/|dR|0d|1|df|0d|1|d|/|dR<|}1|} qq|/t td <|du rd=|tfadSdS|drk rs|d(}|ddkk sds|}g}3d}+d}4d}5|D]:}.|.dkk r|+d}+ q|+d4k r|4(}4|4 sdt}4|3|4|5g|+d%}+d}4d}5|+d% r|4|.}4 q|5|.}5 q|4(}4|4 sdt}4|3|4|5gi}6drt tv r5t tdr}6|3D].}.|.d|6v rFg|6|.d<dudt|.d dDD]}| rb|6|.d| qT q7|6t tdr<dr|4tfadS|dvk r%tdw|dtj}| r|/}7dvt tv rit tdv<|d }it tdv|<d}8dx|7v r|7dxdu rdy|7v r|7dydu rd}8|8t tdv|dz<d{d|7dx dCD}i}9|D]9}0dR|0v rtd||0tj}!|! r|!dv(|9|!d}(<n t d~t|0n|0|9|0<|9t tdv|d< qdS dSt.|/t ddS|dv rqdt tv r7it td<t td}:|ddk red|:v retC|:dtD rY|:dg|:d<|:d|ddS|d|:|d<dS|dk rtdu rt rt ddSt};tEt |;tdd%|ddStdk rt.|/t ddSdS)Nrr)rrrrbrrzrzBanalyzeline: no group yet. Creating program group with name "%s". programr r r rifromskyfrom)rrrz block\s*data block datazpython\s*module python modulezabstract\s*interfaceabstract interfacer _BLOCK_DATA_r) interfacer^r`z2analyzeline: No name/args pattern found for line. cSg|]}|qSr#rroxr#r#r$rq zanalyzeline..rzz'All arguments will have attribute %s%s rzXanalyzeline: cannot handle multiple attributes without type specification. Ignoring %r. cSrcr#rdrer#r#r$rqwrrrrzEanalyzeline: no name pattern found in %s statement for %s. Skipping. r__user__z8analyzeline: missing __user__ module (could be nothing) z;analyzeline: appending intent(callback) %s to %s arguments z+analyzeline: intent(callback) %s is ignoredz.*?)\s*(\(\s*(?P[a-z-, ]+)\s*\)\s*|)\ZzDanalyzeline: could not extract info of implicit statement part "%s" zManalyzeline: could not extract types pattern of implicit statement part "%s" rCrDrF-cSrcr#rdrer#r#r$rqrrzZanalyzeline: expected "-" instead of "%s" in range list of implicit statement z^analyzeline: expected "-" instead of "%s" in range list of implicit statement (2) r'r|r;r=cSrcr#rdrer#r#r$rq6rrz>analyzeline: implied-DO list "%s" is not supported. Skipping. cSrcr#rdrer#r#r$rq@rrz=analyzeline: changing init expression of "%s" ("%s") to "%s" rz//_BLNK_cSrcr#rdrer#r#r$rq{rrrzR\A\s*(?P\b\w+\b)\s*((,(\s*\bonly\b\s*:|(?P))\s*(?P.*))|)\s*\ZrInotonlyonlycSrcr#rdrer#r#r$rqrrz7\A\s*(?P\b\w+\b)\s*=\s*>\s*(?P\b\w+\b)\s*\Zlocalz0analyzeline: Not local=>use pattern found in %s mapz0analyzeline: Could not crack the use statement. )rrusercodez-analyzeline: No context for multiline block. z+analyzeline: No code implemented for line. )Frr"rrrrrbasenamerrr,rrrrrrrrrZrurremoverrr rrrjrIrJrcopydeepcopyrUrrRr(cracktypespec0 updatevarsrfindr/rrR namepatternprintrrTrgget_parametersdetermineexprtyperS real16patternfinditerstartreval SyntaxError NameError TypeErrortypespattern4implicit cracktypespecrordchr startswith isinstancerappendmultiline)cracktypespec0: no kind/char_selector pattern found for line. )rur1logicalr/ characterrbrrrqrr) rrrrr selectpatternr/r,rrIrJrAr)r.rrrr9rrQr~r#r#r$rs0   rz)\s*(?P\b\w+\b)\s*(?P.*)\s*\ZzB\s*(\(\s*(kind\s*=)?\s*(?P.*)\s*\)|\*\s*(?P.*?))\s*\Zz2\s*(\((?P.*)\)|\*\s*(?P.*))\s*\Zz\s*(kind\s*=\s*(?P.*?)\s*(@,@\s*len\s*=\s*(?P.*)|)|(len\s*=\s*|)(?P.*?)\s*(@,@\s*(kind\s*=\s*|)(?P.*)|))\s*\Zz\s*(@\(@\s*(?!/)\s*(?P.*?)\s*@\)@\s*\*\s*(?P.*?)|(\*\s*(?P.*?)|)\s*(@\(@\s*(?!/)\s*(?P.*?)\s*@\)@|))\s*(=\s*(?P.*?)|(@\(@|)/\s*(?P.*?)\s*/(@\)@|)|)\s*\ZcCs|}t|dkr |S|d}tdt|dD]}||dkr2||ddvs1||ddvr2q|||}q||d}|S)Nrrrz ()[]{}=+-/* r)rrRr)exprexpr2r~r#r#r$ removespacess   rcCsd}d}d}d}|D]@}|dkr|dvr||}|}q |dkr%|dvr%|}||kr.|d}n||kr7|d}n |dkrD|dkrD|d }q ||}|}q |S) Nrrrxr{)r{rx")rxrrr@_@r#)r*rrcccbrr#r#r$markinnerspacess*  rc Csd}t||\}}}|rFddt|dD}g}td} |D]"} | s&q!| | } | r>| d} | | t| d} | | q!|}ddt|dD} g}| D]"}ddtt t |dd d DD] }|rw| | d dqjqV|D]}t |} | std t|q{t| d }i}|ttdvrttd|}d|v}|r||d<n|r||dkstd||d|fd|vrt||d<n:|rt|D]0}||dvr|||d|kstd|||d|||fqt|||d|<qd|vr'|r'|r||d<nEtd||fn<|rct|D]2}||dvrV|||d|ksVtd|||d|||fq0t|||d|<q0d|vrm||d<n|r|d|kstd||d|fd|vrt||d<n8|r|D]} | |dvr|d | qn t||d<t||d<t||d<||d<t||d<d|dpgvr|ttdvrdttvrgttd<ttd || dr.rz(?P[a-zA-Z]+)rcSrcr#rdrer#r#r$rq#rrcSrcr#rdrer#r#r$rq&rrrr@z@ @rz;updatevars: no name pattern found for entity=%s. Skipping. rir r.zIupdatevars: attempt to change the type of "%s" ("%s") to "%s". Ignoring. rCzVupdatevars: attempt to change the kindselector "%s" of "%s" ("%s") to "%s". Ignoring. rDzEupdatevars:%s: attempt to change empty charselector to %r. Ignoring. zVupdatevars: attempt to change the charselector "%s" of "%s" ("%s") to "%s". Ignoring. rFzMupdatevars: attempt to change the typename of "%s" ("%s") to "%s". Ignoring. rBrrrr)rRarrayinit2rRrrrz-updatevars: "%s %s" is mapped to "%s %s(%s)" dimension(%s) rrz5updatevars:%s: attempt to change %r to %r. Ignoring. rur1rr/rrrrEzTupdatevars: attempt to change the init expression of "%s" ("%s") to "%s". Ignoring. z?updatevars: could not crack entity declaration "%s". Ignoring. rn)rrrrrrrrrRrrrrrr,rrjrrrrIrJrgrSlenarraypatternr/rrA)r.rrB entitydeclrrrrFrrrrselel1rte1enamernot_has_typespecrQr9d1lkdmdm1r#r#r$rs,   (     $  $     (                  rc Csd}d}d}|r|dvrLt|}|stdt|dS|}|d|d<|d=t|D] }||s9||=q0t|D] \}}t|||<q@n|dkrt |}|satdt|dS|}|d|d<|d=|drt t |d}|}d D]}||d r||d ||<||||<||d =q|d=t|D] }||s||=qt|D] \}}t|||<qn'|d krt d |t j }|r|d }ntdt||ntdt||||fS)Nrz4cracktypespec: no kindselector pattern found for %s kind2rrz4cracktypespec: no charselector pattern found for %s charlenlenkind)rRkindrrbz\s*\(\s*(?P\w+)\s*\)riz'cracktypespec: no typename found in %s z'cracktypespec: no selector used for %s )rCrr,rrrIrJitemsrjrDlenkindpatternrrrr) r.rrrrFrQr~rrr#r#r$rsx             rcCs|si}|s|Sd|vr|g|d<|S|r|d|||dvr$|S|dkr7d|dvr7|d||S|dkrJd|dvrJ|d||S|dkr]d|dvr[|d||S|dkrpd|dvrn|d||S|d||S)NrBrD automaticrrr)rNrrPr#r#r$rKs6      rKcCZ|si}|s|Sd|vr||d<|St|D]}|s"||dvr*|||d|<q|S)NrCrIrJrNselrPrQr#r#r$rLrLcCr)NrDrrr#r#r$rMrrMunknowncCsd|vr|dS|S)Nrir#)r rr#r#r$ getblocknamesrcCs0z d|d|dfaWdStyYdSw)Nz In: %s:%s r]ri)rr)r r#r#r$ setmesstexts  rcCs2i}d|vr t|d}d|vr||d|S)N parent_blockr) get_usedictupdate)r usedictr#r#r$r&s  rc Cs|duri}t|}|s|St|D]J\}}|}|tvr,td||dfqt|}t|}|s7q|r?td|t|D]\}}||vrYtdt |t |f|||<qEq|S)Nz0get_useparameters: no module %s info used by %s riz+get_useparameters: mapping for %s not impl.zDget_useparameters: overriding parameter %s with value from module %s) rrIrrrr,rSrrgr) r  param_maprusenamemappingmvarsrrQrr#r#r$get_useparameters/s4   rc sts|St|trfdd|D}|St|td|dfddur,t|dur_d|vr_|d}t|D] }||}d|vr^|d}d|vr^|d}|vr^||d<q>fd d|d D} | |d <|S) Ncg|] }t|ddqSr)tabr postcrack2)rogrrr#r$rqSzpostcrack2.. %sBlock: %s rirr rCrcrrr)robrr#r$rqfrr )rrrIrr,rrJ) r rrretr rvarrvalnew_bodyr#rr$rMs6    rcCsJt|tr3g}g}|D]#}t|t||dd}d|vr)d|dvr)||q ||q ||St|t|tsHd|vrHtdt|d|vr]|ddks]td||dfd t |}t |}t ||d <t |d |d <d |vr|d r|d }t |||d|d <g}d|vr|d}t|D] }d|vr||qni}d} d|vr|d} d|vr|drg} d|vr|d} t|d } | r| d} nd} | |vrd} d| | f|vr| d} d| | f|vsd| | f} dgi| dd}|dD]w}|| vrdg}d}|d D]I}|d}|ddkrYd} |d D]}| d} d|vrB|d|krBt|}|d | =nq$|rY|d sQ|d |=| | |=nq|d |q|| vrxt| |sx| ||d |<q|d s|d r| |d<d|gi| |dd}i|| <t||r||d<|S)zi TODO: function return values determine expression types if in argument list rrrirsr z0postcrack: Expected block dictionary instead of rjrrr sortvarsrr rrrr__user__routinesunknown__user__routinesrz%s_%irb_user_interface)r r r rirr_)r r r rir)rrIr postcrackrdictrrr, analyzeargs analyzecommon analyzevars sortvarnames analyzebodyrJrrU isexternalr)r rrgreturetr userisdefineduseblockrQrirrmnamer~rbrtedefrrbbmblockr#r#r$r ms                  r cCsg}g}t|D]}d||vr||dr||q ||q t|}d}|r|d}d}|ddD]}|||dvrFd}nq8|rm|dd|g}|d}||krltdd|d||} |Sn|||dd}t|}d}|s,|S)NdependrrzTsortvarnames: failed to compute dependencies because of cyclic dependencies between z, r)rIrJrrRrgr)r indepdeprrr~r6wr#r#r$rsF    rcCs~t|s|Sg}t|dD]}g}|d|D]}td|tj}|rg}|dr.*?)\b\s*(\((?P.*?)\)|)\s*\ZdimscSrcr#rdrer#r#r$rqrgz!analyzecommon..rrir rBrrzNanalyzecommon: failed to extract "[()]" from "%s" in common /%s/. commonvars) hascommonrIrJrrrrrrrjrrrrg)r rrQcomvarsrtrrrr#r#r$r sR        r cCst|g}|dD]r}||d<|ddvr?|dur!|d|vr!q |d}|dtvr,q tr5|dtvr5q t|ddd |d <n|}t|||d d }|dd vrY|dsYd|vrYq |ddddkrit|q |ddkrw|dt|d<||q |S)Nr rr rorirz T as_interfacesaved_interfacerrrhrrr pythonmodulerir ) rrr crack2fortrangenr rrrr)r rrr ras_r#r#r$rs4       rcCst|t}i}d|vrO|ddur&d}tdkr"tdt|d||fSt|dD] }|d|ddvrD|d|||<q.|d|d||<q.||fS)Nrrz6buildimplicitrules: no implicit rules for routine %s. rir.)rDr)rdefaultimplicitrulesr r,rrIrJrS)r  implicitrules attrrulesrQr#r#r$buildimplicitrules<s  r+cCs,t|||}t|ttfvr|Std|)z2 Like `eval` but returns only integers and floats zr=%r)rrbr2r4r)rtrrrr#r#r$myevalOs  r,z \A\b\w+\b\Zc Cs ztt|ii}d|dfWStyYnwt|r"dd|fSt|}|D]}t||kr1q(td|d|r>> getlincoef('2*x + 1', {'x'}) (2, 1, 'x') >>> getlincoef('3*x + x*2 + 2 + 1', {'x'}) (5, 3, 'x') >>> getlincoef('0', {'x'}) (0, 0, None) >>> getlincoef('0*x', {'x'}) (0, 0, 'x') >>> getlincoef('x*x', {'x'}) (None, None, None) This can be tricked by sufficiently complex expressions >>> getlincoef('(x - 0.5)*(x - 1.5)*(x - 1)*x + 2*x + 3', {'x'}) (2.0, 3.0, 'x') rNrz\w\s*\([^)]*\b\b(?P.*?)\b\b(?P.*)z%s(%s)%srrg?g?)NNN) r2r,rgetlincoef_re_1rrRrsearchrrr) rtxsetrlen_erfr8rr9eerrc2r#r#r$ getlincoefYs                   r6z \A[a-z]\w*\Zrc Csg}z |t|diiWnty||dYnwz |t|diiWnty=||dYnwt|dtrmd|d}|dkrVt|d}nB|dkrdd|d| f}n4d|d|f}n+t|dtrd|d}|dkrd|d}nd||df}n d|d|df}z tt|iiddfWStyYnwt|d|t|d|}}d|d|dfvr|d|dfd krt|d|ddddfS|d|dd}|dd|d f}|d||d f}|ddkrT|d |vrT|dkr(d |d|d | f|d d | |dffS|rAd |d|d |f|d d||dffSd|d|d f|d d|dfS|ddkr|d |vr|dkrd |d |d | f|d d | |d ffS|rd |d |d |f|d d||d ffSd|d |d f|d d|d fS|d |d kr|d |vr|d|d} | st|ddfS|dkrd | |d | f|d d | | ffS|rd | |d |f|d d|| ffSd| |d f|d d| fS|d|dkr dkrgnnEt|d } | |vr>> getarrlen(['10*x + 20', '40*x'], {'x'}) ('30 * x - 19', 'x', '+19)/(30)') >>> getarrlen(['1', '10*x + 20'], {'x'}) ('10 * x + 20', 'x', '-20)/(10)') >>> getarrlen(['10*x + 20', '1'], {'x'}) ('-10 * x - 18', 'x', '+18)/(-10)') >>> getarrlen(['20', '1'], {'x'}) ('-18', None, None) rrz%s-%sz%s+%sz-(%s)z%s-(%s)z %s-(%s)+1Nrrrz %s * %s - %sz +%s)/(%s)z %s * %s + %sz -%s)/(%s)z%s * %sz)/(%s)z# getarrlen:variable "%s" undefined (%s)z%s-%s-%sz%s-%s+%srz-%s%s*%sz+%sz+%s*%sz-%s*%sz%s%sz%s%s-%sz%s%s+%s) rr,rrr2rrr6_varname_matchr,) rrstaredlp1rrd2rrrr5c1r#r#r$ getarrlens       0,& 40*  ($$                                   r@z\b[a-z][\w$]*\bcCs||vrS||dg}d||vr1t||s1t||dD]}||vr0||vr0||q!|ddD]}||gpDt|||D] }||vrP||qEq7n tdt|g}|||<|S)NrrEz,_get_depend_dict: no dependence info for %s )rSisstring word_patternfindallr_get_depend_dictr,r)rir depswordswordrr#r#r$rDZ s(    rDcCs*t|}i}|D]}t|||q |Sr&)rIrJrD)r rt depend_dictrr#r#r$_calc_depend_dictn s rIcstg}tD]}|s|||=q rBtD]\}}fdd|D}|s;|||=q#||<q#sfdd|DS)z cg|]}|vr|qSr#r#)ror)rHr#r$rq z$get_sorted_names..crJr#r#)rori)r r#r$rq rK)rIrIrJrr)r rtrilstnew_lstr#)rHr r$get_sorted_namesv s    rNcCs@|ddvr |dd}t|rdSt|rdSd|dS) Nr'"rrzkind(r=)rr real8pattern)r]r#r#r$ _kind_func s     rScCsLd|}|dkr dS|dkrdS|dkrdS|dkrd S|dd kr$d Sd S) NrrirlrQlrPrr#)rrr#r#r$_selected_int_kind_func s rWcCsZ|dkrdS|dkr dSt}|dr|dkrdSd S|dkr%dS|dkr+dSd S) NrQrVrP)aarch64powerppcriscvs390xsparcrr)platformmachinerr)prradixrbr#r#r$_selected_real_kind_func s  rec Cst|}t|}dtfdtfdtffD] \}}||vr!|||<qg}t|D]}d||vr=d||dvr=||q(tdtj}tdtj} tdtj} |D]0}d ||vrx||d } t ||ry| } d D]} | j | } qq| d | } | d | } d } d||vrd||dvrt | }| d||ddd} t | |k} | s| | s| d}t |dkrd|dd |d d} t||rt| }t| D]}t| || dd|||<qd|} n t||r%| ddkr%| ddkr%t| ddd}z t| ||||<Wn!tyP}z| ||<td|t| fWYd}~nd}~wwt||rht||trht ||||<| }||krw||||<qUt!||tdt|qU|S)Nrselected_int_kindselected_real_kindrBrz \bkind\s*\(\s*(?P.*)\s*\)z-\bselected_int_kind\s*\(\s*(?P.*)\s*\)z4\bselected_(int|real)_kind\s*\(\s*(?P.*)\s*\)rE))z.false.False)z.true.Truez kind("\1")zselected_int_kind(\1)FrCrrrrrrtrr;r=rzget_parameters: got "%s" on %s z2get_parameters:parameter %s does not have value?! )"rrSrWrerNrrrr islogicalrrsubrRrrrisdoublerIrrrr iscomplexrrrr,rrArr2rr)r  global_paramsrg_paramsrifunc param_namesrkind_reselected_int_kind_reselected_kind_rerrepl is_replaced orig_v_lenv_rrrrnlr#r#r$r s                &       rcCs|dvrdSt||S)N)z(:)(*)rrz) _eval_scalar)lengthrr#r#r$ _eval_length s r}z\d+_c Cst|r |dd}z tt|i|}W|Stttfy$|YStyC}ztd||t | fWYd}~|Sd}~ww)Nrrz,"%s" in evaluating %r (available names: %s) ) _is_kind_numberrrrrrrrrgrIrJ)valuerrr#r#r$r{ sr{c6 Cst|t|\}}t|d}|ddkr#|d|vr#i||d<d|dvrW|d=d|ddvrW|ddd}t|D]}dD]}||vrUt|||||<qFqBg}|d}|D]} z || || Wq_tyuYq_wt|D] }||vr||q|t|t |} i} t d j } t|D].} | | }|r| | |}z| |Wqtyt d | t jj | |<Yqwq|D]L}|d t|vrt||||d ||<d ||vrbd||vrd ||dvsb|rO|d }t||D]>}|d kr!|||dkr!q|||vr4||||||<q|dkrL|||D] }t|||||<q?qn||dvrbtdt||dfd||vrd||dvr||dd}z tt|i| }Wn tyYnw|||dd<d||vrd||dvr||dd}z tt|i| }Wn tyYnw|||dd<i}d||vr$||d}|g||d<d\}}}}}|D]K} | dddkr| dddd}na| dddkr| dddd}nK| dddkr3| dddd}n5| dddkrI| dddd}n| dddkr_| dddd}n t||| ||<|rd||vrxg||d<d d!t|d"DD]}|d#d}|||dvr||d|qd}|r|d$d%}|d&d'}d||vr|g||d<n ||d|d}|durd||vrg||d<td(d!t|d"DD]}|||dvr||d|qd}|dur9d||vrg||d<d)d!t|d"DD]}|||dvr5||d|q!d}q|r$d||vr$g||d<td*d!t|d"DD]}d+}|d,krdd,}|| vrot| |}t| D].}t d-|d.t j}| |}|r|d/t| ||d0}| |}|squ||kr|g}nt|d,d1}t|d2krd+|vrd+g}d+}t|dkr|d |ksd3|d g}t|d2krt|t|d\}} }|ddd4kr|dd}|r|d5dd6kr|dd5}| r| |f||<||d|qYd||vrt||r5d7} nd7} t ||rd||vr||d}d+|vr|d+}t!d8||d9"||d|d9"||d|gf||d|||d=d||vrg||d<d:||dvr||dd:nt!d;|d||vrd|vr||dvrd||v}!|!rg||d<g||d<d||vr6d}"t||d}#||dD]P}g}$d}%d}&||vr'||vrd<||d}&}%||d }n!|dD]}'|'|vrq t d=|'d>|t jr%|$|'q ||vrfd||vrW||dD]}(|(dddkrU|$|(ddddd97}$q9d||vrf|$||d}$|"d}"||vr d||vr d?||vr |||dvr t#t$t%t&||r |g||d<|#dkrd@|&| ||"|%f||d?<n dA|&||%f||d?<d||vr|#dkrdB|&| ||"|%|fg||d<n dC|&||%|fg||d<d||vrdDg||d<dD||dvrdE||dvr||ddDq|dFvr3|!r3||vr'||$vr%||d|q||d|$||d<qnPt'||rd3})d||vrd+||dvrct(||dd+| })|)||dd+<n#d||dvrt(||dd| })||dd=|)||dd+<||ds||d=|!r||ds||d=d?||vrd||vrg||d<dD||dvrdE||dvr||ddDd||vrg||d<t| )D]\} }|||d?r||d| q||ds||d=t*||rt+||d?| ||d?<qt|D]}||dkrd||vr:||d|d<|ddkrdG|vrZ|dG|vrZt,||||dG||<dH|vr|dH}*d }+d},|*dId}-|*|-k }+|-dJd}*|*|-k },t-d  |*}|rt.|dK|d0\}.}/}}0t/|.|/\}1}2}3|.||d <|1rd|1vrz t|1di| |1d<Wn tyYnw|1||d<|2r|2||d<|3r|3||dL<|+rt||dI||<|,rt||dJ||<q"tdMt|dHq"|ddNvrdO|vrt|d|dO}4nt|d}4t|D]}t#t0t1||r7|4|q&dP|vri|42t|dPt|dPD]}|dP|D] }||4vre|4|qYqQ|ddkrdG|vr}|4|dGn|4|d|ddQvr|d}5|5|vrd||5vr||5d|d<|ddRkr|42t|t|D] }||4vr||=q|S)SNr r rrirrBrrrz[A-Za-z][\w$]*z.*\b%s\brr.r undefinedzCanalyzevars: typespec of variable %s is not defined in routine %s. rDrRrCr)NNNNNrrrrrrrrrHrQrGcSrcr#rdrer#r#r$rq rrzanalyzevars..rrz\n\nz z\n rcSrcr#rdrer#r#r$rq rrcSrcr#rdrer#r#r$rq rrcSrcr#rdrer#r#r$rq rrr:r.r/rrz@:@r1z1 * z/(1)rTzoanalyzevars: character array "character*%s %s(%s)" is considered as "character %s(%s)"; "intent(c)" is forced. rrz'analyzevars: charselector=%r unhandled.r;z.*?\br-rEz %s%s(%s,%s)%sz %slen(%s)%sz%s%s(%s,%i)%s==%sz%slen(%s)%s>=%srrrrrrlpure recursiverrFz'analyzevars: prefix (%s) were not used )rir%r_r^rr)rrrb)3rr+rrIrJrKrKeyErrorrrrrrrrrrr,rrrrreverserrrrrurrRr@ isintent_c isstringarrayrgrl_or isintent_inisintent_inoutisintent_inplacerAr}risscalarr{rRr(rrisintent_callback isintent_auxextend)6r r)r*r genrrQsvarsrrr dep_matches name_matchrrln0r savelindimsrdimrrrHrGrtmprr;rcr8rdi shape_macror+r~niddepsadpdraar|prispureisrecpr1r.rrrrrF neededvarsrir#r#r$r' s                                         &         "        4                         rz\A[a-z]+[\w$]*\Zc Cs|}t| }|r^t|\}}t||d|}d}|D]} | } | tjtjvr,d} || }q|ddkr<|d}n|d}|}||dvsN||dvr^|d}||dvsN||dvsN||vr~d } |t| |vrx| d } |t| |vsl|t| }|r||d|<|S||dvr||dvr|d||d|<ni|d|<d |vr||d |d vrt |d|d |d|<|S) Nr e_rrrt_errrrrr) analyzeargs_re_1rr+rrr]ascii_lowercasedigitsrrK) rr rorig_a a_is_exprr)r*atnarrQr#r#r$ expr2name sD         rcCst|t|\}}d|vrg|d<g}|dD] }t|||}||q||d<d|vrLt|dD]\}}|D]}||dvrJi|d|<q\w+)|)\Zz*\A[+-]?[\d.]+[-\d+de.]*(_(?P\w+)|)\Zz \A\(.*\)\Zz\A(?P\w+)\s*\(.*?\)\s*\ZcCsPt|tr ddiSt|trddiSt|trddiSt|tr"|Stt|)Nr.r1r/ru)rr2r4rur AssertionErrorr)rr#r#r$_ensure_exprdict s     rcCs||vr t||S|}t|rddiSt|}|r5d|vr1|dr1tdt|ddiSt |}|rSd|vrO|drOtdt|ddiSdD]%}dd t ||d  d |d DD]}||vryt||SqiqUi}t |rt |d d ||}n.t|}|r|d}t |d||}|rd|vr|d=|s|d|vrt||dS|ddvrdddidS|stdt||S)Nr.ruriz:determineexprtype: selected kind types not supported (%s) r1r/)+rwrr|cSrcr#rdrer#r#r$rq rrz%determineexprtype..rr?rrrBrrOrr)r.rDz>determineexprtype: could not determine expressions (%s) type. )rrdetermineexprtype_re_1rdetermineexprtype_re_2rrr,rdetermineexprtype_re_3rrdetermineexprtype_re_4rdetermineexprtype_re_5)rr rulesroprtrrnr#r#r$r sX      (       rrFcCst|d}t|tr3|D]#}|r'|ddvr'|dtvrq tr'|dtvr'q |t|||d}q |Sd}d}d}|d}|dkrCdSg} d|vrM|d}d|vr||d} |dD]} t| || } t| | sl| | qY|dd ksu| r|d d | }d} d |vrt|d  D]} d | |t | |d | f} q| dgdd}|d krd|vr| d|rd| |t d ||f} d}d|vrt|d|t }d}d|vrt|d|t }|dkrd}d}d|vrd|d}|d| vr| |dt|d|t |d}t||d| |t |d} d}d|vr&|s&d|d}d|vrLd}t|dD]\} }d||t | d |f}q5||}|dkrX|dkrXd}d|||||||| || |||||f}|S)Nrr rorir"r[rr rr8rrz %s%s%s %srcallbackz%s%sintent(%s) %srrrjrz result (%s)r r]z! in %srz%s%sentry %s(%s)r^raz%%s%s%s %s%s%s %s%s%s%s%s%s%send %s %s)rrrIrr r&rrrrrJr rSr use2fortrancommon2fortran vars2fortranr)r rr#rrrlrir blocktypeargslr rrrQ intent_lstrrrr mess entry_stmtsr~r#r#r$r& s            r&c CsVd}t|D] }|dkrd||d||f}qd|||d||f}q|S)Nrryz %s%scommon %srz%s%scommon /%s/ %s)rIrJr)rrrrQr#r#r$rQ s rcCs d}t|D]{}d|||f}||ikr&|r%|ddkr%|dd}qd||vr6||dr6d|}d||vru||drud}t||dD]&}|||d|krdd |||f}d}qNd |||||d|f}d}qN|r|ddkr|dd}q|S) Nrz %s%suse %s,rrr{z%s only:r}r%s%s%sz %s%s%s=>%sr)rrrrrrQr#r#r$r[ s*   rc CsR|d}g}|D]}z td|}Wn tyYqw||r&||q|S)Nrz isintent_%s)globalsrr)rrLrrrr#r#r$true_intent_lists s  rc Cst|d}g}|D] }||dvr||q d|vr7|dD]}||vr0||vr/||q td|q d|vrB||d|sVt|D] }||vrU||qJ|D]}d||vr||dD]}||vrd||vr|||dvrtd||fqgd|vr||dvrt||rd |||f}d |||f}t||rd |||f}||vrd ||vrqXd } |dD]} || dkr| ddkrd} nq| rqX||vrt|t d|qX||dkr|ddks| drqXd ||vr(d||vrd||dvr||vrd |||f}qXt||t d|qX||d } | dkrDd||vrDd| ||df} i} d||vrT||d} n d||vra||d} d| vr| ddvrvd| | df} n6d | | df} n-d!| vrd"| | d!f} d#| vrd$| | d#f} nd%| } n d#| vrd&| | d#f} d'} d||vrd(d)||dD}|rd*| d+ |f} d+} d,||vrd-| | d+ ||d,f} d+} d.||vrt ||}|rd/| | d+ |f} d+} d0||vrd1| | d+ ||d0f} d+} d||vr/d2| | d+ ||df} d+} d3||vrf||d3}||d d4vr^zt |}d5|j|jf}Wn ty]Ynwd6| ||f} nd7| |f} d8||| f}qX|S)9z& TODO: public sub ... rr rz7vars2fortran: Confused?!: "%s" is not defined in vars. rnrzHvars2fortran: Warning: cross-dependence between variables "%s" and "%s" rz%s%sintent(callback) %sz%s%sexternal %sz%s%soptional %sr.rr rir rrz/vars2fortran: No definition for argument "%s". rrBrz-vars2fortran: No typespec for argument "%s". rbrFz%s(%s)rCrDrrz%s*(%s)r9rRz %s(len=%srz %s,kind=%s)z%s)z %s(kind=%s)rcSsg|]}|dvr|qS))rr#)rorr#r#r$rq sz vars2fortran..z%s, %srrz%s%sdimension(%s)rz%s%sintent(%s)rHz %s%scheck(%s)z%s%sdepend(%s)rE)rurz(%s,%s)z %s :: %s=%sz%s :: %sr)rrrgrrIrJr isoptionalshowr,rSrrrr/imagr)r r rrr#rnoutrrrrvardefrrrrLrr#r#r$r s       $                    rcCsHtddt|ttddgattd}tddt|}t|S)NzReading fortran codes... rzPost-processing... zPost-processing (stage 2)... )r,rrrr rr)filespostlistr#r#r$ crackfortran s     rcCs$t|d}d}dt}|||S)NrzE! -*- f90 -*- ! Note: the context of this file is case sensitive. zb ! This file was auto-generated with f2py (version:%s). ! See http://cens.ioc.ee/projects/f2py2e/ )r& f2py_version)r pyfheaderfooterr#r#r$ crack2fortran s  r__main__rz-quietz-verboserz-fixz?Use option -f90 before -fix if Fortran 90 code is in fix form. z-skipemptyendsz--ignore-containsz-f77z-f90rz-hz-showz-mrwzUnknown option %s z IOError: %s a Warning: You have specified module name for non Fortran 77 code that should not need one (expect if you are scanning F90 code for non module blocks but then you should use flag -skipemptyends and also be sure that the files do not contain programs without program statement). z Writing fortran code to file %s r)r)r)r)rr&)rN)Nr)r)NNr7)rF)rF)__doc__ior'r]rrrrrarrauxfuncsversionrr r r r r rrrrrrrrrrrrrrrrr!rr r"rrrrr%r, _MAXCACHEr(rrfrwrrjrurxryrrrrrr1rrrrrrrbeforethisafter fortrantypesr(rr%r& groupbegins77r groupbegins90r groupendsr#endifsr"r'rrrrrr r!rrrr*r-r0r)r+r,r$Srrrr r.rr/rrArRrrXrYrrRrTrVrZr1rrrrCrDrrrrrrrKrLrMrrrrrr rr rr+r,r0r6r:r@rBrDrIrNrSrWrerr}r~r{rrrr rrrrrrrr&rrrrrr__name__rfuncsrf2f3 showblocklistargvrrgrrrrIOErrordetailrrrr)r#r#r#r$s   &   _                          )  9     `" +"  G 5  Y ^ % - K                  G