HOME


sh-3ll 1.0
DIR:/usr/local/lib64/python3.6/site-packages/numpy/f2py/__pycache__/
Upload File :
Current File : //usr/local/lib64/python3.6/site-packages/numpy/f2py/__pycache__/crackfortran.cpython-36.pyc
3

���h��3@s�
dZddlZddlZddlZddlZddlZddlZddlZddlm	Z	ddl
Te	jada
dadada�d"ad	ad	adadadagad	ad	adaiad	adadadatgia d	a!ga"�d#a#ga$da%�d$a&ga'ga(ga)d
d�Z*�d%dd
�Z+de_,iZ-xdD]Z.ddie-e.<q�WxdD]Z.ddie-e.<�qW[.iZ/iZ0x(�d&D]Z1e1dGe/e1<e1e0e1dG<�q:WdHdI�Z2dJdK�Z3dLdM�Z4dNdO�Z5dPdQ�Z6ej7dRej8�j9Z:ej7dSej8�j;Z<ej7dTej8�j;Z=ej7dUej8�j;Z>ej7dVej8�j9Z?dWdX�Z@eAdfdYdZ�ZB�d(ZCd^ZDej7eCd	eDeDd_fej8�dEfZEej7eCd	eDd`eDd`d_fej8�ZFej7eC�d)ej8�dcfZGej7eC�d*ej8�dcfZHdfZIej7eCd	eIeId_fej8�dcfZJeIdgZKej7eCd	eKeKd_fej8�dcfZLdhZMej7eCd	eMeMdifej8�djfZNdkZOej7eCdleOeOdifej8�dmfZPej7eC�d+ej8�dnfZQej7eC�d,ej8�dpfZRej7eC�d-ej8�dqfZSej7eC�d.ej8�drfZTej7eC�d/ej8�dsfZUej7eC�d0ej8�dtfZVej7eC�d1ej8�dufZWej7eC�d2ej8�dvfZXej7eC�d3ej8�dyfZYej7eC�d4ej8�dzfZZej7eC�d5ej8�d|fZ[ej7eC�d6ej8�d}fZ\ej7eC�d7ej8�d~fZ]ej7eC�d8ej8�dfZ^ej7eC�d9ej8�d�fZ_ej7eC�d:ej8�d�fZ`ej7eC�d;ej8�d�fZaej7eC�d<ej8�d�fZbej7eC�d=ej8ejcB�d�fZdej7d�ejc�d�fZed�d��Zfd�d��Zgej7d�ej8�Zh�d>d�d��Zid�d��Zj�d?d�d��Zkd�d��Zl�d@d�d��Zmej7d�ej8�Znej7d�ej8�Zoej7d�ej8�Zpej7d��Zqej7d��Zrej7d�ej8�Zsd�d��Ztd�d��Zud�d��Zvd�d��Zwd�d��Zxej7d�ej8�Zyej7d�ej8�Zzej7d�ej8�Z{ej7d�ej8�Z|ej7d�ej8�Z}d�d��Z~d�d��Zd�d��Z�d�d��Z��dAd�d��Z��dBd�d��Z��dCd�d��Z��dDd�d��Z�d�d��Z�d�d��Z��dEd�dÄZ��dFd�dńZ��dGd�dDŽZ�d�dɄZ�d�d˄Z��dHd�d̈́Z�d�dτZ��dId�dфZ�ej7d�ej8�Z�d�dԄZ�ej7dՃj9Z��dJd�d؄Z�ej7d�ej8�Z�d�dۄZ�d�d݄Z�d�d߄Z�d�d�Z�d�d�Z��dKd�d�Z�ifd�d�Z�d�d�Z�ej7d�j9Z�d�d�Z�d�d�Z�ej7d�ej8�Z�gfd�d�Z�d�d�Z�ej7d�ej8�Z�ej7d�ej8�Z�ej7d�ej8�Z�ej7d�ej8�Z�ej7d�ej8�Z�d�d��Z�ifd�d��Z��dLd��d�Z��dM�d�d�Z��dN�d�d�Z��d�d�Z��dO�d�d�Z��d	�d
�Z��d�d�Z�e��d
k�
r�gZ�gZ�dZ�dZ�dZ�dZ��x�ej�dd�D�]�Z�e�d	k�rX�qDe�d�dk�rpdZ��qDe��dk�r�dada�qDe��dk�r��dada�qDe��dk�r�t
�r�e+�dd�dada�qDe��dk�r�da�qDe��dk�r�da�qDe��dk�	r
da
dan�e��dk�	r&da
�dadan�e��dk�	r8dZ�n�e��dk�	rJdZ�n�e��dk�	r\dZ�n�e�d�dk�	r�e��de�e���n�e��	r�dZ�e�ante��	r�dZ�e�ande��	r�ye�e��j��e�j�e��Wn6e�k
�	r�Z�ze��de�e���WYddZ�[�XnXn
e�j�e���qDWt
�
r,t�
r,t�
r,e+�dd�e�e��Z�t�
rxe+�d e�t�d�e�eƒZ�e�t�d!��Z�e�j�eÃWdQRXe��
r�eAeƒdS(Pa�
crackfortran --- read fortran (77,90) code and extract declaration information.

Copyright 1999-2004 Pearu Peterson all rights reserved,
Pearu Peterson <pearu@ioc.ee>
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 <pyffilename>
                   -m <module name for f77 routines>,--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: <commentchar>f2py<line> is read as <line>
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'][<index>]['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':<variable definition>,'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:
         {<modulename>:{['only':<0|1>],['map':{<local_name1>:<use_name1>,...}]}}
     B['note'] --- list of LaTeX comments on the block
     B['f2pyenhancements'] --- optional dictionary
          {'threadsafe':'','fortranname':<name>,
           'callstatement':<C-expr>|<multi-line block>,
           'callprotoargument':<C-expr-list>,
           'usercode':<multi-line block>|<list of multi-line blocks>,
           'pymethoddef:<multi-line block>'
           }
     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'][<variable name>] =
     {'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(<arrayspec>)',
                       '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 = <typespec> [[<attrspec>]::] <entitydecl>
<typespec> = byte                          |
             character[<charselector>]     |
             complex[<kindselector>]       |
             double complex                |
             double precision              |
             integer[<kindselector>]       |
             logical[<kindselector>]       |
             real[<kindselector>]          |
             type(<typename>)
<charselector> = * <charlen>               |
             ([len=]<len>[,[kind=]<kind>]) |
             (kind=<kind>[,len=<len>])
<kindselector> = * <intlen>                |
             ([kind=]<kind>)
<attrspec> = 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.
<intentspec> = in | out | inout
<arrayspec> = comma separated list of dimension bounds.
<entitydecl> = <name> [[*<charlen>][(<arrayspec>)] | [(<arrayspec>)]*<charlen>]
                      [/<init_expr>/ | =<init_expr>] [,<entitydecl>]

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
datgiada
dad	agaiadadadagagagagadadS)
Nrrrrrrz    ���r	)�	strictf77�sourcecodeform�quiet�verbose�tabchar�pyffilename�
f77modulename�
skipemptyends�ignorecontains�dolowercase�debug�groupcounter�	grouplist�neededmodule�expectbegin�skipblocksuntil�usermodules�
f90modulevars�gotnextfile�filepositiontext�currentfilename�
skipfunctions�	skipfuncs�	onlyfuncs�
include_paths�previous_context�r$r$�8/tmp/pip-build-5_djhm0z/numpy/numpy/f2py/crackfortran.py�reset_global_f2py_vars�s4	r&cCs,tsdSts(|rtjjt�tjj|�dS)N)r
r�sys�stdout�writer)�line�flagr$r$r%�outmess�sr,�2zabcdefghopqrstuvwxyz$_�typespec�realZijklmn�integer�int�double�float�char�short�long�void�case�while�return�signed�unsigned�if�for�typedef�sizeof�union�struct�static�register�new�break�do�goto�switch�continue�else�inline�extern�delete�const�auto�len�rank�shape�index�slen�size�_i�max�min�flen�fshape�string�complex_double�float_double�stdin�stderrr(�type�defaultZ_bncCs(|tkr$td|t|f�t|S|S)Nz&rmbadname1: Replacing "%s" with "%s".
)�badnames�errmess)�namer$r$r%�
rmbadname1s
rfcCsdd�|D�S)NcSsg|]}t|��qSr$)rf)�.0�_mr$r$r%�
<listcomp>szrmbadname.<locals>.<listcomp>r$)�namesr$r$r%�	rmbadnamesrkcCs(|tkr$td|t|f�t|S|S)Nz+undo_rmbadname1: Replacing "%s" with "%s".
)�invbadnamesrd)rer$r$r%�undo_rmbadname1s
rmcCsdd�|D�S)NcSsg|]}t|��qSr$)rm)rgrhr$r$r%risz"undo_rmbadname.<locals>.<listcomp>r$)rjr$r$r%�undo_rmbadnamesrncCsN|jd�}|dkrdSd||d�kr*dSd||d�kr>dS||dd�S)N�.rr�\�/r	)�rfind)re�ir$r$r%�getextensions
rtz.*[.](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|d���}|j�}d}t|�r*d}nt|�r:d}d}xf|dkr�|r�|ddkr�|j�r�|d8}|ddkr�t|dd��s�|dd�d
kr�d}P|j�}q<WWdQRX|S)
z(Check if file is in free format Fortran.r�r�r�!�	N���&���r	)�open�readline�
_has_f_header�_has_f90_header�strip�_free_f90_start)�file�result�fr*�nr$r$r%�is_free_format0s",r�c	CsH|stttttttttf	}|gkr&dSt}d}d}d}t	j
dt	j�}t	j
d�}	t	j
d�}
t	j
d�}|rp|dd)�d*\}}d	gd
d�td�D�}
dat
j|�}�x�|j�}|s�P|j��rXda|j�ada|}dad
atjjt�d}tt��rt|��pt|��rdantt��r&t|��r&dat�r2tantatdtt�tt�rNd�pPdf�|j�jdd	�}x,|dk�s�|d+dk�r�P|dd,�}�qjWt�s�t|d�\}}|d	7}|dd�j �dk�r�t|d-|dd�d�\}}|j!�dk�r�d}q�td
k�rn|dd.k�rB|dd�j �dk�r:d|dd�}nd}q�n t�rbt"|�dk�rb|dd�}|d|
k�r�t#dt|���|�s�t�r�t"|�dk�r�|dd	k�r�||dd�}d}d}n�t�s@|	j$|�}|�r�|j%d �}|�r
||
j$|�j%d �}d}d}n,d|dd�}|�r*|j �}n|}|}|}|dk	}n,d|dd�}|�r`|j �}n|}|}|}n�tdk�r@|�r�|d!k�r�|j$|��r�|d"}x4|j�}|�s�t&d#�P||}|j$|��r�P�q�W|j'�}|	j$|�}|�r�|j%d �}|�r||
j$|�j%d �}d}d}n|�r*|j �}n|}|}|}|dk	}nt(d$tt���d%|j)�dt|fa|j$|�}|�r|j%d&�}tjj*|��r�t+||dd'�nxtjj,t�gt-}d}x>|D]6}tjj.||�}tjj*|��r�d}t+||dd'�P�q�W|�s td(t|�tj/j.|�f�n||�|}q�W|�r8|j �}n|}|}d%|j)�dt|fa|j$|�}|�r|j%d&�}tjj*|��r�t+||dd'�nxtjj,t�gt-}d}x>|D]6}tjj.||�}tjj*|��r�d}t+||dd'�P�q�W|�std(t|�tj/j.|�f�n||�da|j0�|�r.|dd�n|\	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 '<filename>'" is met.
    Nrrz*\s*include\s*(\'|")(?P<name>[^\'"]*)(\'|")z(?P<line>.*)&\s*\Zz(\s*&|)(?P<line>.*)z.*?'''rrcSsg|]}t|��qSr$)�str)rgrhr$r$r%ricsz#readfortrancode.<locals>.<listcomp>�
