U C^ @s dZddlmZmZmZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlTe jadadadadadad ad adadadagad ad adaiad a da!da"da#t#gia$d a%ga&d a'ga(da)d a*ga+ga,ga-d d Z.dd dZ/de_0iZ1dD]Z2ddie1e2<qdD]Z2ddie1e2<q[2iZ3iZ4dD]Z5e5de3e5<e5e4e5d<qe;d"ej<j?Z@e;d#ej<j?ZAe;d$ej<j?ZBe;d%ej<j=ZCd&d'ZDeEdfd(d)ZFd*ZGd+ZHe;eGd eHeHd,fej<d-fZIe;eGd eHd.eHd.d,fej<ZJe;eGd/ej<d0fZKe;eGd1ej<d0fZLd2ZMe;eGd eMeMd,fej<d0fZNeMd3ZOe;eGd eOeOd,fej<d0fZPd4ZQe;eGd eQeQd5fej<d6fZRd7ZSe;eGd8eSeSd5fej<d9fZTe;eGd:ej<d;fZUe;eGd<ej<d=fZVe;eGd>ej<d?fZWe;eGd@ej<dAfZXe;eGdBej<dCfZYe;eGdDej<dEfZZe;eGdFej<dGfZ[e;eGdHej<dIfZ\e;eGdJej<dKfZ]e;eGdLej<dMfZ^e;eGdNej<dOfZ_e;eGdPej<dQfZ`e;eGdRej<dSfZae;eGdTej<dUfZbe;eGdVej<dWfZce;eGdXej<dYfZde;eGdZej<d[fZee;eGd\ej<d]fZfe;eGd^ej 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' 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. )divisionabsolute_importprint_functionN) __version__)*fix cCspdadadadadadadadadada ga da t gia da dadagaiadadadagagagagadadS)Nrrrr r r ) strictf77sourcecodeformquietverbosetabchar pyffilename f77modulename skipemptyendsignorecontains dolowercasedebug groupcounter grouplist neededmodule expectbeginskipblocksuntil usermodules f90modulevars gotnextfilefilepositiontextcurrentfilename skipfunctions skipfuncs onlyfuncs include_pathsprevious_contextr&r&:/tmp/pip-install-6_kvzl1k/numpy/numpy/f2py/crackfortran.pyreset_global_f2py_varss4 r(cCs,tsdSts(|rtjttj|dSN)rrsysstdoutwriter)lineflagr&r&r'outmesss  r/2zabcdefghopqrstuvwxyz$_typespecrealZijklmninteger)3intdoublefloatcharshortlongvoidcasewhilereturnsignedZunsignedifforZtypedefsizeofunionstructstaticregisternewbreakZdogotoswitchcontinueelseinlineZexterndeleteconstautolenZrankshapeindexslensizeZ_imaxminZflenZfshapestringZcomplex_doubleZ float_doublestdinstderrr+typedefaultZ_bncCs(|tkr$td|t|ft|S|S)Nz&rmbadname1: Replacing "%s" with "%s". )badnameserrmessnamer&r&r' rmbadname1 s  r`cCsdd|DS)NcSsg|] }t|qSr&)r`.0_mr&r&r' szrmbadname..r&namesr&r&r' rmbadnamesrgcCs(|tkr$td|t|ft|S|S)Nz+undo_rmbadname1: Replacing "%s" with "%s". ) invbadnamesr]r^r&r&r'undo_rmbadname1s  ricCsdd|DS)NcSsg|] }t|qSr&)rirar&r&r'rdsz"undo_rmbadname..r&rer&r&r'undo_rmbadnamesrjcCsN|d}|dkrdSd||dkr*dSd||dkr>dS||ddS)N.r r \/r)rfind)r_ir&r&r' getextension!s rpz.*[.](for|ftn|f77|f)\Zz-[*]-\s*fortran\s*-[*]-z-[*]-\s*f90\s*-[*]-z-[*]-\s*fix\s*-[*]-z[^c*]\s*[^\s\d\t]c Csd}t|d}|}d}t|r*d}nt|r:d}d}|dkr|r|ddkr|r|d8}|ddkr~t|dds|d d d krd}q|}q:W5QRX|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_format2s"  ,rc Cs8|stttttttttf }|gkr&dSt}d}d}d}t dt j }t d} t d} t d} |rp|ddd \}} d gd d t d D} dat |}|}|sq|rRda|ada|} dadatjtd}ttrt|st|sdanttr t|s datr,tantatdttttrHdpJdf|dd }|dks|ddkr~q|dd}qbtst|d\}}|d 7}|dd dkrt|d|ddd\}}|!dkrd}qtdkrb|ddkr:|dd dkr2d|dd}nd}qn trZt"|dkrZ|dd}|d| krxt#dt||rtrt"|dkr|dd ks||dd}d}d}nts4| $|}|r|%d}|r|| $|%d}d}d}n,d|dd}|r| }n|}|}|}|dk }n,d|dd}|rT| }n|}|}|}ntdkr2|s|d kr| $|r|d!}|}|st&d"q||}| $|rqƐq|'}| $|}|r|%d}|r || $|%d}d}d}n|r| }n|}|}|}|dk }nt(d#ttd$|)dt| fa|$|}|r |%d%}tj*|rt+||dd&nxtj,tgt-}d}|D]:}tj.||}tj*|rd}t+||dd&qq|std't|tj/.|fn|||} q|r(| }n|}|}d$|)dt| fa|$|}|r|%d%}tj*|r~t+||dd&nxtj,tgt-}d}|D]:}tj.||}tj*|rd}t+||dd&qԐq|std't|tj/.|fn||da|0|r|ddn|\ 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. Nrr z*\s*include\s*(\'|")(?P[^\'"]*)(\'|")z(?P.*)&\s*\Zz(\s*&|)(?P.*)z.*?'''r )r r  cSsg|] }t|qSr&)strrar&r&r'rdesz#readfortrancode.. rrfreez Reading file %s (format:%s%s) z,strict z rsruz!f2pyr )rcrsC#Zf2pyz 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" r_) dowithlineistopzAreadfortrancode: could not find include file %s in %s. Ignoring. )1rrr r r beginpatternrrrrecompileIrange fileinputZ FileInputryZ isfirstlinefilenameospathsplitext is_f_filer{_has_fix_headerrbeginpattern77beginpattern90r/repr expandtabsreplacesplit_by_unquotedlowerr|rP Exceptionmatchgroupr]rstrip ValueErrorZ filelinenoisfilereadfortrancodedirnamer$joinpathsepclose)ZffilerrZ saveglobalsZlocaldolowercasecontZ finallinellZ includelineZcont1Zcont2Z mline_markl1Z spacedigitsfinlextrl_Z origfinallinerqlcmfn include_dirsZ foundfileinc_dirZfn1r&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.*rZz|static|automatic|undefined)z([a-z]+[\w\s(=*+-/)]*?|)functionrrbegin)z [a-z\s]*? subroutinerrzprogram|block\s*dataz?|module(?!\s*procedure)|python\s*module|interface|type(?!\s*\()zBend|endprogram|endblockdata|endmodule|endpythonmodule|endinterfacez[\w\s]*endz>(end\s*(if|do|where|select|while|forall))|(module\s*procedure)z[\w]*?endif)r implicitrrr)r dimension|virtualrr dimension)r externalrrr)r optionalrrr)r requiredrrr)r publicrrr)r privaterrr)r intrisicrrr)r intent|depend|note|checkrz \s*\(.*?\).*intent)r parameterrz\s*\(.*r)r datarrr)r callrrr)r entryrrr)r callfunrrr)r commonrrr)r userrr)r containsrr r)r formatrrr)r Kthreadsafe|fortranname|callstatement|callprotoargument|usercode|pymethoddefrrf2pyenhancementsz2\s*(?P''')(?P.*?)(?P''')\s*\Z multilinec Csvtdt|@rtdtdjdt|dt|ddd}||}|rn|}|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("([^"\\]|(\\.))*"))Z not_quotedr7 single_quotedZ double_quotedbeforeafterr )setAssertionErrorrrrescaper groupdict)r- charactersrqrdr&r&r'rds rcCsBg}t|dD]$}dD]}||d}q||qd|S)N@,@z(),r,)markoutercommasplitrappendr)Zargslinearrqr&r&r' _simplifyargsxs  rz&\s*(?P\b[a-z]+[\w]*\b)\s*[=].*cCst|d\}}|rtd|std|s|dksBtt|t|d\}}|rvt||t|ddd\}}qPt||dS|dkrdatdiatiia tgia gt td<it td<dt td<dt td <d a d a dS|dkrd}t rt tkrd }t|krptd ttttftd t tdt tt tt tdd d<t t=tdaqt rt tkrt tdt tt tt tdd d<t t=tdat tdt tt tt tdd d<t t=tdad a dS|dkrdSd}ttttttttttttttttt t!t"t#t$t%t&ttfD](}|d|}|rfqr|d}qH|st'} dt krtkrnndSdt tkrt tdD]} | t(krt(| } dt tkr| t tdkrqt)d| t*|t)j+} | r| | ,d} t-| ,d} | rHd| | | ,df}n d| | f}t.d|}|s~tdt|dSt/|d|dSqt0dkst0dkrt123drda4tdtdS|ddkrdt krtkr nntdat tkr dStdkr"t5dttd|} | rn| ,dttksnt5dt| ,dtttt6ft tkr|d a t tdt tt tt tdd d<t t=tdat7sda8n|ddkrdt krtkrnn tdadSda9t/||d|da8n~|ddkr$nn|dd krbt: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);rf2pyenhancementspatternrmultilinepatternrr crackliner groupname groupcacherrrrr/rdimensionpatternexternalpattern intentpatternoptionalpatternrequiredpatternparameterpattern datapattern publicpatternprivatepatternintrisicpattern endifpattern endpattern formatpatternrfunctionpatternsubroutinepatternimplicitpattern typespattern commonpattern callpattern usepatterncontainspattern entrypatterncrackline_re_1rhrmarkouterparenrrrcallfunpattern analyzelinerr rendswithr%rrrrrr)r-resetrZ has_semicolonZsemicolon_lineflr.patrre_1r_m1m2rr&r&r'rs<                    $    rcCsdd}d}|D]R}|dkr4|d}|dkrV|d}q n"|dkrV|d}|dkrV|d}q ||}q |S)Nr r(r@(@)@)@r&)r-rrrr&r&r'rs rrcCsd}d}t||d\}}||7}|r|d|krL|dkrL|d|d7}n6||d7}|ddkrn|d7}n|ddkr|d8}t|dd|d\}}||7}q"|rtt|||f|S)Nr rz()@rrr)rrr)r-commarrrrr&r&r'r1s      rcCs|dddd}|S)Nrrrr)r)r-rqr&r&r'unmarkouterparenDsrcCs|si}|s|S||kr|St|D]}|dkrN|s@||kr||||<q(|dkrr||D]}t|||}q^q(|dkrt||||}q(|dkrt||||}q(|dkr|s||kr||||<q(|dkrq(|dkrtd|q(td t|q(|S) Nr1attrspec kindselector charselector)=typenamenote)rcheckrrrz"appenddecl: "%s" not implemented. z,appenddecl: Unknown variable definition key:)listkeys setattrspecsetkindselectorsetcharselectorr]rr)declZdecl2forcekrr&r&r' appenddeclIs8   r.zF\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|r dSq dS)Nrrr)get_intentcallbackpatternr)Zvdeclrr&r&r'_is_intent_callbackus r1cCslt|}t|}|r:|d|d|d|dfSt|}|r`|d|dddfSdgddfS)Nr_rrbind)rnameargspatternrrcallnameargspattern)r-rr&r&r'_resolvenameargspattern|s $ r5c< Cs|d}|dkrdatr|dkrtstdkrtjt dd}t d|da tdadt t<it t<gtt<gt td <it td <dt td <|t td <d t td<da|dkrX|}td|tjrd}td|tjrd}t|d\}}}}|dkr4|dkrd}nd}|dkr4t d||tfa|rbtddt| dD}ng}d|krd|kr|dqpt dd} d} |dkrd} dt tkrdS|t tdkrdSttD]} | d |krdSq|t tdkrdSd d!d|}trJtd"krJtdkrJtd#ad} |d$krJd} tdait t<gtt<| rtdkrt 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,t td-<t|t td <|t td.<tdkrtt td<n^trDtd/krDd*t tddtft td<n,d*t tddt tdd ft td<tt tD]} t t| st t| =q|t td<gt td <gt td'<gt td<it td <it td0<|d1krgt td2<|dkr|t td#d'kr4t td#d'|t t td#d t td <z,t td |t td |d3!d4=Wnt"k rYnX|d5krzz6t#t td |t td#d dt td |<Wnt"k rYnX|d6krH|rH|t td krH||ksHt#t td |t td |t td |<zt td#d|Wnt"k rxYnX|d!krt$d|d,d7|} | rt%| d| d\}}}}t&|||||dkrttdt tttttdd"d <tt=tdattdt tttttdd"d <tt=tdan|d0krt|d\}}}}|dk r|rtd8dt| dD}ng}|dkst't||t td0|<d0|tfan6|d1kr&t%||d\}}}}t&||||}|dk rd9|tfan|d:k rt td }|d(}|)d;}|dkr|d|d|d|f|d?+t td}|dk rd}d}n |d|(}||d#d}t| d}t,|dk rn|d}t d@d?+|ddd}dAdt| dDD]}t-|}| s|dBk rd} n$t.|/t dC|t|f qnt|d } | |k ri|| <|dDk r||d}|d|d}!|!st d]|qvt%|!d|!d\}}}}t?||\}"}#}$|| dQ<|"| d^<|#| d_<|$| d`<t| D]} | | s&| | =q&t|d dD]}%da|%krzdbd|% daD\}&}'Wn(t"k rt dc|%YqRYnXn |%(}&}'t,|&t,|'krdksnt dd|%qRt@tA|&tA|'dD]}(| |tB|(<qqRqv|t tdX<n|dekrLg}d})d}*d}+d},d}-|dD]}.|-s|.dfkrn|, },|.dgkr|,r|+d}+qT|.dhkr|-d}-n|.dikr|-d}-|+dkr|)|.})n\|+dkr|*|.}*nH|+d#krT|)(})|)Cd?r|)dd(})||)|*g|.})d}*d}+qT|+d#kr`|)(})|)Cd?rR|)dd(})||)|*gi}/d t tkr~t td }/d}|D]}0djd|0D}0|0ddd?kr|0ddd|0d<|0dddhkrt dk|0dqd}d}1t,|0d}2tdldt|0d dDD]}|ddhkr>t dk|qd},||2kr|,sd|0d|d?ks|0d|dfkr||, },|d}qB|d}||/kri|/|<dN|/|kr|/|dN|0d|1|dkst dm||/|dN|0d|1|df|0d|1|d|/|dN<|}1|}qq|/t td <|dk rd9|tfan|dnkr|d(}|ddgkszdo|}g}3d}+d}4d}5|D]r}.|.dgkr|+d}+q|+d/kr|4(}4|4sdp}4|3|4|5g|+d#}+d}4d}5|+d#r|4|.}4n|5|.}5q|4(}4|4sdp}4|3|4|5gi}6dnt tkr@t tdn}6|3D]\}.|.d|6krbg|6|.d<dqdt|.d dDD]}|r~|6|.d|q~qD|6t tdn<dn|4tfanX|drkrtds|dtj}|r|/}7drt tkrit tdr<|d }it tdr|<d}8dt|7kr|7dtdk rdu|7krV|7dudkrVd}8|8t tdr|dv<dwd|7dt d?D}i}9|D]r}0dN|0krtdx|0tj}!|!r|!dr(|9|!dy(<nt dzt|0n|0|9|0<|9t tdr|d{<qnnt.|/t d|n|d}krd~t tkr.rz.*?)\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" r r!r#-cSsg|] }|qSr&r<r=r&r&r'rdszZanalyzeline: expected "-" instead of "%s" in range list of implicit statement z^analyzeline: expected "-" instead of "%s" in range list of implicit statement (2) r'rmrrcSsg|] }|qSr&r<r=r&r&r'rd%sz>analyzeline: implied-DO list "%s" is not supported. Skipping. cSsg|] }|qSr&r<r=r&r&r'rd/sz=analyzeline: changing init expression of "%s" ("%s") to "%s" rz//_BLNK_cSsg|] }|qSr&r<r=r&r&r'rdjsrzT\A\s*(?P\b[\w]+\b)\s*((,(\s*\bonly\b\s*:|(?P))\s*(?P.*))|)\s*\Zr&ZnotonlyonlycSsg|] }|qSr&r<r=r&r&r'rd}sz;\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. )rrZusercodez-analyzeline: No context for multiline block. z+analyzeline: No code implemented for line. )Grr%rrrrrbasenamer rr/rrrrrrrrr5rgrremoverrrrr`r&r'rcopydeepcopyrRrr.rcracktypespec0 updatevarsrr|findrrrP namepatternprintrr0r]get_parametersdetermineexprtyper/ real16patternfinditerstartrreval SyntaxError NameError TypeErrortypespattern4implicit cracktypespecrordchr startswith isinstancerappendmultiline)cracktypespec0: no kind/char_selector pattern found for line. )rJr3logicalr2 characterrZrrrFrr) rrrr|r selectpatternrr/rr&r'rrX)r1rrmrnrrr-ror&r&r'rVs0  rVz+\s*(?P\b[\w]+\b)\s*(?P.*)\s*\ZzC\s*(\(\s*(kind\s*=)?\s*(?P.*)\s*\)|[*]\s*(?P.*?))\s*\Zz3\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]>}||dkrd||ddks2||ddkrdq2|||}q2||d}|S)Nrrrz ()[]{}=+-/* r )r|rPr)exprZexpr2ror&r&r' removespacess   rcCsd}d}d}d}|D]}|dkr6|dkr6||}|}q|dkrJ|dkrJ|}||kr\|d}n,||krn|d}n|dkr|dkr|d }q||}|}q|S) Nr rrMrl)rlrM")rMrrr@_@r&)r-rrcccbrr&r&r'markinnerspacess*  rc Csd}t||\}}}|rddt|dD}g}td} |D]D} | sLqB| | } | r|| d} | | t| d} | | qB|}ddt|dD} g}| D]D}ddtt t |dd d DD]}|r| | d dqq|D]}t |} | std t|qt| d }i}|ttdkrXttd|}d|k}|rn||d<n*|r||dkstd||d|fd|krt||d<nv|r(t|D]b}||dkr|||d|kstd|||d|||fnt|||d|<qd|krZ|rZ|rH||d<ntd||fnv|rt|D]b}||dkr|||d|kstd|||d|||fnt|||d|<qld|kr||d<n*|r|d|kstd||d|fd|kr(t||d<n.|r|D]"} | |dkr2|d | q2n@t||d<t||d<t||d<||d<t||d<| dr.tt| d}|r|}dD]2}||ddk r||d||<||d=qt|D],}||dk r.t||||<n||=q d|krd|kr|ddkrn|d|d<|d=n8|dd|d|d<|d=td |||||dfd|kr8d!|d}d|ks|ds|g|d<n\|d ||dD]D}|dd"d#kr||kr|dd$=td%|||fq8qd|kr|d&krzd|ks`|dshi|d<|d|dd'<nN|d(krd|ks|dsi|d<d|dkr|dd=|d|dd'<d)|kr.d*|kr |d*|d)ks td+||d*|d)fn |d)|d*<ntd,|| dt|D]}||s:||=q:|ttd|<d-ttkrttd- ||}q|S).NcSsg|] }|qSr&r<r=r&r&r'rdszupdatevars..rz(?P[a-zA-Z]+)r_cSsg|] }|qSr&r<r=r&r&r'rdscSsg|] }|qSr&r<r=r&r&r'rdsrrz@ @rz;updatevars: no name pattern found for entity=%s. Skipping. r_rr1zIupdatevars: attempt to change the type of "%s" ("%s") to "%s". Ignoring. r zVupdatevars: attempt to change the kindselector "%s" of "%s" ("%s") to "%s". Ignoring. r!zEupdatevars:%s: attempt to change empty charselector to %r. Ignoring. zVupdatevars: attempt to change the charselector "%s" of "%s" ("%s") to "%s". Ignoring. r#zMupdatevars: attempt to change the typename of "%s" ("%s") to "%s". Ignoring. rr)rParrayinit2rPrr rz-updatevars: "%s %s" is mapped to "%s %s(%s)" dimension(%s) rr z5updatevars:%s: attempt to change %r to %r. Ignoring. rJr3rr2rrrr"zTupdatevars: attempt to change the init expression of "%s" ("%s") to "%s". Ignoring. z?updatevars: could not crack entity declaration "%s". Ignoring. rC)rerrrrrrrrPrrrrrYr/rr`rrrTr&r'r]lenarraypatternrrr)r1rmrZ entitydeclrprxryr#rrrrselZel1rIe1ZenameroZnot_has_typespecr-rd1lkdmZdm1r&r&r'rWs6   (     $   $                       rWc Csd}d}d}|r|dkrt|}|s\w+)\s*\)r_z'cracktypespec: no typename found in %s z'cracktypespec: no selector used for %s )r rr/rrr&r'itemsr`r!lenkindpatternrrrr) r1rmrxryr#r-rorrr&r&r'resp               recCs|si}|s|Sd|kr&|g|d<|S|r8|d|||dkrH|S|dkrld|dkrl|d|nz|dkrd|dkr|d|nV|dkrd|dkr|d|n2|dkrd|dkr|d|n|d||S)NrrD automaticrrr)r+rnr,r&r&r'r(s*  r(cCsZ|si}|s|Sd|kr$||d<|St|D]$}|sD||dkr0|||d|<q0|S)Nr r&r'r+selr,r-r&r&r'r)sr)cCsZ|si}|s|Sd|kr$||d<|St|D]$}|sD||dkr0|||d|<q0|S)Nr!rrr&r&r'r*sr*unknowncCsd|kr|dS|S)Nr_r&)rrr&r&r' getblocknamesrcCs2zd|d|dfaWntk r,YnXdS)Nz In: %s:%s r7r_)rr)rr&r&r' setmesstextsrcCs2i}d|krt|d}d|kr.||d|S)N parent_blockr) get_usedictupdate)rusedictr&r&r'rs  rc Cs|dkr i}t|}|s|St|D]\}}|}|tkrXtd||dfq(t|}t|}|snq(|r~td|t|D]0\}}||krtdt |t |f|||<qq(|S)Nz0get_useparameters: no module %s info used by %s r_z+get_useparameters: mapping for %s not impl.zDget_useparameters: overriding parameter %s with value from module %s) rr&rrrr/r/r[r]r) r param_maprZusenamemappingmvarsrsr-rur&r&r'get_useparameterss2   rc sts|St|tr*fdd|D}|St|td|dfddkrXt|dk rd|kr|d}t|D]@}||}d|kr||d}d|kr||d}|kr|||d<q|fd d|d D} | |d <|S) Ncsg|]}t|ddqSrt)tabr postcrack2)rbgrrr&r'rd<szpostcrack2.. %sBlock: %s r_rrr rcsg|]}t|ddqSrr)rbbrr&r'rdOsr)rrir&rr/rr') rrrretrrvarrvalZnew_bodyr&rr'r6s4   rcCsPt|trfg}g}|D]F}t|t||dd}d|krRd|dkrR||q||q||St|t|tsd|krtdt|d|kr|ddkstd||dfd t |}t |}t ||d <t |d |d <d |kr|d r|d }t |||d|d <g}d|krP|d}t|D]}d|kr2||q2ni}d} d|krj|d} d|kr>|dr>g} d|kr|d} t|d } | r| d} nd} | |krd} d| | f|kr| d} qd| | f} dgi| dd}|dD]}|| krg}d}|d D]}|d}|ddkr&d} |d D]@}| d} d|krL|d|krLt|}|d | =qqL|r&|d s|d |=| | |=qq&|d |n(|| krt| |s| ||d |<q|d s|d r>| |d<d|gi| |dd}i|| <t||rL||d<|S)zi TODO: function return values determine expression types if in argument list rtrr_rHrz0postcrack: Expected block dictionary instead of r@rrrZsortvarsrrrr rrZ__user__routinesZunknown__user__routinesrz%s_%ir;Z_user_interface)rrrr_r r9)rrrr_r)rir&r postcrackrdictrrr/ analyzeargs analyzecommon analyzevars sortvarnames analyzebodyr'rTrRZ isexternalr)rrrZgretZuretrZ userisdefinedZuseblockr-r_rrZmnameror;rIZedefr}rZbbZmblockr&r&r'rVs                        rcCsg}g}t|D]2}d||kr<||dr<||q||qt|}d}|r|d}d}|ddD]}|||dkrpd}qqp|r|dd|g}|d}||krtdd|d||}qqT|||dd}t|}d}qT|S)NdependrrzTsortvarnames: failed to compute dependencies because of cyclic dependencies between z, r)r&r'rrPr]r)rZindepdeprurrorwr&r&r'rs>    rcCst|s |Sg}t|dD]<}g}|d|D]}td|tj}|r2g}|dr~ddt|ddD}t |d }||dkrd |d|kr|d|d  d d |nd d |g|d|d <n0|rd d d |gi|d|<n i|d|<||krF| |n|}t d ||f| |q6||d|<q d |krt||d <n|d ||d <|S)Nrz2\A\s*\b(?P.*?)\b\s*(\((?P.*?)\)|)\s*\ZdimscSsg|] }|qSr&r<r=r&r&r'rdsz!analyzecommon..rr_rrrrzNanalyzecommon: failed to extract "[()]" from "%s" in common /%s/. commonvars)Z hascommonr&r'rrrrrrr`r|rrr])rrr-ZcomvarsrIrrrr&r&r'rsT           rcCst|g}|dD]}||d<|ddkr|dk rD|d|krDqn|d}|dtkrZqtrl|dtkrlqt|ddd |d <n|}t|||d d }|dd kr|dsd|krq|ddddkrt|q|ddkr|dt|d<||q|S)NrrrrDr_rz T as_interfaceZsaved_interfacertrr;rrr pythonmoduler?r) rr"r#crack2fortrangenrrrrr)rrrrrZas_r&r&r'rs8       rcCst|t}i}d|kr|ddkrFd}tdkrtdt|dnRt|dD]@}|d|ddkr|d|||<qV|d|d||<qV||fS)Nrrz6buildimplicitrules: no implicit rules for routine %s. r_r1)rDr)rdefaultimplicitrulesrr/rr&r'r/)r implicitrules attrrulesr-r&r&r'buildimplicitrules%s rcCs8t|||}t|tdtdfkr(|Std|dS)Nrgzr=%r)r`rZr)rIrrrqr&r&r'myeval8s rz \A\b\w+\b\Zc Cs ztt|ii}d|dfWStk r0YnXt|rFdd|fSt|}|D]}t||krfqRtd|d|r|qRtd|dtj }||}|rRzF||}|rd| dd| d f}||}qt|ii} ||}|rd| dd| d f}||}qt|ii| } ||}|rbd| dd | d f}||}q4t|ii}||}|rd| dd | d f}||}qxt|ii} | d | |kr| d | | kr| | |fWSWntk rYnXqqRd S) Nrrz\w\s*\([^)]*\b\b(?P.*?)\b\b(?P.*)z%s(%s)%srrg?g?)NNN) r4rrgetlincoef_re_1rrPrsearchrrr) rIZxsetrZlen_er>rrreerrc2r&r&r' getlincoefAsv               $rz \A[a-z]\w*\Zrc Csg}z|t|diiWn"tk r@||dYnXz|t|diiWn"tk r~||dYnXt|dtrd|d}|dkrt|d}n,|dkrd|d| f}nd|d|f}nZt|dtr$d|d}|dkrd|d}nd||df}nd|d|df}ztt|iiddfWStk rfYnXt|d|t|d|}}d|d|dfkr|d|dfdkrt|d|ddddfS|d|dd}|dd|d f}|d||d f}|ddkr|d |kr|dkr^d |d|d | f|d d | |dffS|rd |d|d |f|d d ||dffSd|d|d f|d d|dfS|ddkrp|d |krp|dkrd |d |d | f|d d | |d ffS|rFd |d |d |f|d d ||d ffSd|d |d f|d d|d fS|d |d kr.|d |kr.|d|d} | st|ddfS|dkrd | |d | f|d d | | ffS|rd | |d |f|d d || ffSd| |d f|d d| fS|d|dkrNdkrnnt|d } | |krt| r~t d| d| } |dkrd|d | f}n2|dkrd|d | | f}nd|d | |f}n|ddkrt|d } | |krt| rt d| d| } |ddkr*n(|ddkrBd| } nd|d| f} |dkrb| }n&|dkr|d| | f}n d| |f}n"|ddkrjt|d } | |krt| rt d| d| } |ddkrd| } nJ|ddkrd| } n2|ddkr d|d | f} nd|d| f} |dkr@| }n&|dkrZd| | f}n d| |f}nDt|d } | |krt| rt d| d| } |ddkrd| } nJ|ddkrd| } n2|ddkrd|d | f} nd|d| f} t|d } | |kr4t| r,t d| d| } |ddkrDn(|ddkr\d| } nd|d| f} |dkrd| | f}n*|dkrd| | | f}nd| | |f}|ddfS)Nrrz%s-%sz%s+%sz-(%s)z%s-(%s)z %s-(%s)+1)rrrz %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+%sr z-%s%s*%sz+%sz+%s*%sz-%s*%sz%s%sz%s%s-%sz%s%s+%s) rrrrir4rrr_varname_matchr/) r{rstarZedlp1rrZd2rrrrZc1r&r&r' getarrlenws    0,& 40*  ($$                                  rz\b[a-z][\w$]*\bcCs||kr||dg}d||krbt||sbt||dD]}||krB||krB||qB|ddD]4}||gpt|||D]}||kr||qqnntdt|g}|||<|S)Nrr"z,_get_depend_dict: no dependence info for %s )r/isstring word_patternfindallr_get_depend_dictr/r)r_rdepswordswordrr&r&r'r s    rcCs*t|}i}|D]}t|||q|Sr))r&r'r)rrf depend_dictrr&r&r'_calc_depend_dict# s  rcstg}tD]}|s|||=qrtD]8\}}fdd|D}|sv|||=qF||<qFq6fdd|DS)z csg|]}|kr|qSr&r&)rbr)rr&r'rd6 sz$get_sorted_names..csg|]}|kr|qSr&r&)rbr_)rr&r'rd< s)rr&r'rr)rrfr_lstZnew_lstr&)rrr'get_sorted_names+ s   rcCs@|ddkr|dd}t|r&dSt|r4dSd|dS) Nr'"rr zkind(r)r]r real8pattern)rWr&r&r' _kind_func? s    rcCsLd|}|dkrdS|dkr dS|dkr,dS|dkr8d S|dd krHd Sd S) Nrrirlrlrr r&)rqrr&r&r'_selected_int_kind_funcJ s rcCsX|dkr dS|dkrdSt}|dr<|dkrTdSn|dkrHdS|dkrTdSd S) Nrrr)Zaarch64powerppcZriscvZs390xZsparcrr )platformmachinerrh)prqradixrr&r&r'_selected_real_kind_funcZ s  rc Cst|}t|}dtfdtfdtffD]\}}||kr*|||<q*g}t|D]*}d||krPd||dkrP||qPtdtj}tdtj} tdtj} |D]j}d ||kr||d } t ||r| } d D]} | j | } q| d | } | d | } d } d||kr^d||dkr^t | }| d||ddd} t | |k} | s| | s| d}t |dkrd|dd |d d} t||rt| }t| D]:}t| || dd|||<qd|} n@t||rV| ddkrV| ddkrVt| ddd}zt| ||||<Wn@tk r}z | ||<td|t| fW5d}~XYnXt||rt||trt ||||<| }||kr||||<qt!||tdt|q|S)NrZselected_int_kindZselected_real_kindrrz \bkind\s*\(\s*(?P.*)\s*\)z-\bselected_int_kind\s*\(\s*(?P.*)\s*\)z4\bselected_(int|real)_kind\s*\(\s*(?P.*)\s*\)r"))z.false.False)z.true.Truez kind("\1")zselected_int_kind(\1)Fr rr rr rrIrrrrzget_parameters: got "%s" on %s z2get_parameters:parameter %s does not have value?! )"rTrrrrrrrrZ islogicalrrsubrPrrrZisdoubler&r]r^r_rZ iscomplexrr`rr/rrrir4rgrZ)rZ global_paramsrsZg_paramsr_funcZ param_namesrZkind_reZselected_int_kind_reZselected_kind_rerureplZ is_replacedZ orig_v_lenZv_rtrrrvnlr&r&r'r[m s               &  &   r[cCs|dkr dSt||S)N)z(:)(*)rr) _eval_scalar)lengthrsr&r&r' _eval_length srz\d+_c Cst|r|dd}ztt|i|}WnXtttfk rH|YStk r}ztd||t | fW5d}~XYnX|S)Nrrz,"%s" in evaluating %r (available names: %s) ) _is_kind_numberrrr`rbrarcrr]r&r')valuersrvr&r&r'r src6 Cst|t|\}}t|d}|ddkrF|d|krFi||d<d|dkr|d=d|ddkr|ddd}t|D](}dD]}||krt|||||<qqg}|d}|D]0} z|| || Wqtk rYqXqt|D]}||kr||qt|t |} i} t d j } t|D]d} | | }|r>| | |}z | |Wn.tk rt d | t jj | |<YnXq>|D ]}|d t|krt||||d ||<d ||krd||kr d ||dks|r|d }t||D]z}|d krR|||dkrRq.|||krv||||||<n0|dkr.|||D]}t|||||<qq.n&||dkrtdt||dfd||kr>d||dkr>||dd}ztt|i| }Wntk r,YnX|||dd<d||krd||dkr||dd}ztt|i| }Wntk rYnX|||dd<i}d||krZ||d}|g||d<d\}}}}}|D]} | dddkr | dddd}n| dddkrL| dddd}n| dddkrx| dddd}nj| dddkr| dddd}n>| dddkr| dddd}nt||| ||<|rVd||krg||d<d d!t|d"DD]6}|d#d}|||dkr||d|qd}|r|d$d%}|d&d'}d||kr|g||d<n||d|d}|dk rd||krg||d<td(d!t|d"DD]*}|||dkr||d|qd}|dk rd||kr|t j r&|$|' q&||k rd||k r||dD]:}(|(dddk r|$|(ddddd97}$ qd||k r|$||d}$|"d}"||k r$d||k r$d?||k r$|||dk r$t#t$t%t&|| r$|g||d<|#dk rhd@|&| ||"|%f||d?<ndA|&||%f||d?<d||k r|#dk rdB|&| ||"|%|fg||d<ndC|&||%|fg||d<d||k rdDg||d<dD||dk rtdE||dk rt||ddDnP|dFk r|! r||k r\||$k rt||d|n||d|$||d< qnt'|| rd3})d||k rd+||dk rt(||dd+| })|)||dd+<nFd||dk rt(||dd| })||dd=|)||dd+<||d s2||d=|! rP||d sP||d=d?||krd||k rxg||d<dD||dk rdE||dk r||ddDd||krg||d<t| )D].\} }|||d? r||d|  q||ds||d=t*||rt+||d?| ||d?<qt|D]}||dkrTd||kr||d|d<|ddkrTdG|kr|dG|krt,||||dG||<dH|krT|dH}*d }+d},|*dId}-|*|-k }+|-dJd}*|*|-k },t-d  |*}|rt.|dK|d0\}.}/}}0t/|.|/\}1}2}3|.||d <|1rd|1krzt|1di| |1d<Wntk rYnX|1||d<|2r|2||d<|3r|3||dL<|+rt||dI||<|,rt||dJ||<ntdMt|dHqT|ddNkrdO|krDt|d|dO}4nt|d}4t|D]$}t#t0t1||r^|4|q^dP|kr|42t|dPt|dPD].}|dP|D]}||4kr|4|qĐq|ddkrdG|kr |4|dGn|4|d|ddQkrX|d}5|5|krXd||5krX||5d|d<|ddRkrx|42t|t|D]}||4kr||=q|S)SNrrrr_r rrGrz \w[\w\d_$]*z.*\b%s\brr1rZ undefinedzCanalyzevars: typespec of variable %s is not defined in routine %s. r!rPr r)NNNNNrrrr rrrrur%rr$cSsg|] }|qSr&r<r=r&r&r'rd? szanalyzevars..rrz\n\nz z\n rcSsg|] }|qSr&r<r=r&r&r'rdP scSsg|] }|qSr&r<r=r&r&r'rdW scSsg|] }|qSr&r<r=r&r&r'rd] sr:rrrrz@:@r1z1 * z/(1)rQzoanalyzevars: character array "character*%s %s(%s)" is considered as "character %s(%s)"; "intent(c)" is forced. rrz'analyzevars: charselector=%r unhandled.rz.*?\brr"z %s%s(%s,%s)%sz %slen(%s)%sz%s%s(%s,%i)%s==%sz%slen(%s)%s>=%srrrrrrAZpure recursiverr#z'analyzevars: prefix (%s) were not used )r?rr9r8rr)rrrZ)3rrrTr&r'r(rKeyErrorr[rrrrr_rrrr/rrr`rreverser|rrrrgrrPrZ isintent_cZ isstringarrayr]rZl_orZ isintent_inZisintent_inoutZisintent_inplacerrrZisscalarrr.rrVreisintent_callbackZ isintent_auxextend)6rrrrgenrr-ZsvarsrrrsZ dep_matchesZ name_matchrurZln0rZ savelindimsrnZdimrrr%r$rtmprrrrr{ZdiZ shape_macror.roniZddepsadpdrqZaarprZispureZisrecZpr1r1rmrorxryr#Z neededvarsr_r&r&r'r s      "                 "              &        &                               rz\A[a-z]+[\w$]*\Zc Csf|}t| }|rt|\}}t||d|}d}|D](} | } | tjtjkrXd} || }q8|ddkrx|d}n|d}|}||dks||dkr|d}q||krd } |t| |kr| d } q|t| }|r||d|<nx||dkr(||dkr|d||d|<n i|d|<d |krb||d |d krbt |d|d |d|<|S) NrZe_rr rI_errqrrrr) analyzeargs_re_1rrr\rrWascii_lowercasedigitsrr() rrrZorig_aZ a_is_exprrratnarr-r&r&r' expr2name; s>          rcCst|t|\}}d|kr$g|d<g}|dD]}t|||}||q0||d<d|krt|dD]*\}}|D]}||dkrxi|d|<qxql|dD]B}|d|krd|krg|d<|d|dkr|d|dqd|kr|d|dkri|d|d<|S)Nrrrrr_rr)rrrrr&r)rrrrrr-Zargs1rr&r&r'r` s.       rz\A\(.+?[,].+?\)\Zz\A[+-]?\d+(_(?P[\w]+)|)\Zz-\A[+-]?[\d.]+[\d+\-de.]*(_(?P[\w]+)|)\Zz \A\(.*\)\Zz\A(?P\w+)\s*\(.*?\)\s*\ZcCsTt|trddiSt|tr$ddiSt|tr6ddiSt|trD|Stt|dS)Nr1r3r2rJ)rir4r6rJrrr)rqr&r&r'_ensure_exprdict s    rcCs||krt||S|}t|r.ddiSt|}|rjd|krb|drbtdt|ddiSt |}|rd|kr|drtdt|ddiSdD]J}dd t ||d  d |d DD] }||krt||Sqqi}t |rt |d d ||}nft|}|r|d}t |d||}|r^d|kr^|d=|s|d|krt||dS|ddkrdddidS|stdt||S)Nr1rJr_z:determineexprtype: selected kind types not supported (%s) r3r2)+rLrrmcSsg|] }|qSr&r<r=r&r&r'rd sz%determineexprtype..rrrr rrrrr)r1r!z>determineexprtype: could not determine expressions (%s) type. )rr|determineexprtype_re_1rdetermineexprtype_re_2rrr/rdetermineexprtype_re_3rrdetermineexprtype_re_4r\determineexprtype_re_5)rrrulesroprIrlZrnr&r&r'r\ sT      (    r\rFcCst|d}t|trf|D]F}|rN|ddkrN|dtkr%sr)rrrrrr-r&r&r'r( s(  r(c CsR|d}g}|D]<}ztd|}Wntk r<d}YnX|r||q|S)Nrzisintent_%s(var)r)r`rbr)rrrrrr&r&r'true_intent_list( s  r,c Cst|d}g}|D]}||dkr||qd|krn|dD],}||kr`||krl||q@td|q@d|kr||d|st|D]}||kr||q|D]H}d||kr ||dD]8}||krd||kr|||dkrtd||fqd|kr||dkrt||r>d |||f}d |||f}t||rhd |||f}||krd ||krqd } |dD],} || dkr| ddkrd} qq| rq||krt|t d|q||dkr|ddksqd ||krbd||krHd||dkrH||krd |||f}qt||t d|q||d } | dkrd||krd| ||df} i} d||kr||d} nd||kr||d} d| kr| ddkrd| | df} nd| | df} nZd | krPd!| | d f} d"| krFd#| | d"f} nd$| } nd"| krjd%| | d"f} d&} d||krd'd(||dD}|rd)| d* |f} d*} d+||krd,| | d* ||d+f} d*} d-||krt ||}|rd.| | d* |f} d*} d/||krBd0| | d* ||d/f} d*} d||krpd1| | d* ||df} d*} d2||kr||d2}||d d3krzt |}d4|j |jf}Wntk rYnXd5| ||f} n d6| |f} d7||| f}q|S)8z& TODO: public sub ... r rrz7vars2fortran: Confused?!: "%s" is not defined in vars. rCrzHvars2fortran: Warning: cross-dependence between variables "%s" and "%s" rz%s%sintent(callback) %sz%s%sexternal %sz%s%soptional %sr1rrr_rrrz/vars2fortran: No definition for argument "%s". rrz-vars2fortran: No typespec for argument "%s". rZr#z%s(%s)r r!rr z%s*(%s)rrPz %s(len=%srz %s,kind=%s)z%s)z %s(kind=%s)rcSsg|]}|dkr|qS))rr&)rbrr&r&r'rd sz vars2fortran..z%s, %srrz%s%sdimension(%s)rz%s%sintent(%s)r%z %s%scheck(%s)z%s%sdepend(%s)r")rJrz(%s,%s)z %s :: %s=%sz%s :: %sr+)rrr]rr&r'rZ isoptionalshowr/rr,r`r2imagr)rrrrrrZnoutrrrrZvardefrmrrnrrur&r&r'r*5 s      $                  r*cCsHtddt|ttddgattd}tddt|}t|S)NzReading fortran codes... rzPost-processing... zPost-processing (stage 2)... )r/rrrrrr)filespostlistr&r&r' crackfortran s     r1cCs$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)rpyfheaderfooterr&r&r' crack2fortran s  r6__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-mrLzUnknown 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)r)r)r)r)r)N)r N)Nr )r )NN)r)rr)rF)r )r )r F)__doc__ __future__rrrr*rWrrrrTrr rZauxfuncsversionr2r r rrrrrrrrrrr rrrrrrrrr$rr#r%rr"r!rr(r/ _MAXCACHErrr\rhrr`rgrirjrprrrrrrzr{rr}rr-rZbeforethisafterZ fortrantypesrrdrrZ groupbegins77rZ groupbegins90rZ groupendsrZendifsrrrrrrrrrrrrr r rrr r rSrrrrr rrrrr.rr3r4r]rr0r1r5rrjrVrYr r!rrrrrWrer(r)r*rrrrrrrrrrrrrrrrrrrrrrr[rrrrrrrr r!r"r#r$rr\rr)r(r,r*r1r6__name__r/funcsrf2Zf3Z showblocklistargvrr]rrxrrIOErrorZdetailrr0r3r,r&r&r&r'sN  &   Q          ' 9       `"+ " 3     Y ^ % - K  z              $