2[c3@`sdZddlmZmZmZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlTe jadadadadadd ad ad adadadagad ad adaiad a da!e"a#da$igt$6a%d a&ga'd a(ga)e"a*d a+ga,ga-ga.d Z/dd Z0de_1iZ2xdD]Z3idd6e2e3d?d@dAdBdCdDdEdFg3D]"Z6e6dGe4e6Z?ej<dNej=j@ZAej<dOej=j@ZBej<dPej=j@ZCej<dQej=j>ZDdRZEeFddSZGdTdUdVZHdWZIej<eHd eIeIdXfej=dEfZJej<eHd eIdYeIdYdXfej=ZKej<eHdZd[d[dXfej=d\fZLej<eHd]d^d^dXfej=d\fZMd_ZNej<eHd eNeNdXfej=d\fZOeNd`ZPej<eHd ePePdXfej=d\fZQdaZRej<eHd eReRdbfej=dcfZSddZTej<eHdeeTeTdbfej=dffZUej<eHd dgdgdXfej=dgfZVej<eHd dhdhdXfej=difZWej<eHd djdjdXfej=djfZXej<eHd dkdkdXfej=dkfZYej<eHd dldldXfej=dlfZZej<eHd dmdmdXfej=dmfZ[ej<eHd dndndXfej=dnfZ\ej<eHd dododXfej=dofZ]ej<eHd dpdpdqfej=drfZ^ej<eHd dsdsdtfej=dsfZ_ej<eHd dududXfej=dufZ`ej<eHd dvdvdXfej=dvfZaej<eHd dwdwdXfej=dwfZbej<eHd dxdxdXfej=dxfZcej<eHd dydydXfej=dyfZdej<eHd dzdzdXfej=dzfZeej<eHd d{d{d fej=d{fZfej<eHd d|d|dXfej=d|fZgej<eHd d}d}dXfej=ejhBd~fZiej<dejhdfZjdZkej<dej=ZlddZmdZnddZodZpddZqej<dej=Zrej<dej=Zsej<dej=Ztej<dZuej<dZvej<dej=ZwdZxdZydZzdZ{dZ|ej<dej=Z}ej<dej=Z~ej<dej=Zej<dej=Zej<dej=ZdZdZdZdZddZddZddZddZdZdZe"dZd e"dZe"d dZdZdZd dZdZe"e"dZej<dej=ZdZej<dj>ZddZej<dej=ZdZdZdZdZdZdddZidZdZej<dj>ZdZdZej<dej=ZgdZdZej<dej=Zej<dej=Zej<dej=Zej<dej=Zej<dej=ZdZidZdedZd dZd dZdZd edZdZdZedkrgZgZdZdZdZdZxejdD]Zed kr] neddkrv dZnedkr dadanedkr dadanedkr tr e0ddndadanWedkr danBedkr dan-edkr" dadanedkrC dadadanedkrX dZnedkrm dZnedkr dZneddkr edeener dZeanver dZeanaer'y!eejejeWn'ek r#ZedeenXn ejeqH Wt oItoIt r\e0ddneeeZtre0detdeeZetdZejeWdQXnereFenndS(s crackfortran --- read fortran (77,90) code and extract declaration information. Copyright 1999-2004 Pearu Peterson all rights reserved, Pearu Peterson 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,funcs)` `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. i(tdivisiontabsolute_importtprint_functionNi(t __version__(t*tfixit ticC`sdadadadadadadadadada ga da igt 6a da dadagaiadadadagagagagadadS( NiRiiRRis (t strictf77tsourcecodeformtquiettverbosettabchart pyffilenamet f77modulenamet skipemptyendstignorecontainst dolowercasetdebugt groupcountert grouplistt neededmodulet expectbegintskipblocksuntilt usermodulest f90modulevarst gotnextfiletfilepositiontexttcurrentfilenamet skipfunctionst skipfuncst onlyfuncst include_pathstNonetprevious_context(((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pytreset_global_f2py_varss4  cC`s@ts dSts<|r)tjjtntjj|ndS(N(R R tsyststdouttwriteR(tlinetflag((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pytoutmesss i2sabcdefghopqrstuvwxyz$_trealttypespectijklmntintegertinttdoubletfloattchartshorttlongtvoidtcasetwhiletreturntsignedtunsignedtiftforttypedeftsizeoftuniontstructtstatictregistertnewtbreaktdotgototswitchtcontinuetelsetinlinetexterntdeletetconsttautotlentranktshapetindextslentsizet_itmaxtmintflentfshapetstringtcomplex_doublet float_doubletstdintstderrR%ttypetdefaultt_bncC`s0|tkr,td|t|ft|S|S(Ns&rmbadname1: Replacing "%s" with "%s". (tbadnamesterrmess(tname((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt rmbadname1 s  cC`sg|D]}t|^qS(N(Rd(tnamest_m((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt rmbadnamescC`s0|tkr,td|t|ft|S|S(Ns+undo_rmbadname1: Replacing "%s" with "%s". (t invbadnamesRb(Rc((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pytundo_rmbadname1s  cC`sg|D]}t|^qS(N(Ri(ReRf((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pytundo_rmbadnamescC`sS|jd}|dkrdSd||kr3dSd||krGdS||dS(Nt.iRs\t/i(trfind(Rcti((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt getextension!s s.*[.](for|ftn|f77|f)\Zs-[*]-\s*fortran\s*-[*]-s-[*]-\s*f90\s*-[*]-s-[*]-\s*fix\s*-[*]-s[^c*]\s*[^\s\d\t]cC`sd}t|d}|j}d}t|r?d}nt|rZd}d}nx|dkr|r|ddkr|jr|d8}|ddkrt|d s|dd !d krd}Pqn|j}q]WWd QX|S( s(Check if file is in free format Fortran.itriit!s iiit&N(topentreadlinet _has_f_headert_has_f90_headertstript_free_f90_start(tfiletresulttfR'tn((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pytis_free_format2s"      3c C`s|s*tttttttttf }n|gkr:dSt}d}d}d}t j d}t j dt j } t j d} t j d} t j d} |r|dd nd*\}} d ggt d D]}t |^q}datj|}x+tr3|j}|s%Pn|jrda|jad a|} dad atjjtd }ttrt|pt| rd an"ttrt| rdantrtantatdttttrdpdfn|jj dd }x.|dksJ|d dkr=Pn|d }qWts|j!|}|r|j"dd }|j"d}|d j#dkr|d+}|j!|d}|r||j"d}q||d}qqn|j$dkr d}q ntd kr|dd,kr^|d d!j#dkrRd|d}qd}q n(trt%|dkr|d }qn|d|krt&dt|n| strt%|dkr|dd k r||d }d}d}q ts| j!|}|r)|j"d}n|rZ|| j!|j"d}d}d}n5d|d}|r}|j#}n|}|}|}|dk }q d|d}|r|j#}n|}|}|}n5tdkr| rg|d!krg| j!|rg|d"}xGtrW|j}|s7t(d#Pn||}| j!|rPqqW|j)}n| j!|}|r|j"d}n|r|| j!|j"d}d}d}n'|r|j#}n|}|}|}|dk }nt*d$ttd%|j+d t| fa| j!|}|r |j"d&}tjj,|rwt-|d'|d(dq*tjj.tgt/}d}xU|D]M}tjj0||}tjj,|rd }t-|d'|d(dPqqW|s*td)t|tj1j0|fq*n |||} q W|rI|j#}n|}|}d%|j+d t| fa| j!|}|rj|j"d&}tjj,|rt-|d'|d(dqttjj.tgt/}d}xU|D]M}tjj0||}tjj,|rd }t-|d'|d(dPqqW|sttd)t|tj1j0|fqtn ||da|j2|r|dd n!|\ aaaaaaaaadS(-s 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. NiRsS(?P([^"]*["][^"]*["][^"!]*|[^\']*\'[^\']*\'[^\'!]*|[^!\'"]*))!{1}(?P.*)s*\s*include\s*(\'|")(?P[^\'"]*)(\'|")s(?P.*)&\s*\Zs(\s*&|)(?P.*)s.*?'''iRi iRtfrees Reading file %s (format:%s%s) s,strictss R'trestitf2pyRtcRqtCt#is iHsxreadfortrancode: Found non-(space,digit) char in the first column. Are you sure that this code is in fix form? line=%sis.pyfs s.Unexpected end of file when reading multiline s6Flag sourcecodeform must be either 'fix' or 'free': %ssLine #%d in %s:"%s" Rct dowithlinetistopsAreadfortrancode: could not find include file %s in %s. Ignoring. (RRs (RRRqRR(3RRRR Rt beginpatternR R RtretcompiletItrangetstrt fileinputt FileInputtTrueRtt isfirstlinetfilenametostpathtsplitextt is_f_fileRvt_has_fix_headerR}tbeginpattern77tbeginpattern90R)treprt expandtabstreplacetmatchtgrouptlowerRwRNt ExceptionR!Rbtrstript ValueErrort filelinenotisfiletreadfortrancodetdirnameR tjointpathseptclose(tffileRRt saveglobalstlocaldolowercasetcontt finallinetllt commentlinet includelinetcont1tcont2t mline_marktl1Rft spacedigitstfintltextRptrlt origfinallinetlctmtfnt include_dirst foundfiletinc_dirtfn1((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyRJsb    ,           0    "      &   &  s"\s*(?P%s(?=\s*(\b(%s)\b)))s\s*(?P(\b(%s)\b))s\s*(?P%s)\s*\Zsqcharacter|logical|integer|real|complex|double\s*(precision\s*(complex|)|complex)|type(?=\s*\([\w\s,=(*)]*\))|bytes.*s|static|automatic|undefineds([a-z]+[\w\s(=*+-/)]*?|)tfunctiontbegins [a-z\s]*?t subroutinesprogram|block\s*datas?|module(?!\s*procedure)|python\s*module|interface|type(?!\s*\()sBend|endprogram|endblockdata|endmodule|endpythonmodule|endinterfaces[\w\s]*tends>(end\s*(if|do|where|select|while|forall))|(module\s*procedure)s[\w]*?tendiftimplicitsdimension|virtualt dimensiontexternaltoptionaltrequiredtpublictprivatetintrisicsintent|depend|note|checks \s*\(.*?\).*tintentt parameters\s*\(.*tdatatcalltentrytcallfuntcommontusetcontainstformatsKthreadsafe|fortranname|callstatement|callprotoargument|usercode|pymethoddeftf2pyenhancementss2\s*(?P''')(?P.*?)(?P''')\s*\Zt multilinecC`scg}xMt|jdD]6}x dD]}|j|d}q)W|j|qWdj|S(Ns@,@s(),t_t,(tmarkoutercommatsplitRtappendR(targslinetaR|Rp((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt _simplifyargsns  s&\s*(?P\b[a-z]+[\w]*\b)\s*[=].*c C`sd|kr|tdj|p/tdj| r|xB|jdD]1}|dksgtt|t||qCWdS|dkrdaidt6aiit6a igt6a gt td[^"]*)\b%s\b\s*@\(@(?P[^@]*)@\)@.*\Ztbeforetargsscallfun %s(%s) result (%s)Rzscallfun %s(%s)s8crackline: could not resolve function call for line=%s. Rs.pyfs"crackline:%d: No pattern for line Rs>crackline: groupcounter(=%s) is nonpositive. Check the blocks.tthissGcrackline: End group %s does not match with previous Begin group %s %sRRR(<tf2pyenhancementspatternRtmultilinepatternRtAssertionErrorRt cracklineRt groupnamet groupcacheRRRRR)Rtdimensionpatterntexternalpatternt intentpatterntoptionalpatterntrequiredpatterntparameterpatternt datapatternt publicpatterntprivatepatterntintrisicpatternt endifpatternt endpatternt formatpatternRtfunctionpatterntsubroutinepatterntimplicitpatternt typespatternt commonpatternt callpatternt usepatterntcontainspatternt entrypatterntcrackline_re_1RhRtmarkouterparenRRRtcallfunpatternt analyzelineR RRtendswithR!R"RRRRRR( R'tresetRtflR(tpatRtre_1Rctm1tm2R((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyRys                  $ -            cC`sd}d}x|D]z}|dkrN|d}|dkr|d}qqn5|dkr|d}|dkr|d}qqn||}qW|S(NRit(is@(@t)s@)@((R'RR{R((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyRs           RcC`s#d}d}d}x|D]}| s2|dkrQ|dkrQ|d}d}n| r|dkr| s{|ddkr|d}d}n^||kr|d}|dkrd}qn0||kr|dkr|d |d }qn||}qW| stt||||f|S( NRiRRis'is\t@(RR(R'tcommaRR{tccR((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyR"s(   *      %cC`s"|jddjdd}|S(Ns@(@Rs@)@R(R(R'Rp((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pytunmarkouterparen9scC`sp|si}n|s|S||kr)|Sx@t|jD],}|dkrt|s`||krh||||s6         sF\s*(?P(@\(@.*?@\)@|[*][\d*]+|[*]\s*@\(@.*?@\)@|))(?P.*)\Zs\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*\Zs9\s*(?P\b[\w$]+\b)\s*@\(@\s*(?P.*)\s*@\)@\s*\Zs4([-+]?(?:\d+(?:\.\d*)?|\d*\.\d+))[dD]((?:[-+]?\d+)?)sA([-+]?((?:\d+(?:\.\d*)?|\d*\.\d+))[eE]((?:[-+]?\d+)?)|(\d+\.\d*))sintent\s*\(.*?\bcallback\bcC`s4x-|jdgD]}tj|rdSqWdS(NRii(tgett_intentcallbackpatternR(tvdeclR((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt_is_intent_callbackjscC`st|}tj|}|rU|jd|jd|jd|jdfStj|}|r|jd|jdddfSdgddfS(NRcRRztbind(RtnameargspatternRRtcallnameargspatternR!(R'R((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt_resolvenameargspatternqs 4"c= C`s|jd}|dkr$dantr|dvkrt rtdkrtjjt j dd }t d |d a tdad t tj,ttd}qN n|d kri d }d}n|| j}||d"}t|j d}t-|dkr |d }t d?d>j,|dnd}xgt|j dD]} | j^q D]j}t.j|}|sk |d~kr; d} q t/|j0t d@|t|fq nt|jd} | |kr i|| dP}qnyt;|i|}Wn3t<t=t>fk r }t2dQ||fqnXt||| dHr|*dj}*n|j |*|+g|/}*d}+d },qqW|,d"kr|*j}*|*jDd>r|*dj}*n|j |*|+gni}0d ttkrEttd }0nd}x|D] }1g|1D]} | j^q_}1|1d d d>kr|1d d|1d k r|1d|d_kr|- }-n|d}qTW|d}||0kri|0|D]} | j^qz}i}:x|D]}1dH|1krtjdm|1tj}"|"r|"jdhj|:|"jdnj.*?)\s*(\(\s*(?P[a-z-, ]+)\s*\)\s*|)\ZsDanalyzeline: could not extract info of implicit statement part "%s" sManalyzeline: could not extract types pattern of implicit statement part "%s" RRRt-sZanalyzeline: expected "-" instead of "%s" in range list of implicit statement s^analyzeline: expected "-" instead of "%s" in range list of implicit statement (2) Rt'RlRRs>analyzeline: implied-DO list "%s" is not supported. Skipping. s=analyzeline: changing init expression of "%s" ("%s") to "%s" Rs//t_BLNK_RsT\A\s*(?P\b[\w]+\b)\s*((,(\s*\bonly\b\s*:|(?P))\s*(?P.*))|)\s*\ZRtnotonlytonlys;\A\s*(?P\b[\w]+\b)\s*=\s*>\s*(?P\b[\w]+\b)\s*\Ztlocals0analyzeline: Not local=>use pattern found in %s tmaps0analyzeline: Could not crack the use statement. Rtusercodes-analyzeline: No context for multiline block. s+analyzeline: No code implemented for line. (RRRR^(RRR(R6s block data(RR(RR(RR(RR(RRRRRRRR(RR(RRRRRR(R(HRR!R"RRRRRtbasenameRRR)RRRRRRRRR0RgRRwtremoveRRR RRdRR RtcopytdeepcopyRQRR(Rtcracktypespec0t updatevarsRtfindRRRNt namepatterntprintt groupdictR*Rbtget_parameterstdetermineexprtypeR)t real16patterntfinditertstartRRtevalt SyntaxErrort NameErrort TypeErrorttypespattern4implicitt cracktypespecRtordtchrt startswitht isinstanceRtappendmultiline(=RR5R'RtnewnameRcRRzR-txt needmodulet needinterfacetitR'ttR+tselectortattrtedeclt last_nameRRntpltchR?RtaptinitexprtparamsttttvtmsgtimplR$Rt kindselectt charselectRRptbegctendctotdltilR{tfctinpRRRtjtllentcltbntolt commonkeytmmtisonlyRR>tgc((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyR |s            !    1                -      $-  !  8   9  $*   ! 1 !   !   5               2     % E   !  %  *     % 2   ( &                   ? *    4+                9    ,  %   !     cC`sQd|kri|d((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyRcs     cC`s5d}d}tjd|tjr-d}n3tjd|tjrNd}n|jj}tjt|}|stddS|j }x.t |j D]}t ||||cracktypespec0: no kind/char_selector pattern found for line. R@R-tlogicalR*t characterR^RR4s::ii(R@R-RR*RR^(R!RRRRwRt selectpatternRR)RSRR RRP(R+RRjRkRR>R'Rn((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyRNs.       s+\s*(?P\b[\w]+\b)\s*(?P.*)\s*\ZsC\s*(\(\s*(kind\s*=)?\s*(?P.*)\s*\)|[*]\s*(?P.*?))\s*\Zs3\s*(\((?P.*)\)|[*]\s*(?P.*))\s*\Zs\s*(kind\s*=\s*(?P.*?)\s*(@,@\s*len\s*=\s*(?P.*)|)|(len\s*=\s*|)(?P.*?)\s*(@,@\s*(kind\s*=\s*|)(?P.*)|))\s*\Zs\s*(@\(@\s*(?!/)\s*(?P.*?)\s*@\)@\s*[*]\s*(?P.*?)|([*]\s*(?P.*?)|)\s*(@\(@\s*(?!/)\s*(?P.*?)\s*@\)@|))\s*(=\s*(?P.*?)|(@\(@|)/\s*(?P.*?)\s*/(@\)@|)|)\s*\ZcC`s|j}t|dkr"|S|d}xmtdt|dD]R}||dkr||ddksF||ddkrqFn|||}qFW||d}|S(NiiRs ()[]{}=+-/* i(RwRNR(texprtexpr2Rn((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt removespacess   cC`sd}d}d}d}x|D]}|dkrS|d krS||}|}qn|dkrt|d krt|}n||kr|d}nA||kr|d}n(|dkr|dkr|d}qn||}|}qW|S( NRis's\t"iRs@_@(s\s'R(s'R((R'RR{RtcbR((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pytmarkinnerspacess*          c C`sd}t||\}}}|rgt|jdD]}|j^q:}g} tjd} xh|D]`} | sqnn| j| } | r| jdj } | | t | } n| j | qnW| }ngt|jdD]}|j^q}g}x{|D]s}xjgtt t |ddjdD]}|j^qGD](}|r]|j |jddq]q]WqWx|D] }tj|} | stdt|qnt| jd }i}|ttd krttd |j}d |k}|r/||d ||d||d||<||d=q>q>WxHt|jD]4}||dk rt||||[a-zA-Z]+)RXRRs@ @s@_@s;updatevars: no name pattern found for entity=%s. Skipping. RcRR+sIupdatevars: attempt to change the type of "%s" ("%s") to "%s". Ignoring. RsVupdatevars: attempt to change the kindselector "%s" of "%s" ("%s") to "%s". Ignoring. RsEupdatevars:%s: attempt to change empty charselector to %r. Ignoring. sVupdatevars: attempt to change the charselector "%s" of "%s" ("%s") to "%s". Ignoring. RsMupdatevars: attempt to change the typename of "%s" ("%s") to "%s". Ignoring. RR4RNtarraytinitt2RRs-updatevars: "%s %s" is mapped to "%s %s(%s)" s dimension(%s)i Ris5updatevars:%s: attempt to change %r to %r. Ignoring. R@R-RR*RRRsTupdatevars: attempt to change the init expression of "%s" ("%s") to "%s". Ignoring. s?updatevars: could not crack entity declaration "%s". Ignoring. R;(R@R-RR*(R!R^RRRwRRRRRRNRRRRRQR)RRdRRRLRR RbtlenarraypatternRRSR(R+RjRt entitydeclRmRwRxRReRRRRtsteltel1R?te1tenameRltnot_has_typespecR'Rtd1tlktdmtdm1((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyROs.  . G$    )#" )#"                 !  c C`sd}d}d}|r|dkrtj|}|sQtdt|dS|j}|d|d<|d=x.t|jD]}||s||=qqWxt|jD]\}}t |||\w+)\s*\)Rcs'cracktypespec: no typename found in %s s'cracktypespec: no selector used for %s (R@R-RR*(R!RRR)RRSRR titemsRdRtlenkindpatternRRRR( R+RjRwRxRR'RnRR((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyR^sf         cC`s9|si}n|s|Sd|kr6|g|d<|S|rP|dj|n||dkrd|S|dkrd|dkr|dj|n|dkrd|dkr|dj|nq|dkrd|dkr|dj|nA|dkr$d|dkr$|dj|n|dj||S(NRR@t automaticRR(R(R$RkR&((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyR!s*   cC`s|si}n|s|Sd|kr3||d<|SxEt|jD]1}|sb||dkrF|||d|nt|}t|}|sq>n|rt d|nxYt|jD]E\}}||kr tdt |t |fn|||W|S(Ns0get_useparameters: no module %s info used by %s Rcs+get_useparameters: mapping for %s not impl.sDget_useparameters: overriding parameter %s with value from module %s( R!RRRRRR)R)RTRbR( Rt param_mapRtusenametmappingtmvarsRrR'Rt((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pytget_useparameters s.        c C`sts |St|tr]g}x7|D]/}t|d|dd|}|j|q&W|St|td||dfd|dkrt|}n|dk r8d|kr8|d}xvt|j D]_}||}d|kr|d}d |kr1|d } | |kr.|| |d .*?)\b\s*(\((?P.*?)\)|)\s*\Ztdimss@,@RcRRs dimension(%s)RsNanalyzecommon: failed to extract "[()]" from "%s" in common /%s/. t commonvars(t hascommonRR RRRRRRRwRdRRRb( RRR'tcomvarsR?RRReR|((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyRsD 7%%   cC`snt|g}xW|dD]K}||d<|ddkr|dk r]|d|kr]qn |d}|dtkr}qntr|dtkrqnt|ddd t|d |r.d|j dd|j d f}|j|}qWt|ii} |j|}x>|rd|j dd|j d f}|j|}qSWt|ii| } |j|}x>|rd|j dd |j d f}|j|}qWt|ii}|j|}x>|rXd|j dd |j d f}|j|}qWt|ii} | d | |kr| d | | kr| | |fSWntk rnXPqlqlWd S( Niis\w\s*\([^)]*\bs\bs(?P.*?)\bs\b(?P.*)s%s(%s)%sRR4g?g?(NNN( R.RR!Rtgetlincoef_re_1RRNRtsearchRRR( R?txsetRtlen_eReRRRteeRRtc2((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt getlincoef:s^     " " " "( s \A[a-z]\w*\ZRc C`s] g}y!|jt|diiWn"tk rK|j|dnXy!|jt|diiWn"tk r|j|dnXt|dtr d|d}|dkrt|d}qz|dkrd|d| f}qzd|d|f}nmt|dtrbd|d}|dkrKd|d}qzd||df}nd|d|df}y#tt|iiddfSWntk rnXt|d|t|d|}}d|d|dgkrP |d|dfdkr/t|d|ddddfS|d|dd}|dd|df}|d||df}|ddkr=|d|kr=|dkrd |d|d| f|dd | |dffS|rd |d|d|f|dd ||dffSd |d|df|dd|dfSn|ddkr |d|kr |dkrd |d |d| f|dd | |d ffS|rd |d |d|f|dd ||d ffSd |d |df|dd|d fSn|d|dkr|d|kr|d|d} | s\t|ddfS|dkrd | |d| f|dd | | ffS|rd | |d|f|dd || ffSd | |df|dd| fSn|d|dko dknrt|d} | |krXt | rKt d| nd| } n|dkr{d|d| f}qM |dkrd|d| | f}qM d|d| |f}qP |ddkrt|d} | |krt | rt d| nd| } n|ddkr%n1|ddkrBd| } nd|d| f} |dkrk| }qM |dkrd| | f}qM d| |f}qP |ddkrt|d} | |krt | rt d| nd| } n|ddkrd| } nY|ddkr.d| } n<|ddkrVd|d | f} nd|d| f} |dkr| }qM |dkrd| | f}qM d| |f}qP t|d} | |krt | rt d| nd| } n|ddkrd| } nY|ddkr2d| } n<|ddkrZd|d | f} nd|d| f} t|d} | |krt | rt d| nd| } n|ddkrn1|ddkrd| } nd|d| f} |dkr d| | f}qP |dkr: d| | | f}qP d| | |f}n|ddfS(Niis%s-%ss%s+%ss-(%s)s%s-(%s)s %s-(%s)+1is %s * %s - %ss +%s)/(%s)s %s * %s + %ss -%s)/(%s)s%s * %ss)/(%s)s# getarrlen:variable "%s" undefined s(%s)s%s-%s-%ss%s-%s+%sis-%ss%s*%ss+%ss+%s*%ss-%s*%ss%s%ss%s%s-%ss%s%s+%s(ii( RRRRbR.RRR!Rt_varname_matchR)( R|Rtstartedltp1R>Rtd2RRRRtc1((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt getarrlenps! !    # '#  64.  860$ .,&$                               s\b[a-z][\w$]*\bcC`s||kr||jdg}d||krt|| rxJtj||dD].}||kr[||kr[|j|q[q[Wnxw|D]Q}xH|j|gpt|||D]"}||kr|j|qqWqWntdt|g}|||<|S(NRRs,_get_depend_dict: no dependence info for %s (R)tisstringt word_patterntfindallRt_get_depend_dictR)R(RcRtdepstwordstwordR((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyR s !  cC`s=t|j}i}x|D]}t|||qW|S(N(RR R(RRet depend_dictR|((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt_calc_depend_dict s  cC`st|}g}x;t|jD]'}||s%|j|||=q%q%Wxy|rxlt|jD]X\}}g|D]}||kr|^q}|s|j|||=ql|||.*)\s*\)s-\bselected_int_kind\s*\(\s*(?P.*)\s*\)s4\bselected_(int|real)_kind\s*\(\s*(?P.*)\s*\)Rs.false.tFalses.true.Rs kind("\1")sselected_int_kind(\1)RRRiiR>R?iRRs@,@sget_parameters: got "%s" on %s s2get_parameters:parameter %s does not have value?! (s.false.R(s.true.R(#RLRRR RRRRRt islogicalRRtsubRRNRRRtisdoubleRRVRWRXRt iscomplexRRYRR)RRRbR.R`RR(Rt global_paramsRrtg_paramsRctfunct param_namesR|tkind_retselected_int_kind_retselected_kind_reRttreplt is_replacedt orig_v_lentv_RsRRRutnl((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyRTf sz   $    "8  E " #  cC`s|dkrdSt||S(Ns(:)s(*)R(s(:)s(*)R(t _eval_scalar(tlengthRr((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt _eval_length s s\d+_cC`st|r"|jdd}nytt|i|}WnMttfk rX|Stk r}td||t|j fnX|S(NRis,"%s" in evaluating %r (available names: %s) ( t_is_kind_numberRRRYR[RZRRbRR (tvalueRrRu((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyR s !c7 C`st|t|\}}tj|d}|ddkr`|d|kr`i||d} | d dkr>| djdd!}n| d dkrh| djdd!}n| d dkr| djdd!}nk| d dkr| djdd!}nA| d dkr| djdd!}nt||| ||<|rd||kr$g||d|'||&|fg||d.*?)\bs\b(?P.*)RR4s@:@it1s1 * is/(1)RPsoanalyzevars: character array "character*%s %s(%s)" is considered as "character %s(%s)"; "intent(c)" is forced. RRs'analyzevars: charselector=%r unhandled.Rs.*?\bs\bRs %s%s(%s,%s)%ss %slen(%s)%ss%s%s(%s,%i)%s==%ss%slen(%s)%s>=%sRRRzR:tpuret recursiveRRs'analyzevars: prefix (%s) were not used R7Rs python modules block dataRRRR^(NNNNN(RR%(R7Rs python modules block data(RR(4RRRLRR R!RtKeyErrorRTRRRRRXRRRR)RRRYRtreverseR!RwRRRRgRRNRt isintent_ct isstringarrayRbRtl_ort isintent_intisintent_inouttisintent_inplaceRR!RtisscalarRR(RRNR^tisintent_callbackt isintent_auxtextend(7RRRRtgenR|R'tsvarsRRRrt dep_matchest name_matchRtRtln0Rt savelindimsRktdimRRRRReRttmpR>RR RR|tdit shape_macroR(RntnitddepstadtpdRptaaR tprtispuretisrectpr1R+RjRlRwRxRt neededvarsRc((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyR s~   (       + "$  %!    5   ;  5 ;    *    #(     & ,     . $ ! '$   '  )"    *  "      s\A[a-z]+[\w$]*\Zc C`s|}tj| }|rt|\}}t||d|}d}xC|D];} | j} | tjtjkrd} n|| }qQW|ddkr|d}n |d}|}x1||dks||dkr|d}qWn||kr=d } x$|t| |kr)| d } qW|t| }n|rT||d|     # $"cC`st|t|\}}d|kr5g|d\}}x/|D]'}||dkri|d|[\w]+)|)\Zs-\A[+-]?[\d.]+[\d+\-de.]*(_(?P[\w]+)|)\Zs \A\(.*\)\Zs\A(?P\w+)\s*\(.*?\)\s*\ZcC`swt|tridd6St|tr4idd6St|trNidd6St|tra|Stt|dS(NR-R+R*R@(RbR.R0R@RRR(Rp((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt_ensure_exprdict{ s   c C`sr||krt||S|j}tj|r@idd6Stj|}|rd|jkr|jdrtdt|nidd6St j|}|rd|jkr|jdrtdt|nidd6Sx{ddd d gD]g}x^gt |d |j d |d D]}|j^q0D] }||krFt||SqFWqWi}t j|rt |d d!||}ntj|}|r(|jd}t |jd||}|rd|kr|d=n|s(|d|kr%t||dSq(n|ddkrQidd6id d 6d6S|sntdt|n|S(NR@R+Rcs:determineexprtype: selected kind types not supported (%s) R-R*t+RBRRlRRiiRis'"RRs>determineexprtype: could not determine expressions (%s) type. (RTRwtdetermineexprtype_re_1Rtdetermineexprtype_re_2RSRR)Rtdetermineexprtype_re_3RRtdetermineexprtype_re_4RUtdetermineexprtype_re_5( RRtrulesRtopReR?Ritrn((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyRU sN   ! ! C  s cC`s t|d}t|trxr|D]j}|rw|ddkrw|dtkrXq&ntrw|dtkrwq&qwn|t||d|}q&W|Sd}d}d}|d}|dkrdSg} d|kr|d}nd|kro|d } xD|dD]8} t| || } t| | s| j| qqW|ddksV| rod d j | }qond} d |krxCt|d j D](} d | |t | |d | f} qWn|j dg}|dkrd|kr|j dn|r.d| |t d j ||f} nd}d|krZt|d|t }nd}d|krt|d|t }n|dkrd}nd}d|krd|d}|d| kr| j|dqnt|d|t }t||d | |t d|} d}d|krF| rFd|d}nd|krd}xGt|djD]/\} }d||t | d j |f}qoW||}n|dkr|dkrd}nd|||||||| || |||||f}|S(NRRRRRcRR1RRs(%s)RRs %s%s%s %sRtcallbacks%s%sintent(%s) %sRRR8Rzs result (%s)RR3s! in %sRs%s%sentry %s(%s)s block dataR5s%%s%s%s %s%s%s %s%s%s%s%s%s%send %s %s(RR(RRbRRRRRRR2RRR R R)RKt use2fortrantcommon2fortrant vars2fortranR(RRRRRR:RcRt blocktypetargslRRRR't intent_lstRRRzRtmesst entry_stmtsRn((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyR s          &        #$  4cC`syd}xlt|jD]X}|dkrNd||dj||f}qd|||dj||f}qW|S(NRRDs %s%scommon %sRs%s%scommon /%s/ %s(RR R(RRRR'((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyR` s  #'cC`sid}x\t|jD]H}d|||f}||ikrk|r|ddkr|d }qqnd||kr||drd|}nd||kr>||dr>d}xt||djD]b}|||d|krd |||f}d}qd |||||d|f}d}qWn|r|ddkr|d }qqW|S( NRs %s%suse %s,iRRFs%s only:RHRs%s%s%ss %s%s%s=>%s(RR (RRRRRR'((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyR_ s(  ! " cC`si|d}g}xR|D]J}ytd|}Wntk rJd}nX|r|j|qqW|S(NRsisintent_%s(var)i(RYR[R(RRRRR((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyttrue_intent_list! s    cC`st|d}g}x.|D]&}||dkr|j|qqWd|krxN|dD]?}||kr||kr|j|qq^td|q^Wnd|kr|j|dn|sx9t|jD]"}||kr|j|qqWnx|D]}d||krx`||dD]M}||kr2d||kr2|||dkr2td||fq2q2Wnd|krw||dkrwt||rd |||f}nd |||f}t||rd |||f}n||kr#d ||kr#q nd } x<|dD]0} || dkr4| ddkr4d} Pq4q4W| rwq qwn||krt|t d|q n||dkr|ddk rq nd ||krFd||kr$d||dkr$||kr d |||f}q q nt||t d|q n||d } | dkrd||krd| ||df} ni} d||kr||d} n!d||kr||d} nd| kr| dd7krd| | df} qd| | df} nsd | krmd!| | d f} d"| kr`d#| | d"f} qd$| } n#d"| krd%| | d"f} nd&} d||kr g}x2||dD]"}|d8kr|j|qqW|r d'| d(j |f} d(} q nd)||krId*| | d(j ||d)f} d(} nd+||krt ||}|rd,| | d(j |f} nd(} nd-||krd.| | d(j ||d-f} d(} nd||krd/| | d(j ||df} d(} nd0||kr||d0}||d d9kry&t |}d3|j |jf}Wqtk r|qXnd4| ||f} nd5| |f} d6||| f}q W|S(:s& TODO: public sub ... RRRs7vars2fortran: Confused?!: "%s" is not defined in vars. R;RsHvars2fortran: Warning: cross-dependence between variables "%s" and "%s" Rs%s%sintent(callback) %ss%s%sexternal %ss%s%soptional %sR+iRRcRRis/vars2fortran: No definition for argument "%s". RRs-vars2fortran: No typespec for argument "%s". R^Rs%s(%s)RRRR%s%s*(%s)s%s*%sRNs %s(len=%sRs %s,kind=%s)s%s)s %s(kind=%s)Rs%s, %sRRs%s%sdimension(%s)Rs%s%sintent(%s)Rs %s%scheck(%s)s%s%sdepend(%s)RR@sdouble complexs(%s,%s)s %s :: %s=%ss%s :: %ss%s%s%s(RR%(R(R@sdouble complex(RRRbR4RR R2t isoptionaltshowR)RRgRYR*timagR(RRRRRRtnoutRR>RRtvardefRjRRkRRRt((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyRa. s        0    !$        !  $ !   cC`s^tddt|ttddgattd}tddt|}t|S(NsReading fortran codes... isPost-processing... sPost-processing (stage 2)... (R)RRRRRR(tfilestpostlist((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt crackfortran s     cC`s,t|d}d}dt}|||S(Ns sE! -*- f90 -*- ! Note: the context of this file is case sensitive. sb ! This file was auto-generated with f2py (version:%s). ! See http://cens.ioc.ee/projects/f2py2e/ (Rt f2py_version(Rtpyftheadertfooter((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pyt crack2fortran s t__main__R%s-quiets-verboseis-fixs?Use option -f90 before -fix if Fortran 90 code is in fix form. s-skipemptyendss--ignore-containss-f77s-f90R~s-hs-shows-mRBsUnknown option %s s IOError: %s s 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). s Writing fortran code to file %s R(t__doc__t __future__RRRR$RYRRRRLRRRtauxfuncstversionRpRR R R R R RRRRRRRRRRRR!RRRRR RRR"RRRRR#R)t _MAXCACHERRRaRhR|RdRgRiRjRoRRRRRRuRvRRxR}RiRtbeforethisaftert fortrantypesRR]RRt groupbegins77Rt groupbegins90Rt groupendsRtendifsRRRRRRRRRRRRRRR RRRRtSRRRRRRRRR(RR.R/RVRR*R,R0R RcRNRQRRRRRRROR^R!R"R#RRRRRRRRRRRRRRRRRRRRRR RTR!R"RRRKRRRRVRWRXRYRZRTRURRR`R_RgRaRoRtt__name__RmtfuncsR{tf2tf3t showblocklisttargvRRbRRsRRtIOErrortdetailRRnRqR&(((s6/tmp/pip-build-fiC0ax/numpy/numpy/f2py/crackfortran.pytsH            &         % $ " "%%%%% "%%%%%% "%%%%%%%%%#         %    9     $` " + "  3      Y   ] %  -K  |