r�freez	Reading file %s (format:%s%s)
z,strict� z

rwryz!f2pyrr�c�C�#Zf2pyz     �Hzxreadfortrancode: Found non-(space,digit) char in the first column.
	Are you sure that this code is in fix form?
	line=%s�r*z.pyf�
z.Unexpected end of file when reading multiline
z6Flag sourcecodeform must be either 'fix' or 'free': %szLine #%d in %s:"%s"
	re)�
dowithline�istopzAreadfortrancode: could not find include file %s in %s. Ignoring.
r	)rrr	r	z    )rr�rwr�r�)1rrrrr
�beginpatternrr
r�re�compile�I�range�	fileinputZ	FileInputr~Zisfirstline�filename�os�path�splitext�	is_f_filer��_has_fix_headerr��beginpattern77�beginpattern90r,�repr�
expandtabs�replace�split_by_unquoted�lowerr�rQ�	Exception�match�grouprd�rstrip�
ValueErrorZ
filelineno�isfile�readfortrancode�dirnamer"�join�pathsep�close)Zffiler�r�ZsaveglobalsZlocaldolowercase�contZ	finalline�llZincludelineZcont1Zcont2Z
mline_mark�l1ZspacedigitsZfin�l�ext�rl�_Z
origfinallineru�lc�m�fn�include_dirsZ	foundfile�inc_dirZfn1r$r$r%r�HsR










,
















r�z"\s*(?P<before>%s(?=\s*(\b(%s)\b)))z\s*(?P<this>(\b(%s)\b))z\s*(?P<after>%s)\s*\Zzqcharacter|logical|integer|real|complex|double\s*(precision\s*(complex|)|complex)|type(?=\s*\([\w\s,=(*)]*\))|byte�.*z|static|automatic|undefined�([a-z]+[\w\s(=*+-/)]*?|)�function�begin�	[a-z\s]*?�
subroutinezprogram|block\s*dataz?|module(?!\s*procedure)|python\s*module|interface|type(?!\s*\()z\end|endprogram|endblockdata|endmodule|endpythonmodule|endinterface|endsubroutine|endfunctionz[\w\s]*�endz>(end\s*(if|do|where|select|while|forall))|(module\s*procedure)z[\w]*?�endif�implicit�dimension|virtual�	dimension�external�optional�required�public�private�	intrinsic�intent|depend|note|check�\s*\(.*?\).*�intent�	parameter�\s*\(.*�data�call�entry�callfun�common�use�contains�format�Kthreadsafe|fortranname|callstatement|callprotoargument|usercode|pymethoddef�f2pyenhancementsz2\s*(?P<before>''')(?P<this>.*?)(?P<after>''')\s*\Z�	multilinecCsxtd�t|�@std��tjdjdjtj|��djtj|��ddd��}|j|�}|rp|j�}|d	|d
fS|dfS)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<before>({single_quoted}|{double_quoted}|{not_quoted})*)(?P<after>{char}.*)\Zz[^"'{}]z[{}]z('([^'\\]|(\\.))*')z("([^"\\]|(\\.))*"))Z
not_quotedr4�
single_quotedZ
double_quoted�before�afterr)�set�AssertionErrorr�r�r��escaper��	groupdict)r*�
charactersrur��dr$r$r%r�cs

r�cCsJg}x:t|�jd�D](}xdD]}|j|d�}qW|j|�qWdj|�S)Nz@,@z(),r��,)�markoutercomma�splitr��appendr�)Zargsline�ar�rur$r$r%�
_simplifyargsws
r�z&\s*(?P<result>\b[a-z]+[\w]*\b)\s*[=].*cCs�t|d�\}}|r�tdj|�p,tdj|�r�|dksDtt|���t|d�\}}x(|rzt||�t|dd�d�\}}qTWt||�dS|dkr�datdiatiia	tgia
gt	td<it	td<dt	td<dt	td	<d ad!adS|dk�r
d}t
�rttk�rd
}xlt|k�rxtdtt�tt�f�td�t
tdjt	t�t
tt
tdd"d<t
t=tda�qWt
�rttk�rt
tdjt	t�t
tt
tdd#d<t
t=tdat
tdjt	t�t
tt
tdd$d<t
t=tdad%adS|dk�rdSd}x^ttttttttttttttttt t!t"t#t$t%t&ttgD]$}|dj|�}|�rnP|d}�qTW|�s�t'}	dtk�o�tkn�r�dSd
t	tk�r�x�t	td
D]�}
|
t(k�r�t(|
}
dt	tk�r�|
t	tdk�r��q�t)jd|
t*|�t)j+�}|�r�|	j|j,d��}t-|j,d��}
|�rTd|
|
|j,d�f}nd|
|
f}t.dj|�}|�s�tdt|��dSt/|d|�dS�q�Wt0dk�s�t0dk�r�t1j2�j3d��r�da4tdt�dS|ddk�r�dtk�o�tkn�rtdattk�rdStdk�r,t5dt��tdj|�}|�rz|j,d�ttk�rzt5dt|j,d��ttt�t6f��ttk�r�d&at
tdjt	t�t
tt
tdd'd<t
t=tdat7�s�da8n�|ddk�r dtk�o�tkn�rtdadSda9t/||d|�da8n~|ddk�r0nn|ddk�rnt:�rHdSdtk�o\tkn�rhdStan0dtk�o�tkn�r�dSt/||d|�dS)(z�
    reset=-1  --- initialize
    reset=0   --- crack the line
    reset=1   --- final check if mismatch of blocks occurred

    Cracked data is saved in grouplist[0].
    �;rrNr�body�vars�blockrerzz(crackline: groupcounter=%s groupname=%s
zYcrackline: Mismatch of blocks encountered. Trying to fix it by assuming "end" statement.
�	externals�
interfacedz5(?P<before>[^"]*)\b%s\b\s*@\(@(?P<args>[^@]*)@\)@.*\Zr��argszcallfun %s(%s) result (%s)r�zcallfun %s(%s)z8crackline: could not resolve function call for line=%s.
r�z.pyfz"crackline:%d: No pattern for line
r�z>crackline: groupcounter(=%s) is nonpositive. Check the blocks.�thiszGcrackline: End group %s does not match with previous Begin group %s
	%sr�r�r�r	r	r	r	r	r	r	r	);r��f2pyenhancementspatternr��multilinepatternr�r��	crackliner�	groupname�
groupcacherrrrr,r��dimensionpattern�externalpattern�
intentpattern�optionalpattern�requiredpattern�parameterpattern�datapattern�
publicpattern�privatepattern�intrinsicpattern�endifpattern�
endpattern�
formatpatternr��functionpattern�subroutinepattern�implicitpattern�typespattern�
commonpattern�callpattern�
usepattern�containspattern�entrypattern�crackline_re_1rlr��markouterparenr�r�r��callfunpattern�analyzeliner
rr��endswithr#r�rrrrr)r*�resetr�Z
has_semicolonZsemicolon_line�flr+�patr��re_1re�m1�m2r�r$r$r%r��s






 
$



r�cCshd}d}xZ|D]R}|dkr6|d}|dkrX|d}qn"|dkrX|d}|dkrX|d}q||}qW|S)Nrr�(rz@(@�)z@)@r$)r*r�r�r�r$r$r%rs
rr�cCs�d}d}t||d�\}}||7}x�|r�|d|krN|dkrN|d|d7}n6||d7}|ddkrp|d7}n|ddkr�|d8}t|dd�|d�\}}||7}q$W|s�tt|||f���|S)Nrrz()�@rrr)r�r�r�)r*�commar�r�r�r�r$r$r%r�0s 
r�cCs|jdd�jdd�}|S)Nz@(@rz@)@r)r�)r*rur$r$r%�unmarkouterparenCsr cCs|si}|s|S||kr|Sx�t|j��D]�}|dkrP|sB||krN||||<q*|dkrxx�||D]}t|||�}qbWq*|dkr�t||||�}q*|dkr�t||||�}q*|dkr�|s�||kr�||||<q*|dkr�q*|dk�r�td
|�q*tdt|���q*W|S)Nr.�attrspec�kindselector�charselector�=�typename�noter��checkr�r�r�z"appenddecl: "%s" not implemented.
z,appenddecl: Unknown variable definition key:)r$r%)r�r'r�r�r�)�list�keys�setattrspec�setkindselector�setcharselectorrdr�r�)�declZdecl2�force�kr�r$r$r%�
appenddeclHs6
r0zF\s*(?P<this>(@\(@.*?@\)@|[*][\d*]+|[*]\s*@\(@.*?@\)@|))(?P<after>.*)\Zz�\s*(?P<name>\b[\w$]+\b)\s*(@\(@\s*(?P<args>[\w\s,]*)\s*@\)@|)\s*((result(\s*@\(@\s*(?P<result>\b[\w$]+\b)\s*@\)@|))|(bind\s*@\(@\s*(?P<bind>.*)\s*@\)@))*\s*\Zz9\s*(?P<name>\b[\w$]+\b)\s*@\(@\s*(?P<args>.*)\s*@\)@\s*\Zz4([-+]?(?:\d+(?:\.\d*)?|\d*\.\d+))[dD]((?:[-+]?\d+)?)zA([-+]?((?:\d+(?:\.\d*)?|\d*\.\d+))[eE]((?:[-+]?\d+)?)|(\d+\.\d*))zintent\s*\(.*?\bcallback\bcCs(x"|jdg�D]}tj|�rdSqWdS)Nr!rr)�get�_intentcallbackpatternr�)Zvdeclr�r$r$r%�_is_intent_callbackts
r3cCslt|�}tj|�}|r:|jd�|jd�|jd�|jd�fStj|�}|r`|jd�|jd�ddfSdgddfS)Nrer�r��bind)r�nameargspatternr�r��callnameargspattern)r*rr$r$r%�_resolvenameargspattern{s
$
r7c<Csh|jd�}|dkrdatr�|d�kr�tr�tdkr�tjjt�j	d�d	}t
d
|�d	atdadtt<it
t<gtt<gt
td<it
td
<dt
td<|t
td<dt
td<d	a|d�k�rd|j�}tjd|tj�r�d}tjd|tj�r�d}t|jd��\}}}}|dk�r6|dk�r d}nd}|d�k�r6t
d�||tfa|�rdtdd�t|�j	d�D��}ng}d|k�r�xd|k�r�|jd��qtWt
d�d	}	d	}
|d�k�rd}
dt
tk�r�dS|t
tdk�r�dSx$ttD]}|d|k�r�dS�q�W|t
td k�rdSd!d"d#�|}t�rRtd�k�rRtdk�rRtd$ad}	|dk�rRd}
tdait
t<gtt<|	�rtdk�r�t
d%tt�d	�d&tt<dt
td<tt
td<dt
td<gt
td<gt
td'<gt
td <it
td
<tdait
t<gtt<|
�r�tdk�rt
d(td	�dtt<dt
td<d)t
td<d*t
tddt
tddft
td<gt
td<gt
td'<gt
td <it
td
<tdait
t<gtt<|tt<|t
td<|�s�d+|}|jd,�t
td-<t|�t
td<|t
td.<tdk�rtt
td<n^t�rLtd/k�rLd*t
tddtft
td<n,d*t
tddt
tddft
td<x2tt
tj��D]}t
t|�s�t
t|=�q�W|t
td<gt
td<gt
td'<gt
td <it
td
<it
td0<|dk�r
gt
td1<|d�k�r�|t
td$d'k�r@t
td$d'j|�tj t
td$d
�t
td
<y,t
td
|t
td
|d2j!d3�=Wnt"k
�r�YnX|d�k�r�y6t#t
td
|t
td$d
d�t
td
|<Wnt"k
�r�YnX|dk�rT|�rT|t
td
k�rT||k�sTt#t
td
|t
td
|�t
td
|<yt
td$d j|�Wnt"k
�r�YnX|d"k�r�t$d	j|jd,�d4|�}
|
�r�t%|
jd�|
jd��\}}}}t&||||�|d�k�rdttdjt
t�ttttdd�d<tt=tdattdjt
t�ttttdd�d<tt=tda�n|d0k�r�t|jd��\}}}}|dk	�rd|�r�td5d�t|�j	d�D��}ng}|dk�s�t't|���|t
td0|<d0|tfa�nz|dk�r2t%||jd��\}}}}t&||||�}|dk	�rdd6|tfa�n2|d�k�r�t
td
}|jd�j(�}|j)d>�}|d	k�	r|d8k�	rt*|�j)d?�d$}|d|d�d>||dd�}|j)d>�}||d�d>k�	rdt
tk�	rt
d@|jd�|d|�f�|dAj+t
td�}|d	k�	rd	}d}n |d|�j(�}||d$d�}t|�j	d�}t,|�dk�	rz|d	}t
dBdAj+|dd���d}�xdCd�t|�j	d�D�D�]�}t-j|�}|�	s�|d�k�	r�d}n$t.|j/��t
dD|t|�f��	q�nt|jd��}||k�
ri||<|d7k�
r||jd�}|d8k�
r�|jd�|}t0j|��
r�|t
tdk�
r�tdk�
r�dEt
td$dk�
r|t
dF�|t
tdk�
r�t
dG|t
tdf�t
tdj|�nt1dH|�nt1dI|�|d�k�
r�|}d2||k�r||d2j|�n|g||d2<|d3k�r|t
tddk�r:t
dJ��	q�|t
tdk�rP�	q�d't
tk�rjgt
td'<t
td'j|�|}�	q�W|t
td
<|dk	�rdd6|tfa�n�|dKk�rt
td
}|jd�j(�dd��}d}�xt|�j	d�D�]�}ydLd�|j	dM�D�\}}Wn*t"k
�r8t
dN||f��w�YnXt2|�}t|�}||k�r\i||<dM||k�r�||dM|k�r�t
dO|||dM|f�t3||�}
|
�
rF|
j4dP�dQk�
rt|�}xHt5j6|�D]:}t||j7�|j8��j�j9dRdS��||j7�|j8��<�q�Wdj+|�}n0|
j4dP�dTk�
rF|dd�j�j9dRdS�j9dAdU�}yt:|i|�}Wn>t;t<t=fk
�
r�}zt1dV||f��w�WYdd}~XnXt|�||dM<d2||k�
r�||d2jdK�ndKg||d2<|}�q�W|t
td
<|dk	�rdd6|tfa�	n`|dWk�rP|jd�j(�j�dXk�r6dt
tdW<�qd|jd��rddWt
tk�r^t
tdW}ni}|dk�rxt
dY�i}�x�t|jd��j	d�D�]�}i} tjdZ|tj�}|�s�t
d[|��q�t>j|jd��}!|!�s�t
d\|��q�t%|!jd�|!jd��\}}}}t?||�\}"}#}$|| dP<|"| d]<|#| d^<|$| d_<x&t| j��D]}| |�sB| |=�qBWx�t|jd��j	d�D]�}%d`|%k�r�ydad�|%j	d`�D�\}&}'Wn&t"k
�r�t
db|%��wrYnXn|%j(�}&}'t,|&�t,|'�k�o�dkn�st
dc|%��qrx,t@tA|&�tA|'�d�D]}(| |tB|(�<�qW�qrW�q�W|t
tdW<�n|ddk�r�g}d})d}*d	}+d},d	}-x�|jd�D]�}.|-�s�|.dek�r�|,},|.dfk�r�|,�r�|+d}+�q~|.dgk�r�|-d}-n|.dhk�r�|-d}-|+d	k�r�|)|.})n\|+dk�r|*|.}*nH|+d$k�r~|)j(�})|)jCdA��r0|)dd�j(�})|j|)|*g�|.})d}*d	}+�q~W|+d$k�r�|)j(�})|)jCdA��r~|)dd�j(�})|j|)|*g�i}/d
t
tk�r�t
td
}/d}�x�|D�]�}0did�|0D�}0|0d	d	dAk�r�|0d	dd�|0d	<|0d	d	dgk�rt
dj|0d	��q�d	}d	}1t,|0d�}2�x4tdkd�t|0d	�j	d�D��D�]}|d	dgk�rrt
dj|��qNd	},xJ||2k�r�|,�s�|0d|dAk�r�|0d|dek�r�|,},|d}�qxW|d}||/k�r�i|/|<dM|/|k�r8|/|dM|0d|1|d�k�r8t
dl||/|dM|0d|1|d�f�|0d|1|d�|/|dM<|}1|}�qNW�q�W|/t
td
<|dk	�rdd6|tfa�n�|dmk�r|jd�j(�}|d	dfk�s�dn|}g}3d	}+d}4d}5xz|D]r}.|.dfk�r�|+d}+�q�|+d/k�r$|4j(�}4|4�sdo}4|3j|4|5g�|+d$}+d}4d}5|+d$�r8|4|.}4n|5|.}5�q�W|4j(�}4|4�sXdo}4|3j|4|5g�i}6dmt
tk�r�t
tdm}6xh|3D]`}.|.d	|6k�r�g|6|.d	<x>dpd�t|.d�j	d�D�D]}|�r�|6|.d	j|��q�W�q�W|6t
tdm<dm|4tfa�n\|dqk�rhtjdr|jd�tj�}|�rR|j/�}7dqt
tk�rPit
tdq<|jd�}it
tdq|<d	}8ds|7k�rf|7dsdk	�rfdt|7k�r�|7dtdk�r�d}8|8t
tdq|du<dvd�|7dsj	dA�D�}i}9x||D]r}0dM|0k�r,tjdw|0tj�}!|!�r|!jdq�j(�|9|!jdx�j(�<nt
dyt|0��n|0|9|0<|9t
tdq|dz<�q�Wnnt.|j/��t
d{�n�|d�k�r�d|t
tk�r�it
td|<t
td|}:|jd�d}k�r�d}|:k�r�tD|:d}tE��r�|:d}g|:d}<|:d}j|jd��n|jd�|:|jd�<nh|dk�rFtdk�r"t�rt
d~�dSt};tFt
|;tdd$�|jd��ntdk�rdt.|j/��t
d�dS)�Nr�r�r�r�r�rarrorzBanalyzeline: no group yet. Creating program group with name "%s".
�programr�r�r�reZfromsky�fromzblock\s*data�
block datazpython\s*modulez
python moduler��_BLOCK_DATA_r�	interfacez2analyzeline: No name/args pattern found for line.
cSsg|]}|j��qSr$)r�)rg�xr$r$r%ri�szanalyzeline.<locals>.<listcomp>z@,@z<analyzeline: argument list is malformed (missing argument).
r�r�r�r�)r�r�rzz&analyzeline: Creating module block %s
�moduler�zDanalyzeline: Creating additional interface block (groupcounter=%s).
�unknown_interfacez%s:%sZunknown_r��prefixr��r��varnamesr!r�rcSsg|]}|j��qSr$)r�)rgr=r$r$r%ri?s�variabler�r�r�r�r�r�r�z::z@)@z'All arguments will have attribute %s%s
r�zXanalyzeline: cannot handle multiple attributes without type specification. Ignoring %r.
cSsg|]}|j��qSr$)r�)rgr=r$r$r%rieszEanalyzeline: no name pattern found in %s statement for %s. Skipping.
�__user__z8analyzeline: missing __user__ module (could be nothing)
z;analyzeline: appending intent(callback) %s to %s arguments
z+analyzeline: intent(callback) %s is ignoredz<analyzeline: intent(callback) %s is already in argument listz(analyzeline: ignoring program arguments
r�cSsg|]}|j��qSr$)r�)rgr=r$r$r%ri�sr$zManalyzeline: could not extract name,expr in parameter statement "%s" of "%s"
zGanalyzeline: Overwriting the value of parameter "%s" ("%s") with "%s".
r.r/r��e�complexz+1j*(z1analyzeline: Failed to evaluate %r. Ignoring: %s
r��nonez<analyzeline: Overwriting earlier "implicit none" statement.
z9\s*(?P<this>.*?)\s*(\(\s*(?P<after>[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|]}|j��qSr$)r�)rgr=r$r$r%ri�szZanalyzeline: expected "<char>-<char>" instead of "%s" in range list of implicit statement
z^analyzeline: expected "<char>-<char>" instead of "%s" in range list of implicit statement (2)
r��'rqrrcSsg|]}|j��qSr$)r�)rgr=r$r$r%ri$sz>analyzeline: implied-DO list "%s" is not supported. Skipping.
cSsg|]}|j��qSr$)r�)rgr=r$r$r%ri.sz=analyzeline: changing init expression of "%s" ("%s") to "%s"
r�z//�_BLNK_cSsg|]}|j��qSr$)r�)rgr=r$r$r%riisr�zT\A\s*(?P<name>\b[\w]+\b)\s*((,(\s*\bonly\b\s*:|(?P<notonly>))\s*(?P<list>.*))|)\s*\Zr(Znotonly�onlycSsg|]}|j��qSr$)r�)rgr=r$r$r%ri|sz;\A\s*(?P<local>\b[\w]+\b)\s*=\s*>\s*(?P<use>\b[\w]+\b)\s*\Z�localz0analyzeline: Not local=>use pattern found in %s
�mapz0analyzeline: Could not crack the use statement.
r�Zusercodez-analyzeline: No context for multiline block.
z+analyzeline: No code implemented for line.
)r�r�r�ra)r�r�r�)r<r:)r�r�r	)r�r�)r�r�)r�r�r	r	)r�r�r�r�r�r�r�r�)r�r�)r�r�r�r�r�r�r	)r�)Gr�r#rrrr�r��basenamerr�r,rr�r�rr�r�r�r�r7rkr��removerrr
r�rfr(r)r��copy�deepcopyrTr�r0r�cracktypespec0�
updatevarsr�r��findrr�rQ�namepattern�printr�r2rd�get_parameters�determineexprtyper1�
real16pattern�finditer�startr�r��eval�SyntaxError�	NameError�	TypeError�typespattern4implicit�
cracktypespecr��ord�chr�
startswith�
isinstancer��appendmultiline)<r�r8r*r�Znewnamerer�r�r4Z
needmoduleZ
needinterface�itr/�tr.�selector�attr�edecl�	last_namer�rs�pl�chrErZapZinitexpr�params�tt�v�msg�implr-r�
kindselect�
charselectr%ruZbegcZendc�o�dlZilr�Zfc�inpr�r�r��jZllenZclZbn�olZ	commonkey�mmZisonlyr�r��gcr$r$r%r�s�













*
 *


4

,







$
 
"












"
8








$












*
&
2&







"









rcCs:d|kri|d<|d}||kr(g||<||j|�dS)NZf2pymultilines)r�)r�Zcontext_name�mlr�r$r$r%rf�srfcCs�d}d}tjd|tj�rd}n"tjd|tj�r4d}n|j�j�}tjt|��}|s^td�dS|j�}x$t	|j
��D]}t||�||<qtW|dkr�|d}|d
}|jd�}|dkr�|d|�j�}||dd�}||||fS)Nzdouble\s*complexzdouble complexzdouble\s*precisionzdouble precisionz>cracktypespec0: no kind/char_selector pattern found for line.
rFr0�logicalr/�	characterrar�r�z::rrz)rFr0r~r/rra)
r�r�r�r�r��
selectpatternrr,r�r(r)r rT)r.r�rirjrr�r/rsr$r$r%rR�s.
rRz+\s*(?P<name>\b[\w]+\b)\s*(?P<after>.*)\s*\ZzC\s*(\(\s*(kind\s*=)?\s*(?P<kind>.*)\s*\)|[*]\s*(?P<kind2>.*?))\s*\Zz3\s*(\((?P<lenkind>.*)\)|[*]\s*(?P<charlen>.*))\s*\Zz�\s*(kind\s*=\s*(?P<kind>.*?)\s*(@,@\s*len\s*=\s*(?P<len>.*)|)|(len\s*=\s*|)(?P<len2>.*?)\s*(@,@\s*(kind\s*=\s*|)(?P<kind2>.*)|))\s*\Zz�\s*(@\(@\s*(?!/)\s*(?P<array>.*?)\s*@\)@\s*[*]\s*(?P<len>.*?)|([*]\s*(?P<len2>.*?)|)\s*(@\(@\s*(?!/)\s*(?P<array2>.*?)\s*@\)@|))\s*(=\s*(?P<init>.*?)|(@\(@|)/\s*(?P<init2>.*?)\s*/(@\)@|)|)\s*\ZcCs�|j�}t|�dkr|S|d}xTtdt|�d�D]>}||dkrf||ddks4||ddkrfq4|||}q4W||d}|S)Nrrrz()[]{}=+-/* r	)r�rQr�)�exprZexpr2rsr$r$r%�removespaces�sr�cCs�d}d}d}d}x�|D]�}|dkr8|d	kr8||}|}q|dkrL|d
krL|}||kr^|d}n,||krp|d}n|dkr�|dkr�|d}q||}|}qW|S)NrrrIrp�"rrz@_@)rprIr�)rIr�r$)r*r�r��cc�cbr�r$r$r%�markinnerspaces�s*


r�c	Cs�d}t||�\}}}|r�dd�t|�jd�D�}g}tjd�}	xL|D]D}
|
sNqD|	j|
�}|r~|jd�j�}||
t|�d�}
|j	|
�qDW|}dd�t|�jd�D�}
g}xP|
D]H}xBdd�tt
t|��dd	�jd
�D�D]}|r�|j	|jdd��q�Wq�W�x�|D�]�}t
j|�}|�s0tdt|���qt|jd
��}i}|ttdk�r~ttd|j�}d|k}|�r�||d<n,|�r�||dk�r�td||d|f�d|k�r�tj|�|d<n||�rBxtt|j��D]d}||dk�r&|||d|k�r&td|||d|||f�ntj||�|d|<�q�Wd|k�rt|�rt|�rb||d<ntd||f�n||�r�xtt|j��D]d}||dk�r�|||d|k�r�td|||d|||f�ntj||�|d|<�q�Wd|k�r||d<n,|�r0|d|k�r0td||d|f�d|k�rJtj|�|d<n2|�r�xl|D]"}
|
|dk�rV|dj	|
��qVWn@tj|�|d<tj|�|d<tj|�|d<||d<tj|�|d<|jd��rdtjt|jd���}|�rN|j�}x:d0D]2}||ddk	�r�||d||<||d=�q�Wx<t|j��D],}||dk	�rZt||�||<n||=�q6Wd|k�r�d|k�r�|ddk�r�|d|d<|d=n8|dd|d|d<|d=td |||||df�d|k�rhd!|d}d|k�s|d�r|g|d<n\|dj	|�xL|dD]@}|dd"�d#k�r$||k�r$|dd1=td%|||f�P�q$Wd|k�r�|d2k�r�d|k�s�|d�r�i|d<|d|dd*<nP|d+k�r�d|k�s�|d�r�i|d<d|dk�r�|dd=|d|dd*<d|k�rdd,|k�r@|d,|dk�r@td-||d,|df�n|d|d,<ntd.||jd��x&t|j��D]}||�sr||=�qrW|ttd|<d/ttk�r�ttd/j	|�|}�qW|S)3NcSsg|]}|j��qSr$)r�)rgr=r$r$r%riszupdatevars.<locals>.<listcomp>z@,@z(?P<start>[a-zA-Z]+)r[cSsg|]}|j��qSr$)r�)rgr=r$r$r%riscSsg|]}|j��qSr$)r�)rgr=r$r$r%risr)rz@ @z@_@z;updatevars: no name pattern found for entity=%s. Skipping.
rer�r.zIupdatevars: 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.
r!r�rQ�array�init�2rr�z-updatevars: "%s %s" is mapped to "%s %s(%s)"
z
dimension(%s)�	r�rz5updatevars:%s: attempt to change %r to %r. Ignoring.
rFr0r~r/rrr$zTupdatevars: attempt to change the init expression of "%s" ("%s") to "%s". Ignoring.
z?updatevars: could not crack entity declaration "%s". Ignoring.
rB)rQr�r�r	)rFr0r~r/)rar�r�r�r�r�r�r�rQr�r�r�r�rUr,r�rfr�rrPr(r)rd�lenarraypatternrr�r )r.rir!Z
entitydeclrlrtrur%r�r�r�r��s�elZel1rEZe1ZenamerkZnot_has_typespecr/r�d1�lk�dmZdm1r$r$r%rS�s



*


&
&













rSc	Csd}d}d}|�r�|dkr�tj|�}|s<tdt|��dS|j�}|d|d<|d=x"t|j��D]}||sd||=qdWx$t|j��D]\}}t|�||<q�W�nX|dk�r�t	j|�}|s�td	t|��dS|j�}|d
|d<|d
=|d�rRt
jt|d��}|j�}xBdD]:}||d�r6||d||<||||<||d=�qW|d=x&t|j��D]}||�sf||=�qfWxzt|j��D]\}}t|�||<�q�WnR|dk�r�tjd|tj
�}|�r�|jd�}ntdt||��ntdt|��|||fS)NrFr0r~r/z4cracktypespec: no kindselector pattern found for %s
Zkind2rrz4cracktypespec: no charselector pattern found for %s
Zcharlen�lenkindrQ�kindr�raz\s*\(\s*(?P<name>\w+)\s*\)rez'cracktypespec: no typename found in %s
z'cracktypespec: no selector used for %s
)rFr0r~r/)rQr�)r"r�r,r�r�r(r)�itemsrfr#�lenkindpatternr�r�r�r�)	r.rirtrur%r/rsr�r�r$r$r%ra�sf







racCs�|si}|s|Sd|kr&|g|d<|S|r8|dj|�||dkrH|S|dkrld|dkrl|dj|�nz|dkr�d|dkr�|dj|�nV|dkr�d|dkr�|dj|�n2|dkr�d|dkr�|dj|�n|dj|�|S)Nr!rC�	automaticr�r�)r�)r-rjr.r$r$r%r*�s.
r*cCs^|si}|s|Sd|kr$||d<|Sx4t|j��D]$}|sF||dkr2|||d|<q2W|S)Nr")r(r))r-�selr.r/r$r$r%r+�sr+cCs^|si}|s|Sd|kr$||d<|Sx4t|j��D]$}|sF||dkr2|||d|<q2W|S)Nr#)r(r))r-r�r.r/r$r$r%r,�sr,�unknowncCsd|kr|dS|S)Nrer$)r�r�r$r$r%�getblockname�sr�cCs2yd|d|dfaWntk
r,YnXdS)Nz
In: %s:%s
r9re)rr�)r�r$r$r%�setmesstextsr�cCs2i}d|krt|d�}d|kr.|j|d�|S)N�parent_blockr�)�get_usedict�update)r��usedictr$r$r%r�sr�c	Cs�|dkri}t|�}|s|Sx�t|j��D]�\}}|j�}|tkrZtd||jd�f�q*t|}t|�}|spq*|r�td|�x@t|j��D]0\}}||kr�tdt	|�t	|�f�|||<q�Wq*W|S)Nz0get_useparameters: no module %s info used by %s
rez+get_useparameters: mapping for %s not impl.zDget_useparameters: overriding parameter %s with value from module %s)
r�r(r�r�rr,r1rWrdr�)	r��	param_mapr�Zusename�mapping�mvarsror/rqr$r$r%�get_useparameterss.r�c
s�ts|St|t�r*��fdd�|D�}|St|�td�|dfd��dkrXt|���dk	r�d|kr�|d}xPt|j��D]@}||}d|kr~|d}d|kr~|d}|�kr~�||d<q~W��fd	d�|d
D�}	|	|d
<|S)Ncsg|]}t|�d�d��qS)rx)�tabr�)�
postcrack2)rg�g)r�r�r$r%ri=szpostcrack2.<locals>.<listcomp>z%sBlock: %s
rerr�r"r�csg|]}t|�d�d��qS)rx)r�r�)r�)rg�b)r�r�r$r%riPsr�)rrer(r�r,r�r))
r�r�r��retr�r��varr��valZnew_bodyr$)r�r�r%r�7s0
r�cCsjt|t�rjg}g}xN|D]F}t|�t||dd�}d|krTd|dkrT|j|�q|j|�qW||St|�t|t�r�d|kr�tdt|���d|kr�|ddkr�td||dfd	�t	|�}t
|�}t|�|d
<t|d
�|d<d|ko�|d�r|d}t
|||d�|d
<g}d|k�r^|d}x0t|j��D]}d|k�r>|j|��q>Wni}d}	d|k�rx|d}	d|k�rX|d�rXg}
d|k�r�|d}
tj|d
�}|	�r�|	d}nd}||k�rd}
x d||
f|k�r�|
d}
�q�Wd||
f}dgi|	dd�}�x�|dD]�}||
k�r�g}d}x�|d
D]�}|d}|ddk�r>d}
xH|d
D]<}|
d}
d|k�rf|d|k�rftj|�}|d
|
=P�qfW|�r>|d
�s�|d
|=|
|
j|�=P�q>W|d
j|�n*||k�rt||��r|||d
|<�qW|d
�s(|d
�rX|
|d<d|gi||dd�}i||<tj|�|�rf||d<|S)zi
    TODO:
          function return values
          determine expression types if in argument list
    rx)r�rerDr�z0postcrack: Expected block dictionary instead of r?z%sBlock: %s
rr�Zsortvarsr�r�r�rr�r�Z__user__routinesZunknown__user__routinesrz%s_%ir<Z_user_interface)r�r�r�rez
python module)r�r�r�rer�r	r	)rer(r��	postcrackr��dictr�r�r,�analyzeargs�
analyzecommon�analyzevars�sortvarnames�analyzebodyr)rPrTZ
isexternalr)r�r�r�ZgretZuretr�Z
userisdefinedZuseblockr/rer�r�Zmnamersr<rEZedefryr�ZbbZmblockr$r$r%r�Ws�













r�cCs
g}g}xBt|j��D]2}d||kr>||dr>|j|�q|j|�qWt|�}d}x�|�r|d}d}x*|dd�D]}|||dkrzd}PqzW|r�|dd�|g}|d}||kr�tddj|�d�||}PqZ|j|�|dd�}t|�}d}qZW|S)N�dependrrzTsortvarnames: failed to compute dependencies because of cyclic dependencies between z, r�)r(r)r�rQrdr�)r�Zindep�deprqr�rsr�wr$r$r%r��s8
r�cCs�t|�s|Sg}�xXt|dj��D�]B}g}�x*|d|D�]}tjd|tj�}|�r:g}|jd�r�dd�t|jd��jd�D�}t	|jd�j
��}||dkr�d	|d|kr�|d|d	jd
dj|��nd
dj|�g|d|d	<n0|�rd	d
dj|�gi|d|<ni|d|<||k�rN|j|�n|}t
d||f�|j|�q>W||d|<q$Wd
|k�r�||d
<n|d
||d
<|S)Nr�z2\A\s*\b(?P<name>.*?)\b\s*(\((?P<dims>.*?)\)|)\s*\Z�dimscSsg|]}|j��qSr$)r�)rgr=r$r$r%ri�sz!analyzecommon.<locals>.<listcomp>z@,@rer�r!z
dimension(%s)r�zNanalyzecommon: failed to extract "<name>[(<dims>)]" from "%s" in common /%s/.
�
commonvars)Z	hascommonr(r)r�r�r�r�r�r�rfr�r�r�rd)r�r�r/ZcomvarsrEr�r�r�r$r$r%r��sB



r�cCs
t|�g}�x�|dD]�}||d<|ddkr�|dk	rH|d|krHqn|d}|dtkr^qtrp|dtkrpqt|ddd�|d
<n|}t|||dd�}|ddkr�|dr�d|kr�q|djd	d�dkr�tj|�q|ddk�r�|dt|d<|j|�qW|S)Nr�r�r�r�r�rer�r�rr�T)�as_interfaceZsaved_interfacerx)r�r<r�r�pythonmoduler>r�)r�r�z      z
      )	r�r r!�crack2fortrangenr�r�rr�r)r�r�r�r�r�Zas_r$r$r%r�s2r�cCs�t|�t}i}d|kr�|ddkrFd}tdkr�tdt|d��nVxTt|dj��D]@}|d|jd�dkr�|d|||<qX|d|d||<qXW||fS)	Nr�rz6buildimplicitrules: no implicit rules for routine %s.
rer.rCr�)rCr�)r��defaultimplicitrulesr
r,r�r(r)r1)r��
implicitrules�	attrrulesr/r$r$r%�buildimplicitrules&sr�cCs8t|||�}t|�td�td�gkr(|Std|��dS)Nrgzr=%r)r\rar�)rEr�r�rur$r$r%�myeval9sr�z\A\b\w+\b\ZcCsytt|ii��}d|dfStk
r.YnXtj|�rDdd|fSt|�}�x�|D�]�}t|�|krhqTtjd|d|�r~qTtjd|dtj	�}|j|�}|rT�yP|j|�}x,|r�d|j
d�d|j
d	�f}|j|�}q�Wt|ii�}	|j|�}x.|�r"d|j
d�d|j
d	�f}|j|�}q�Wt|ii�|	}
|j|�}x0|�rnd|j
d�d
|j
d	�f}|j|�}�q@Wt|ii�}|j|�}x0|�r�d|j
d�d|j
d	�f}|j|�}�q�Wt|ii�}|
d
|	|k�r�|
d|	|k�r�|
|	|fSWntk
�r
YnXPqTWdS)
Nrrz\w\s*\([^)]*\bz\bz(?P<before>.*?)\bz\b(?P<after>.*)z%s(%s)%sr�r�g�?g�?)NNN)r1r�r��getlincoef_re_1r�rQr��searchr�r�r�)rEZxsetr�Zlen_er=rr�r�eer�r��c2r$r$r%�
getlincoefBs^







$r�z\A[a-z]\w*\Zrc
Cs�g}y|jt|dii��Wn"tk
r@|j|d�YnXy|jt|dii��Wn"tk
r~|j|d�YnXt|dt�r�d|d}|dkr�t|d�}n,|dkr�d|d|f}nd|d|f}nZt|dt��r$d|d}|dk�rd|d}nd||df}nd|d|df}ytt|ii��ddfStk
�rdYnXt|d|�t|d|�}}d|d|dgk�r�|d|dfdk�r�t|d|dd�ddfS|d|dd}|dd|df}|d||df}|ddk�r�|d|k�r�|dk�r\d	|d|d|f|dd
||dffS|�r�d|d|d|f|dd||dffSd
|d|df|dd|dfS|ddk�rn|d|k�rn|dk�rd	|d|d|f|dd
||dffS|�rDd|d|d|f|dd||dffSd
|d|df|dd|dfS|d|dk�r,|d|k�r,|d|d}	|	�s�t|�ddfS|dk�r�d	|	|d|f|dd
||	ffS|�rd|	|d|f|dd||	ffSd
|	|df|dd|	fS|d|dk�oHdkn�r�t|d�}
|
|k�r�t|
��r|t	d|
�d|
}
|dk�r�d|d|
f}n2|dk�r�d|d|
|f}nd|d|
|f}�n�|ddk�r�t|d�}||k�rt|��rt	d|�d|}|ddk�r(n(|ddk�r@d|}nd|d|f}|dk�r`|}n&|dk�rzd||f}nd||f}�n"|ddk�rht|d�}||k�r�t|��r�t	d|�d|}|ddk�r�d|}nJ|ddk�r�d|}n2|ddk�rd|d|f}nd|d|f}|dk�r>|}n&|dk�rXd||f}nd||f}�nDt|d�}||k�r�t|��r�t	d|�d|}|ddk�r�d|}nJ|ddk�r�d|}n2|ddk�r�d|d|f}nd|d|f}t|d�}||k�r2t|��r*t	d|�d|}|ddk�rBn(|ddk�rZd|}nd|d|f}|dk�r�d||f}n*|dk�r�d|||f}nd|||f}|ddfS) Nrrz%s-%sz%s+%sz-(%s)z%s-(%s)z	%s-(%s)+1rzz%s * %s - %sz	+%s)/(%s)z%s * %s + %sz	-%s)/(%s)z%s * %sz)/(%s)z#	getarrlen:variable "%s" undefined
z(%s)z%s-%s-%sz%s-%s+%sz-%sz%s*%sz+%sz+%s*%sz-%s*%sz%s%sz%s%s-%sz%s%s+%s)rrr	r	r	r	)
r�r�r�rer1r�r�r��_varname_matchr,)
rwr��starZedl�p1r�r�Zd2r�r�r�r��c1r$r$r%�	getarrlenxs�

0,&
40* 
($$























r�z\b[a-z][\w$]*\bcCs�||kr�||jdg�}d||krht||�rhx4tj||d�D]}||krF||krF|j|�qFWx^|dd�D]8}x2|j|g�p�t|||�D]}||kr�|j|�q�WqvWntdt|��g}|||<|S)Nr�r$z,_get_depend_dict: no dependence info for %s
)r1�isstring�word_pattern�findallr��_get_depend_dictr,r�)rer��deps�words�wordr�r$r$r%r�	sr�cCs.t|j��}i}x|D]}t|||�qW|S)N)r(r)r�)r�rj�depend_dictr�r$r$r%�_calc_depend_dict$	s

r�cs�t���g}x,t�j��D]}�|s|j|��|=qWxR�r�xHt�j��D]8\}}�fdd�|D�}|s~|j|��|=qN|�|<qNWq<W�fdd�|D�S)z
    csg|]}|�kr|�qSr$r$)rgr�)r�r$r%ri7	sz$get_sorted_names.<locals>.<listcomp>csg|]}|�kr|�qSr$r$)rgre)r�r$r%ri=	s)r�r(r)r�r�)r�rjre�lstZnew_lstr$)r�r�r%�get_sorted_names,	s


r�cCs@|ddkr|dd�}tj|�r&dStj|�r4dSd|dS)	Nrz'"r�rzkind(rr	)rYr��real8pattern)r\r$r$r%�
_kind_func@	s

r�cCsLd|}|d
krdS|dkr dS|dkr,dS|d
kr8dS|dd	krHdSdS)Nr�rzr�r�� r�?��illr	r$)rur�r$r$r%�_selected_int_kind_funcK	sr�cCsX|dkrdS|dkrdStj�j�}|jd�r<|dkrTdSn|dkrHd
S|dkrTdSdS)N�rr�r��aarch64�power�ppc�riscv�s390x�sparc��r�r)r�r�r�r�r�r�r	)�platform�machiner�rd)�pru�radixr�r$r$r%�_selected_real_kind_func[	s
r�cCs4tj|�}tj|�}x2dtfdtfdtfgD]\}}||kr,|||<q,Wg}x6t|�D]*}d||krVd||dkrV|j|�qVWtjdtj�}tjdtj�}	tjdtj�}
�x~|D�]t}d	||k�r||d	}t	||��r|j
�}xdD]}|j|�}q�W|jd|�}|	jd|�}d}
d||k�rpd||dk�rpt
|�}|jd||ddd�}t
|�|k}
|
�s�|
j|��s�|jd�}t
|�dk�r�dj|dd ��j
�j|d!j
�d�}t||��r,t|�}xHtj|�D]:}t||j�|j��j
�jdd��||j�|j��<�q�Wdj|�}n@t||��rl|ddk�rl|d"dk�rlt|dd#��jd�}yt|||�||<Wn@tk
�r�}z"|||<td|t|�f�WYdd}~XnXt||��r�t||t��r�t ||�||<|j
�}||k�r,||||<q�t!||�tdt|��q�W|S)$Nr�Zselected_int_kindZselected_real_kindr!r�z \bkind\s*\(\s*(?P<value>.*)\s*\)z-\bselected_int_kind\s*\(\s*(?P<value>.*)\s*\)z4\bselected_(int|real)_kind\s*\(\s*(?P<value>.*)\s*\)r$�.false.�False�.true.�Truez
kind("\1")zselected_int_kind(\1)Fr"r�rrr�rErrrz@,@zget_parameters: got "%s" on %s
z2get_parameters:parameter %s does not have value?!
�r�r��r�r�)r�r�r	r	r	r	)"rPr�r�r�r�r�r�r�r�Z	islogicalr�r��subrQr�r�r�Zisdoubler(rYrZr[r�Z	iscomplexr�r\r�r,r�r�rer1rcrV)r�Z
global_paramsroZg_paramsre�funcZparam_namesr�Zkind_reZselected_int_kind_reZselected_kind_rerq�replZis_replacedZ
orig_v_lenZv_rpr�r�rr�nlr$r$r%rWn	sz




&
8&
rWcCs|dkrdSt||�S)N�(:)�(*)r)r�r�r)�_eval_scalar)�lengthror$r$r%�_eval_length�	sr�z\d+_cCs�t|�r|jd�d}ytt|i|��}WnTtttfk
rD|Stk
r~}z td||t	|j
��f�WYdd}~XnX|S)Nr�rz,"%s" in evaluating %r (available names: %s)
)�_is_kind_numberr�r�r\r^r]r_r�rdr(r))�valuerorrr$r$r%r��	s(r�c6Cst|�t|�\}}tj|d�}|ddkrF|d|krFi||d<d|dkr�|d=d|ddkr�|ddd}x<t|j��D],}x&dSD]}||kr�t|||�||<q�Wq�Wg}|d	}x8|D]0}	y||	|j|	�Wq�tk
r�Yq�Xq�Wx*t|j��D]}||k�r
|j|��q
Wt|t	|��}
i}t
jd
�j}xtt|j��D]d}
||
�}|�rT|
|j
�|j��}y||Wn.tk
�r�t
jd|
t
j�j||<YnX�qTW�x�|D�]�}|dt|j��k�r�t||||d�||<d
||k�r�d||k�o$d||dk�s�|�r�|dj�}x�t||j��D]~}|d
k�rp|||dk�rp�qL|||k�r�||||||<n4|dk�rLx(|||D]}t|||�||<�q�W�qLWn&||d	k�r�tdt|�|df�d||k�rbd||dk�rb||dd}ytt|i|
��}Wntk
�rPYnX|||dd<d||k�r�d||dk�r�||dd}ytt|i|
��}Wntk
�r�YnX|||dd<i}d||k�r�||d}|j�g||d<dT\}}}}}�x�|D�]�}	|	dd�dk�rH|	dd�j�ddU�}n�|	dd�dk�rt|	dd�j�ddV�}n�|	dd�dk�r�|	dd�j�ddW�}nj|	dd�dk�r�|	dd�j�ddX�}n>|	dd�dk�r�|	dd�j�ddY�}nt|||	�||<|�r�d||k�r*g||d<xRdd �t|�jd!�D�D]6}|jd"d�}|||dk�rD||dj|��qDWd}|�r�|jd#d$�}|jd%d&�}d||k�r�|g||d<n||dj|�d}|dk	�rHd||k�r�g||d<xJtd'd �t|�jd!�D��D]*}|||dk�r||dj|��qWd}|dk	�rd||k�rlg||d<xFd(d �t|�jd!�D�D]*}|||dk�r�||dj|��q�Wd}�qW|�r�d||k�r�g||d<�x�td)d �t|�jd!�D��D�]�}d*}|d+k�rd+}||
k�r,t|
|�}xnt|
j��D]^}t
jd,|d-t
j�}|j|�}x6|�r�|jd.�t|
|�|jd/�}|j|�}�q`W�q:W||k�r�|g}nt|d+�jd0�}t|�d1k�r�d*|k�r�d*g}d*}t|�dk�r
|d|k�r
d2|dg}t|�d1k�r�t|t|dj���\}}
}|dd�d3k�rR|dd�}|�rv|dZd�d4k�rv|dd[�}|
�r�|
|f||<||dj|��q�Wd||k�	r�t||��r�d5} nd5} t ||��	r�d||k�	r�||d}d*|k�	r�|d*}t!d6||d7j"||d�|d7j"||d|g�f�||dj|�||d=d||k�	rng||d<d8||dk�	r�||djd8�nt!d9|�d||k�
r�d	|k�
r�||d	k�
r�d||k}!|!�	r�g||d<g||d<d||k�r�d\}"t||d�}#�x^||dD�]�}g}$d}%d}&||k�
r�||k�
rhd:||d}&}%||d}nFxD|d	D]8}'|'|k�
r��
qrt
jd;|'d<|t
j��
rr|$j|'��
qrW||k�r0d||k�rxJ||dD]:}(|(dd�dk�
r�|$|(dd�j�dd]�jd7�7}$�
q�Wd||k�r0|$||d}$|"d}"||k�r|d||k�r|d=||k�r||||dk�r|t#t$t%t&�||��r||g||d<|#dk�r�d>|&| ||"|%f||d=<nd?|&||%f||d=<d�r(d||k�r(|#dk�rd@|&| ||"|%|fg||d<ndA|&||%|fg||d<d||k�rDdBg||d<dB||dk�r�dC||dk�r�||djdB�nP|d^k�
r"|!�
r"||k�r�||$k�r�||dj|�n||d|$||d<�
q"Wn�t'||��
rtd2})d||k�
rtd*||dk�
r.t(||dd*|
�})|)||dd*<nFd||dk�
rtt(||dd|
�})||dd=|)||dd*<||d�
s�||d=|!�
r�||d�
r�||d=d=||k�r�d||k�
r�g||d<dB||dk�r
dC||dk�r
||djdB�d||k�r|g||d<x>t|j)��D].\}
}|||d=��r2||dj|
��q2W||d�s|||d=t*||��r�t+||d=|
�||d=<�q�W�x�t|j��D�]�}||dk�r�d||k�r�||d|d<|ddk�r�dD|k�r,|dD|k�r,t,||||dD�||<dE|k�r�|dE}*d}+d},|*jdFd�}-|*|-k}+|-jdGd�}*|*|-k},t-dj|*�}|�rbt.|jdH�|jd/��\}.}/}}0t/|.|/�\}1}2}3|.||d
<|1�rd|1k�ryt|1di|
�|1d<Wntk
�r�YnX|1||d<|2�r|2||d<|3�r0|3||dI<|+�rHt||dF�||<|,�rvt||dG�||<ntdJt|dE���q�W|dd_k�rdO|k�r�tj|d	|dO�}4ntj|d	�}4x4t|j��D]$}t#t0t1�||��r�|4j|��q�WdP|k�rX|4j2t|dPj���xFt|dPj��D]2}x*|dP|D]}||4k�r4|4j|��q4W�q"W|ddk�r�dD|k�r�|4j|dD�n|4j|d�|dd`k�r�|d}5|5|k�r�d||5k�r�||5d|d<|ddRk�r�|4j2t|j���x&t|j��D]}||4k�r�||=�q�W|S)aNr�r�r�rerr!r�r�r�z\w[\w\d_$]*z.*\b%s\brr.r�Z	undefinedzCanalyzevars: typespec of variable %s is not defined in routine %s.
r#rQr"r�r�r�rr�r�r�ryr'rr&cSsg|]}|j��qSr$)r�)rgr=r$r$r%ri@
szanalyzevars.<locals>.<listcomp>z@,@rz\n\nz

z\n r�cSsg|]}|j��qSr$)r�)rgr=r$r$r%riQ
scSsg|]}|j��qSr$)r�)rgr=r$r$r%riX
scSsg|]}|j��qSr$)r�)rgr=r$r$r%ri^
sr�:z(?P<before>.*?)\bz\b(?P<after>.*)r�r�z@:@rz�1z1 * z/(1)rSzoanalyzevars: character array "character*%s %s(%s)" is considered as "character %s(%s)"; "intent(c)" is forced.
r�r�z'analyzevars: charselector=%r unhandled.rz.*?\bz\br$z
%s%s(%s,%s)%sz%slen(%s)%sz%s%s(%s,%i)%s==%sz%slen(%s)%s>=%sr�r�r�r@Zpure�	recursiver�r%z'analyzevars: prefix (%s) were not used
r>r��
python module�
block datar�r�r�ra)r�r�)NNNNNr	r	r	r	r	���r�r	r	)rr�)r>r�r�r�)r�r�)3r�r�rPr(r)r*r��KeyErrorrWr�r�r�r�r[r�r�r�r,r�r�r\r��reverser�r�r�r�rkr�rQr�Z
isintent_cZ
isstringarrayrdr�Zl_orZisintent_inZisintent_inoutZisintent_inplacer�r�r�Zisscalarr�r0rrRra�isintent_callbackZisintent_aux�extend)6r�r�r�r��genr�r/Zsvarsr�r�roZdep_matchesZ
name_matchrqr�Zln0r�ZsavelindimsrjZdimr�r�r'r&r��tmpr�r�r�rrwZdiZshape_macror+rs�niZddeps�ad�pdruZaar��prZispureZisrecZpr1r.rirkrtrur%Z
neededvarsrer$r$r%r��	s~



$ 
 
"

&


 

 

&



( 




 


 








r�z\A[a-z]+[\w$]*\ZcCsr|}tj|�}|r�t|�\}}t||d|�}d}x0|D](}	|	j�}	|	tjtjkrZd}	||	}q:W|ddkr||d}n|d}|}x$||dks�||dkr�|d}q�W||kr�d}
x|t|
�|kr�|
d}
q�W|t|
�}|r�||d|<nx||dk�r4||dk�r(|d||d|<ni|d|<d	|k�rn||d	|d
k�rnt	|d|d�|d|<|S)
Nr�Ze_r�rrE�_er�rur�r�r�r	)
�analyzeargs_re_1r�r�rXr�r\�ascii_lowercase�digitsr�r*)r�r�r�Zorig_aZ	a_is_exprr�r�Zat�nar�r/r$r$r%�	expr2name<s>

 rcCs$t|�t|�\}}d|kr$g|d<g}x&|dD]}t|||�}|j|�q2W||d<d|kr�xBt|dj��D].\}}x$|D]}||dkr�i|d|<q�WqrWxN|dD]B}|d|kr�d|kr�g|d<|d|dkr�|dj|d�q�Wd|k�r |d|dk�r i|d|d<|S)Nr�r�r�r�rer�r�)r�r�rr�r(r�)r�r�r�r�r�r/Zargs1r�r$r$r%r�as.
r�z\A\(.+?[,].+?\)\Zz\A[+-]?\d+(_(?P<name>[\w]+)|)\Zz-\A[+-]?[\d.]+[\d+\-de.]*(_(?P<name>[\w]+)|)\Zz
\A\(.*\)\Zz\A(?P<name>\w+)\s*\(.*?\)\s*\ZcCsTt|t�rddiSt|t�r$ddiSt|t�r6ddiSt|t�rD|Stt|���dS)Nr.r0r/rF)rer1r3rFr�r�r�)rur$r$r%�_ensure_exprdict�s



rcCs�||krt||�S|j�}tj|�r.ddiStj|�}|rjd|j�krb|jd�rbtdt|��ddiSt	j|�}|r�d|j�kr�|jd�r�tdt|��ddiSxNdD]F}x@dd�t
||d
�jd|d�D�D]}||kr�t||�Sq�Wq�Wi}tj|��rt
|dd�||�}nftj|�}|�r�|jd�}t
|jd�||�}|�r^d|k�r^|d=|�s�|d|k�r�t||d�S|ddk�r�dd	d	id�S|�s�tdt|��|S)Nr.rFrez:determineexprtype: selected kind types not supported (%s)
r0r/�+rHrrqcSsg|]}|j��qSr$)r�)rgr=r$r$r%ri�sz%determineexprtype.<locals>.<listcomp>)rrrr!rz'"r)r.r#z>determineexprtype: could not determine expressions (%s) type.
)rrHrrqr	)rr��determineexprtype_re_1r��determineexprtype_re_2r�r�r,r��determineexprtype_re_3r�r��determineexprtype_re_4rX�determineexprtype_re_5)r�r��rulesr��oprErhZrnr$r$r%rX�sN



*

rXr�FcCst|�d}t|t�rjxN|D]F}|rP|ddkrP|dtkr>qtrP|dtkrPq|t|||d�}qW|Sd}d}d}|d}|dkr�dSg}	d|kr�|d}d|k�r|d	}
x2|dD]&}t|||	�}t|
|�s�|	j|�q�W|ddks�|	�rd
dj	|	�}d}d|k�rJx6t|dj
��D]"}
d
||t|
|d|
f}�q$W|jdg�dd�}|dk�r|d|k�r||j
d�|�r�d||tdj	|�|f}d}d|k�r�t|d|t�}d}d|k�r�t|d|t�}|dk�r�d}d}d|k�r d|d}|d|	k�r |	j|d�t|d|t�}t||d	|	|t|d�}
d}d|k�rn|�rnd|d}d|k�r�d}x8t|dj��D]$\}
}d||t|
dj	|�f}�q�W||}|dk�r�|dk�r�d}d||||||||||
|||||f}|S)Nrr�r�r�re)r�r8r�r�z(%s)r�r�z	%s%s%s %sr��callbackz%s%sintent(%s) %sr�r�r?r�z result (%s)r�r9z! in %sr�z%s%sentry %s(%s)z
block datar;z%%s%s%s %s%s%s %s%s%s%s%s%s%send %s %s)r�r�)r�rer(r r!r�rrr�r�r)rr1rO�use2fortran�common2fortran�vars2fortranr�)r�r�r�r�r�r@rer�Z	blocktypeZargslr�r�r�r/Z
intent_lstr�r�r�r�ZmessZentry_stmtsrsr$r$r%r��s�



 





$r�cCsZd}xPt|j��D]@}|dkr8d||dj||�f}qd|||dj||�f}qW|S)NrrJz
%s%scommon %sr�z%s%scommon /%s/ %s)r(r)r�)r�r�r�r/r$r$r%rsrcCsd}�xt|j��D�]�}d|||f}||ikrR|r|ddkr|dd�}qd||krr||drrd|}d||kr�||dr�d}xdt||dj��D]L}|||d|kr�d	|||f}d}q�d
|||||d|f}d}q�W|r|d
dkr|dd�}qW|S)Nrz%s%suse %s,rr�rKz%s only:rMrz%s%s%sz
%s%s%s=>%sr	r	r	r	)r(r))r�r�r�r�r�r/r$r$r%rs(rcCsX|d}g}xF|D]>}yt�d|}Wntk
r<YqX||�r|j|�qW|S)Nr�zisintent_%s)�globalsrr�)r�r�r�r�r�r$r$r%�true_intent_list)s
rc
Cst|�d}g}x"|D]}||dkr|j|�qWd|krvx8|dD],}||krf||krr|j|�qFtd|�qFWd|kr�|j|d�|s�x&t|j��D]}||kr�|j|�q�W�xX|D�]N}d||k�rxH||dD]8}||kr�d||kr�|||dkr�td||f�q�Wd|k�r�||dk�r�t||��rRd	|||f}d
|||f}t||��r|d|||f}||k�r�d||k�r�q�d
}	x4|dD](}
||
dk�r�|
ddk�r�d}	P�q�W|	�r�q�||k�r�t|�t	d|�q�||dk�r|ddk�rq�d||k�rxd||k�r^d||dk�r^||kr�d
|||f}q�t||�t	d|�q�||d}|dk�r�d||k�r�d|||df}i}d||k�r�||d}nd||k�r�||d}d|k�r&|dd9k�rd||df}nd||df}nZd |k�rfd!||d f}d"|k�r\d#||d"f}nd$|}nd"|k�r�d%||d"f}d&}
d||k�r�d'd(�||dD�}|�r�d)|d*j
|�f}d*}
d+||k�r�d,||
d*j
||d+�f}d*}
d-||k�r*t||�}|�r&d.||
d*j
|�f}d*}
d/||k�rXd0||
d*j
||d/�f}d*}
d||k�r�d1||
d*j
||d�f}d*}
d2||k�r�||d2}||dd:k�r�yt|�}d5|j
|jf}Wntk
�r�YnXd6|||f}nd7||f}d8|||f}q�W|S);z&
    TODO:
    public sub
    ...
    rr�r�z7vars2fortran: Confused?!: "%s" is not defined in vars.
rBr�zHvars2fortran: Warning: cross-dependence between variables "%s" and "%s"
r�z%s%sintent(callback) %sz%s%sexternal %sz%s%soptional %sr.rr�rer�r�rz/vars2fortran: No definition for argument "%s".
r!r�z-vars2fortran: No typespec for argument "%s".
rar%z%s(%s)r"r#rr�z%s*(%s)z%s*%srQz	%s(len=%sr�z%s,kind=%s)z%s)z%s(kind=%s)rcSsg|]}|dkr|�qS)r�)r�r$)rgr�r$r$r%ri�sz vars2fortran.<locals>.<listcomp>z%s, %sr�r�z%s%sdimension(%s)r�z%s%sintent(%s)r'z
%s%scheck(%s)z%s%sdepend(%s)r$rF�double complexz(%s,%s)z%s :: %s=%sz%s :: %sz%s%s%s)rr�)rFr)r�r�rdrr(r)rZ
isoptional�showr,r�rr\r/�imagr�)r�r�r�r�r�r�Znoutr�r�r�r�Zvardefrir�rjr�rqr$r$r%r7s�
$
 




rcCsHtdd�t|t�tdd�gattd�}tdd�t|�}t|S)NzReading fortran codes...
rzPost-processing...
zPost-processing (stage 2)...
)r,r�r�rr�rr�)�files�postlistr$r$r%�crackfortran�s



r$cCs$t|�d}d}dt}|||S)Nr�zE!    -*- 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��pyf�header�footerr$r$r%�
crack2fortran�sr)�__main__r�z-quietz-verboserzz-fixz?Use option -f90 before -fix if Fortran 90 code is in fix form.
z-skipemptyendsz--ignore-containsz-f77z-f90r�z-hz-showz-mrHzUnknown 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�z    r	r	)r)3r1r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`r(rarbz9\s*(?P<before>%s(?=\s*(\b(%s)\b)))\s*(?P<this>(\b(%s)\b))zN\s*(?P<before>%s(?=\s*(\b(%s)\b)))\s*(?P<this>(\b(%s)\b))\s*(?P<after>%s)\s*\Z)r�r�r�r�)r�r�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r�)rr�r�r)rr�r�r�)rr�r�r�)r)r�)r)r)r)r)r�)N)rN)Nr)r)NN)r)rr)r�F)r)r)rF)��__doc__r'r\r�r�r�rPr�rrZauxfuncs�versionr%r
rrr
rrrrrrrr�rrrrrr�rrr�r"rr!r#rr rrr&r,�	_MAXCACHEr�r�rcrlr�rfrkrmrnrtr�r�r�r�r�rr�r�r�r�r r�ZbeforethisafterZfortrantypesrr`rr	Z
groupbegins77r�Z
groupbegins90r�Z	groupendsrZendifsrr
r�r�r�r�rrrr�rrr
rrrrrr�Sr�r�r�r�rr�rr�r r0r�r5r6rYr�r2r3r7rrfrRrUr"r#r�r�r�r�rSrar*r+r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rWr�r�r�r�rrr�rrrrrrrXr�rrrrr$r)�__name__r"�funcsr��f2Zf3Z
showblocklist�argvr�rdr�r}r�r��IOErrorZdetailr�r#r&r)r$r$r$r%�<module>�sV&




R


'




9		 `"+"3Y^%
-K
z



&