/ lib / numpy / f2py / crackfortran.pyc
crackfortran.pyc
   1  o

   2  [��c`,�@s�
   3  dZddlZddlZddlZddlZddlZddlZddlZddlZzddl	Z	Wne
   4  y3dZ	YnwddlmZddl
TddlmZejadadadadadad	ad	adadadagad	ad	adaiad	a da!da"da#t#gia$d	a%ga&d
   5  a'ga(da)d
   6  a*ga+ga,ga-dd�Z.�dd
d�Z/de_0iZ1dD]Z2ddie1e2<q�dD]Z2ddie1e2<q�iZ3iZ4dD]Z5e5de3e5<e5e4e5d<q�dd�Z6dd�Z7dd�Z8dd�Z9dd �Z:e�;d!ej<�j=Z>e�;d"ej<�j?Z@e�;d#ej<�j?ZAe�;d$ej<�j?ZBe�;d%ej<�j=ZCd&d'�ZDd(d)�ZEeFdfd*d+�ZGd,ZHd-ZIe�;eHd	eIeId.fej<�d/fZJe�;eHd	eId0eId0d.fej<�ZKe�;eHd1ej<�d2fZLe�;eHd3ej<�d2fZMd4ZNe�;eHd	eNeNd.fej<�d2fZOeNd5d6ZPe�;eHd	ePePd.fej<�d2fZQd7ZRe�;eHd	eReRd.fej<�d8fZSd9ZTe�;eHd:eTeTd;fej<�d<fZUd=ZVe�;eHd	eVeVd.fej<�d>fZWe�;eHd?ej<�d@fZXe�;eHdAej<�dBfZYe�;eHdCej<�dDfZZe�;eHdEej<�dFfZ[e�;eHdGej<�dHfZ\e�;eHdIej<�dJfZ]e�;eHdKej<�dLfZ^e�;eHdMej<�dNfZ_e�;eHdOej<�dPfZ`e�;eHdQej<�dRfZae�;eHdSej<�dTfZbe�;eHdUej<�dVfZce�;eHdWej<�dXfZde�;eHdYej<�dZfZee�;eHd[ej<�d\fZfe�;eHd]ej<�d^fZge�;eHd_ej<�d`fZhe�;eHdaej<�dbfZie�;eHdcej<ejjB�ddfZke�;deejj�dffZldgdh�Zmdidj�Zne�;dkej<�Zo�ddldm�Zpdndo�Zq�d	dqdr�Zrdsdt�Zs�ddudv�Zte�;dwej<�Zue�;dxej<�Zve�;dyej<�Zwe�;dzej<�Zxe�;d{ej<�Zye�;d|�Zze�;d}�Z{e�;d~ej<�Z|dd��Z}d�d��Z~d�d��Zd�d��Z�d�d��Z�d�d��Z�e�;d�ej<�Z�e�;d�ej<�Z�e�;d�ej<�Z�e�;d�ej<�Z�e�;d�ej<�Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z��dd�d��Z��dd�d��Z��dd�d��Z��d
   7  d�d��Z�d�d��Z�d�d��Z��dd�d��Z��dd�d��Z��d
d�d��Z�d�d��Z�d�d��Z��dd�d��Z�d�d��Z��dd�d��Z�e�;d�ej<�Z�d�d��Z�e�;d�ej<�Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d„Z��dd�dĄZ�ifd�dƄZ�d�dȄZ�e�;dɡj=Z�d�d˄Z�d�d̈́Z�e�;d�ej<�Z�gfd�dЄZ�d�d҄Z�e�;d�ej<�Z�e�;d�ej<�Z�e�;d�ej<�Z�e�;d�ej<�Z�e�;d�ej<�Z�d�dلZ�ifd�dۄZ��dd�d߄Z��dd�d�Z��dd�d�Z�d�d�Z��dd�d�Z�ga�d�d�Z�d�d�Z�d�d�Z�gdfd�d�Z�d�d�Z�t���e��e�d�k�regZ�gZ�dZ�dZ�dZ�dZ�ej�dd�D]�Z�e�d	k�rG�q>e�dd�k�rRdZ��q>e�d�k�r]dada�q>e�d�k�rhd�ada�q>e�d�k�r{t�rue/d�d�dada�q>e�d�k�r�da�q>e�d�k�r�da�q>e�d�k�r�dada�q>e�d�k�r�dad�ada�q>e�d�k�r�dZq>e�d�k�r�dZĐq>eƐdk�r�dZÐq>e�d�dk�r�eǐde�eƃ��q>er�dZ�e�a�q>eÐr�dZ�e�a�q>e��rze�eƃ�ʡe���eơW�q>eːyZ�zeǐde̛dܝ�WYdZ�[̐q>dZ�[�wwe���eơ�q>t�s+t�r+t�s+e/�dd�e�e��Z�t�r\e/�de�t�d�e�e̓Z�e�t�d��
Z�e���eΡWd�n	1�sWwYeĐrgeFe̓dSdSdS(a*
   8  crackfortran --- read fortran (77,90) code and extract declaration information.
   9  
  10  Copyright 1999-2004 Pearu Peterson all rights reserved,
  11  Pearu Peterson <pearu@ioc.ee>
  12  Permission to use, modify, and distribute this software is given under the
  13  terms of the NumPy License.
  14  
  15  NO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.
  16  $Date: 2005/09/27 07:13:49 $
  17  Pearu Peterson
  18  
  19  
  20  Usage of crackfortran:
  21  ======================
  22  Command line keys: -quiet,-verbose,-fix,-f77,-f90,-show,-h <pyffilename>
  23                     -m <module name for f77 routines>,--ignore-contains
  24  Functions: crackfortran, crack2fortran
  25  The following Fortran statements/constructions are supported
  26  (or will be if needed):
  27     block data,byte,call,character,common,complex,contains,data,
  28     dimension,double complex,double precision,end,external,function,
  29     implicit,integer,intent,interface,intrinsic,
  30     logical,module,optional,parameter,private,public,
  31     program,real,(sequence?),subroutine,type,use,virtual,
  32     include,pythonmodule
  33  Note: 'virtual' is mapped to 'dimension'.
  34  Note: 'implicit integer (z) static (z)' is 'implicit static (z)' (this is minor bug).
  35  Note: code after 'contains' will be ignored until its scope ends.
  36  Note: 'common' statement is extended: dimensions are moved to variable definitions
  37  Note: f2py directive: <commentchar>f2py<line> is read as <line>
  38  Note: pythonmodule is introduced to represent Python module
  39  
  40  Usage:
  41    `postlist=crackfortran(files)`
  42    `postlist` contains declaration information read from the list of files `files`.
  43    `crack2fortran(postlist)` returns a fortran code to be saved to pyf-file
  44  
  45    `postlist` has the following structure:
  46   *** it is a list of dictionaries containing `blocks':
  47       B = {'block','body','vars','parent_block'[,'name','prefix','args','result',
  48            'implicit','externals','interfaced','common','sortvars',
  49            'commonvars','note']}
  50       B['block'] = 'interface' | 'function' | 'subroutine' | 'module' |
  51                    'program' | 'block data' | 'type' | 'pythonmodule' |
  52                    'abstract interface'
  53       B['body'] --- list containing `subblocks' with the same structure as `blocks'
  54       B['parent_block'] --- dictionary of a parent block:
  55                               C['body'][<index>]['parent_block'] is C
  56       B['vars'] --- dictionary of variable definitions
  57       B['sortvars'] --- dictionary of variable definitions sorted by dependence (independent first)
  58       B['name'] --- name of the block (not if B['block']=='interface')
  59       B['prefix'] --- prefix string (only if B['block']=='function')
  60       B['args'] --- list of argument names if B['block']== 'function' | 'subroutine'
  61       B['result'] --- name of the return value (only if B['block']=='function')
  62       B['implicit'] --- dictionary {'a':<variable definition>,'b':...} | None
  63       B['externals'] --- list of variables being external
  64       B['interfaced'] --- list of variables being external and defined
  65       B['common'] --- dictionary of common blocks (list of objects)
  66       B['commonvars'] --- list of variables used in common blocks (dimensions are moved to variable definitions)
  67       B['from'] --- string showing the 'parents' of the current block
  68       B['use'] --- dictionary of modules used in current block:
  69           {<modulename>:{['only':<0|1>],['map':{<local_name1>:<use_name1>,...}]}}
  70       B['note'] --- list of LaTeX comments on the block
  71       B['f2pyenhancements'] --- optional dictionary
  72            {'threadsafe':'','fortranname':<name>,
  73             'callstatement':<C-expr>|<multi-line block>,
  74             'callprotoargument':<C-expr-list>,
  75             'usercode':<multi-line block>|<list of multi-line blocks>,
  76             'pymethoddef:<multi-line block>'
  77             }
  78       B['entry'] --- dictionary {entryname:argslist,..}
  79       B['varnames'] --- list of variable names given in the order of reading the
  80                         Fortran code, useful for derived types.
  81       B['saved_interface'] --- a string of scanned routine signature, defines explicit interface
  82   *** Variable definition is a dictionary
  83       D = B['vars'][<variable name>] =
  84       {'typespec'[,'attrspec','kindselector','charselector','=','typename']}
  85       D['typespec'] = 'byte' | 'character' | 'complex' | 'double complex' |
  86                       'double precision' | 'integer' | 'logical' | 'real' | 'type'
  87       D['attrspec'] --- list of attributes (e.g. 'dimension(<arrayspec>)',
  88                         'external','intent(in|out|inout|hide|c|callback|cache|aligned4|aligned8|aligned16)',
  89                         'optional','required', etc)
  90       K = D['kindselector'] = {['*','kind']} (only if D['typespec'] =
  91                           'complex' | 'integer' | 'logical' | 'real' )
  92       C = D['charselector'] = {['*','len','kind','f2py_len']}
  93                               (only if D['typespec']=='character')
  94       D['='] --- initialization expression string
  95       D['typename'] --- name of the type if D['typespec']=='type'
  96       D['dimension'] --- list of dimension bounds
  97       D['intent'] --- list of intent specifications
  98       D['depend'] --- list of variable names on which current variable depends on
  99       D['check'] --- list of C-expressions; if C-expr returns zero, exception is raised
 100       D['note'] --- list of LaTeX comments on the variable
 101   *** Meaning of kind/char selectors (few examples):
 102       D['typespec>']*K['*']
 103       D['typespec'](kind=K['kind'])
 104       character*C['*']
 105       character(len=C['len'],kind=C['kind'], f2py_len=C['f2py_len'])
 106       (see also fortran type declaration statement formats below)
 107  
 108  Fortran 90 type declaration statement format (F77 is subset of F90)
 109  ====================================================================
 110  (Main source: IBM XL Fortran 5.1 Language Reference Manual)
 111  type declaration = <typespec> [[<attrspec>]::] <entitydecl>
 112  <typespec> = byte                          |
 113               character[<charselector>]     |
 114               complex[<kindselector>]       |
 115               double complex                |
 116               double precision              |
 117               integer[<kindselector>]       |
 118               logical[<kindselector>]       |
 119               real[<kindselector>]          |
 120               type(<typename>)
 121  <charselector> = * <charlen>               |
 122               ([len=]<len>[,[kind=]<kind>]) |
 123               (kind=<kind>[,len=<len>])
 124  <kindselector> = * <intlen>                |
 125               ([kind=]<kind>)
 126  <attrspec> = comma separated list of attributes.
 127               Only the following attributes are used in
 128               building up the interface:
 129                  external
 130                  (parameter --- affects '=' key)
 131                  optional
 132                  intent
 133               Other attributes are ignored.
 134  <intentspec> = in | out | inout
 135  <arrayspec> = comma separated list of dimension bounds.
 136  <entitydecl> = <name> [[*<charlen>][(<arrayspec>)] | [(<arrayspec>)]*<charlen>]
 137                        [/<init_expr>/ | =<init_expr>] [,<entitydecl>]
 138  
 139  In addition, the following attributes are used: check,depend,note
 140  
 141  TODO:
 142      * Apply 'parameter' attribute (e.g. 'integer parameter :: i=2' 'real x(i)'
 143                                     -> 'real x(2)')
 144      The above may be solved by creating appropriate preprocessor program, for example.
 145  
 146  �N�)�__version__)�*)�symbolic�fix�    ������cCspdadadadadadadadadada	ga
 147  datgiada
dadagaiadadadagagagagadadS)Nrrrrrr	)�	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$��C:\Users\Jacks.GUTTSPC\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\numpy\f2py\crackfortran.py�reset_global_f2py_vars�s4	r&cCs0tsdSts|rtj�t�tj�|�dSdS�N)r
r�sys�stdout�writer)�line�flagr$r$r%�outmess�s�r-�2zabcdefghopqrstuvwxyz$_�typespec�realZijklmn�integer)3�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�flenZfshape�string�complex_doubleZfloat_double�stdin�stderrr)�type�defaultZ_bncC�(|tvrtd|t|f�t|S|S)Nz&rmbadname1: Replacing "%s" with "%s".
 148  )�badnames�errmess��namer$r$r%�
 149  rmbadname1�
 150  �rgcC�dd�|D�S)NcS�g|]}t|��qSr$)rg��.0�_mr$r$r%�
 151  <listcomp>�zrmbadname.<locals>.<listcomp>r$��namesr$r$r%�	rmbadname�rrcCrb)Nz+undo_rmbadname1: Replacing "%s" with "%s".
 152  )�invbadnamesrdrer$r$r%�undo_rmbadname1rhrucCri)NcSrjr$)rurkr$r$r%rn!roz"undo_rmbadname.<locals>.<listcomp>r$rpr$r$r%�undo_rmbadname rsrvcCsN|�d�}|dkrdSd||d�vrdSd||d�vrdS||dd�S)N�.r	r�\�/r)�rfind)rf�ir$r$r%�getextension$s
 153  r|z.*\.(for|ftn|f77|f)\Zz-\*-\s*fortran\s*-\*-z-\*-\s*f90\s*-\*-z-\*-\s*fix\s*-\*-z[^c*]\s*[^\s\d\t]cCs�tdur
t�|���j}nFtdtj�|��}t|d��0}|�	|�}|�
 154  tj�r*d}n|�
 155  tj
tjf�r6d}n|�
 156  tjtjf�rBd}nd}Wd�n1sNwYt|||d�S)	aNEnsures that filename is opened with correct encoding parameter.
 157  
 158      This function uses charset_normalizer package, when available, for
 159      determining the encoding of the file to be opened. When charset_normalizer
 160      is not available, the function detects only UTF encodings, otherwise, ASCII
 161      encoding is used as fallback.
 162      N� �rbz	UTF-8-SIGzUTF-32zUTF-16�ascii)�encoding)�charset_normalizer�	from_path�bestr�rZ�os�path�getsize�open�read�
 163  startswith�codecs�BOM_UTF8�BOM_UTF32_LE�BOM_UTF32_BE�BOM_LE�BOM_BE)�filename�moder��nbytesZfhandle�rawr$r$r%�openhook5s
 164  ��r�cCsd}t|d��u}|��}d}t|�rd}nt|�rd}d}|dkr\|rd|ddkrJ|��rJ|d8}|ddkr?t|dd��sG|d	d
 165  �dkrJd}n*|��}|dkrl|s#Wd�|SWd�|SWd�|SWd�|SWd�|S1swY|S)z(Check if file is in free format Fortran.r�r�r�!�	N������r	�&)r��readline�
_has_f_header�_has_f90_header�strip�_free_f90_start)�file�result�fr+�nr$r$r%�is_free_formatTsB,�
 166  ��
 167  ��
 168  ��
 169  ��
 170  ��r�cCsr|s
tttttttttf	}|gkrdSt}d}d}d}t	�
 171  dt	j�}t	�
 172  d�}	t	�
 173  d�}
 174  t	�
 175  d�}|r8|dd�d	\}}d
 176  gdd�td
�D�}
dat
j|td�}	z|��}Wntyv}ztd|���d|���d|�d���d}~ww|s{�n.|��r�da|��ada|}dadatj�t�d}tt�r�t|�s�t|�s�dan
 177  tt�r�t|�s�datr�tantatdt t�ttr�dp�df�|�!��"dd
 178  �}|dks�|ddvr�n
 179  |dd�}|dkr�t�s	t#|d�\}}|d
 180  7}|dd��$�dk�r	t#|d|dd�d�\}}|�%�dk�rtdk�rnd}qQtdk�r�|dd v�r<|dd��$�d!k�r9d"|dd�}nd}qQt�rLt&|�d#k�rL|dd#�}|d|
v�r[td$t |���|�rat�r|t&|�dk�r||dd
 181  k�s|||d%d�}d}d}n�t�s�|	�'|�}|�r�|�(d&�}|�r�||
 182  �'|��(d&�}d}d}nd"|dd�}|�r�|�$�}n|}|}|}|du}n�d"|dd�}|�r�|�$�}n|}|}|}notdk�r7|�s|d'k�r|�'|��r|d(}	|��}|�s�t)d)�n
||}|�'|��r�n�q�|�*�}|	�'|�}|�r|�(d&�}|�r$||
 183  �'|��(d&�}d}d}n|�r,|�$�}n|}|}|}|du}nt+d*t t���d+|�,�dt|fa|�'|�}|�r�|�(d,�}tj�-|��rft.||dd-�n@tj�/t�gt0}d}|D]}tj�1||�}tj�-|��r�d}t.||dd-�n�qs|�s�td.t |�tj2�1|�f�n||�|}qR|�r�|�$�}n|}|}d+|�,�dt|fa|�'|�}|�r|�(d,�}tj�-|��r�t.||dd-�n@tj�/t�gt0}d}|D]}tj�1||�}tj�-|��rd}t.||dd-�n�q�|�std.t |�tj2�1|�f�n||�da|�3�|�r,|dd�dS|\	aaaaaaaaadS)/z�
 184      Read fortran codes from files and
 185       1) Get rid of comments, line continuations, and empty lines; lower cases.
 186       2) Call dowithline(line) on every line.
 187       3) Recursively call itself when statement "include '<filename>'" is met.
 188      NFrz*\s*include\s*(\'|")(?P<name>[^\'"]*)(\'|")z(?P<line>.*)&\s*\Zz(\s*&|)(?P<line>.*)z.*?'''r	)rr� cSrjr$)�strrkr$r$r%rn�roz#readfortrancode.<locals>.<listcomp>�
 189  )r�Tzreadfortrancode: reading �#z
 failed with
 190  zu.
 191  It is likely that installing charset_normalizer package will help f2py determine the input file encoding correctly.rrr�freez	Reading file %s (format:%s%s)
 192  z,strict� z
 193  
r�r�z!f2pyr)r�cr��Cr��f2pyz     �Hzxreadfortrancode: Found non-(space,digit) char in the first column.
 194  	Are you sure that this code is in fix form?
 195  	line=%s�r+�.pyf�
 196  z.Unexpected end of file when reading multiline
 197  z6Flag sourcecodeform must be either 'fix' or 'free': %szLine #%d in %s:"%s"
 198  	rf)�
 199  dowithline�istopzAreadfortrancode: could not find include file %s in %s. Ignoring.
 200  )4rrrrr
 201  �beginpatternrr
r�re�compile�I�range�	fileinput�	FileInputr�r��UnicodeDecodeError�	Exceptionr��lineno�isfirstliner�r��splitext�	is_f_filer��_has_fix_headerr��beginpattern77�beginpattern90r-�repr�
 202  expandtabs�replace�split_by_unquoted�lowerr�rR�match�grouprd�rstrip�
 203  ValueError�
 204  filelineno�isfile�readfortrancode�dirnamer"�join�pathsep�close)Zffiler�r�ZsaveglobalsZlocaldolowercase�contZ	finalline�llZincludelineZcont1Zcont2Z
 205  mline_mark�l1Zspacedigits�fin�l�msg�ext�rl�_Z
origfinalliner��lc�m�fn�include_dirsZ	foundfile�inc_dir�fn1r$r$r%r�ls�
 206  
 207  ��
 208  
 209  
 210  
 211  ������
 212  ���
 213  
 214  �(
 215  
 216  
 217  
 218  
 219  
 220  ��	
 221  
 222  
 223  
 224  
 225  ��
 226  
 227  
 228  �������#
 229  �
 230  
 231  ����r�zN\s*(?P<before>%s(?=\s*(\b(%s)\b)))\s*(?P<this>(\b(%s)\b))\s*(?P<after>%s)\s*\Zzqcharacter|logical|integer|real|complex|double\s*(precision\s*(complex|)|complex)|type(?=\s*\([\w\s,=(*)]*\))|byte�.*r`z|static|automatic|undefined)z([a-z]+[\w\s(=*+-/)]*?|)�functionr�r��begin)z	[a-z\s]*?�
 232  subroutiner�r�zprogram|block\s*dataz@|module(?!\s*procedure)|python\s*module|(abstract|)\s*interface|z
type(?!\s*\()z\end|endprogram|endblockdata|endmodule|endpythonmodule|endinterface|endsubroutine|endfunction�endzJend\s*(if|do|where|select|while|forall|associate|block|critical|enum|team)z[\w]*?z[\w\s]*�endifzmodule\s*procedure�moduleprocedure)r�implicitr�r�r�)r�dimension|virtualr�r��	dimension)r�externalr�r�r�)r�optionalr�r�r�)r�requiredr�r�r�)r�publicr�r�r�)r�privater�r�r�)r�	intrinsicr�r�r�)r�intent|depend|note|checkr�z\s*\(.*?\).*�intent)r�	parameterr�z\s*\(.*r�)r�datar�r�r�)r�callr�r�r�)r�entryr�r�r�)r�callfunr�r�r�)r�commonr�r�r�)r�user�r�r�)r�containsr�rr�)r�formatr�r�r�)r�Kthreadsafe|fortranname|callstatement|callprotoargument|usercode|pymethoddefr�r��f2pyenhancementsz2\s*(?P<before>''')(?P<this>.*?)(?P<after>''')\s*\Z�	multilinec	Csvtd�t|�@rJd��t�djd�t�|��d�t�|��ddd��}|�|�}|r7|��}|d	|d
 233  fS|dfS)z�
 234      Splits the line into (line[:i], line[i:]),
 235      where i is the index of first occurrence of one of the characters
 236      not within quotes, or len(line) if no such index exists
 237      z"'zcannot split by unquoted quoteszR\A(?P<before>({single_quoted}|{double_quoted}|{not_quoted})*)(?P<after>{char}.*)\Zz[^"'{}]z[{}]z('([^'\\]|(\\.))*')z("([^"\\]|(\\.))*"))Z
 238  not_quotedr5�
single_quoted�
double_quoted�before�afterr)�setr�r�r��escaper��	groupdict)r+�
 239  charactersr�r��dr$r$r%r��s��
 240  r�cCsBg}t|��d�D]}dD]}|�|d�}q
|�|�q	d�|�S)N�@,@z(),r��,)�markoutercomma�splitr��appendr�)Zargsline�ar�r�r$r$r%�
_simplifyargs�s
 241  rz"\s*(?P<result>\b[a-z]+\w*\b)\s*=.*cCs�t|d�\}}|rCtd�|�sCtd�|�sC|dks!Jt|���t|d�\}}|r<t||�t|dd�d�\}}|s*t||�dS|dkrsdatdiatiiatgia	gttd<ittd<dttd<dttd	<d
 242  a
 243  d
 244  adS|dkr�d}tr�t
 245  tkr�d}t|kr�t
dtt�tt�f�t
d
�t	td�tt�t	tt	tdd
 246  d<t	t=tdat|ks�tr�t
 247  tkr�t	td�tt�t	tt	tdd
 248  d<t	t=tdat	td�tt�t	tt	tdd
 249  d<t	t=tdad
 250  a
 251  dS|dk�rdSd}tttttttttttttttttt t!t"t#t$t%ttt&fD]}|d�|�}|�r0n|d}�q"|�s�t'}	dtk�rHtk�rIdSdttv�r�ttdD]n}
 252  |
 253  t(v�rat(|
 254  }
 255  dttv�rs|
 256  ttdv�rs�qVt)�d|
 257  t*|�t)j+�}|�r�|	�|�,d��}t-|�,d��}
|�r�d|
 258  |
|�,d�f}nd|
 259  |
f}t.d�|�}|�s�t
dt|��dSt/|d|�dS�qVt0dk�s�t0dk�r�t1�2��3d��r�da4t
dt�dS|ddk�r`dtk�r�tk�rnntdattk�rdStdk�rt5dt��td�|�}|�r2|�,d�ttk�s2t5dt|�,d��ttt�t6f��ttk�r9d
 260  at	td�tt�t	tt	tdd
 261  d<t	t=tdat7�s^da8dSdS|ddk�r�dtk�rstk�r{nntdadSda9t/||d|�da8dS|ddk�r�dS|dd k�r�t/||d|�dS|dd!k�r�t:�r�dSdtk�r�tk�r�dStadStadSdtk�r�tk�r�dSt/||d|�dS)"z�
 262      reset=-1  --- initialize
 263      reset=0   --- crack the line
 264      reset=1   --- final check if mismatch of blocks occurred
 265  
 266      Cracked data is saved in grouplist[0].
 267      �;rrNr�body�vars�blockrfr	�z(crackline: groupcounter=%s groupname=%s
 268  zYcrackline: Mismatch of blocks encountered. Trying to fix it by assuming "end" statement.
 269  �	externals�
 270  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.
 271  r�r�z"crackline:%d: No pattern for line
 272  r�z>crackline: groupcounter(=%s) is nonpositive. Check the blocks.�thiszGcrackline: End group %s does not match with previous Begin group %s
 273  	%sr�r�r�r�);r��f2pyenhancementspatternr��multilinepatternr��	crackliner�	groupname�
 274  groupcacherrrrr-r�dimensionpattern�externalpattern�
intentpattern�optionalpattern�requiredpattern�parameterpattern�datapattern�
publicpattern�privatepattern�intrinsicpattern�endifpattern�
 275  endpattern�
formatpatternr��functionpattern�subroutinepattern�implicitpattern�typespattern�
commonpattern�callpattern�
 276  usepattern�containspattern�entrypattern�moduleprocedurepattern�crackline_re_1rtr��markouterparenr�r�r�callfunpattern�analyzeliner
rr��endswithr#r�rrrrr)r+�resetr�Z
has_semicolonZsemicolon_line�flr,�patr��re_1rf�m1�m2rr$r$r%r�s4�
 277  �
 278  ���	
 279  ��
 280   ��
 281  ��$
 282  
 283  ���
 284  ���rcCsdd}d}|D])}|dkr|d}|dkr|d}qn|dkr+|d}|dkr+|d}q||}q|S)Nrr�(r�@(@�)�@)@r$)r+r�r�r�r$r$r%r8_s �
 285  r8rcCs�d}d}t||d�\}}||7}|rT|d|kr&|dkr&|d|d7}n||d7}|ddkr7|d7}n
 286  |ddkrA|d8}t|dd�|d�\}}||7}|s|r_Jt|||f���|S)Nrrz()�@rBrrD)r�r�)r+�commar�r�rrr$r$r%r
qs"
 287  �r
cCs|�dd��dd�}|S)NrCrBrErD)r�)r+r�r$r$r%�unmarkouterparen�srHcCs�|si}|s|S||ur|St|���D]g}|dkr'|s ||vr&||||<q|dkr9||D]}t|||�}q/q|dkrFt||||�}q|dkrSt||||�}q|dvrd|s]||vrc||||<q|dkriq|dvrttd|�qtd	t|���|S)
 288  Nr/�attrspec�kindselector�charselector)�=�typename�note)r��checkr�r�r��dependz"appenddecl: "%s" not implemented.
 289  z-appenddecl: Unknown variable definition key: )�list�keys�setattrspec�setkindselector�setcharselectorrdr�r�)�declZdecl2�force�kr�r$r$r%�
 290  appenddecl�s>����rYzD\s*(?P<this>(@\(@.*?@\)@|\*[\d*]+|\*\s*@\(@.*?@\)@|))(?P<after>.*)\Zz[(?:,(?P<attributes>[\w(),]+))?(::)?(?P<name>\b[a-z$_][\w$]*\b)(?:\((?P<params>[\w,]*)\))?\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*\ZzF\s*(?P<scheme>(operator|assignment))@\(@\s*(?P<name>[^)]+)\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&|�dg�D]
 291  }t�|�rdSqdS)NrIrr)�get�_intentcallbackpatternr�)Zvdeclrr$r$r%�_is_intent_callback�s
 292  
 293  �r\cCsld�|���}t�|�}t||�|r1|�d�}|r$dd�|�d�D�ng}|�d�||�d�fSdgdfS)Nr�
 294  attributescS�g|]}|���qSr$)r�)rlrr$r$r%rn�roz*_resolvetypedefpattern.<locals>.<listcomp>rrf�params)r�r�typedefpatternr��printr�)r+r@�attrsr$r$r%�_resolvetypedefpattern�s
 295  
 296  
 297  
 298  rccCs�t|�}t�|�}|r|�d�|�d�|�d�|�d�fSt�|�}|r8|�d�d|�d�d}|gddfSt�|�}|rK|�d�|�d�ddfSdgddfS)Nrfrr��bind�schemerBrD)r8�nameargspatternr�r��operatorpattern�callnameargspattern)r+r@rfr$r$r%�_resolvenameargspattern�s
 299  $
 300  
 301  ric>Cs�|�d�}|dkrdatrZ|dvrZtsZtdkrZtj�t��	d�d}t
 302  d|�datdadtt<it
t<gtt<gt
td	<it
td
 303  <dt
td<|t
td<d
t
td<da|dv�r�|��}t�d|tj�rnd}nt�d|tj�ryd}n
 304  t�d|tj�r�d}|dkr�t|�d��\}}}t|d�t
td
 305  |<g}d}	nt|�d��\}}}	}|dur�|dkr�d}nd}|dvr�t
 306  d�||tfa|r�tdd�t|��	d�D��}ng}d|vr�d|vr�|�d�d|vs�t
 307  d �d}
 308  d}|d!v�r1d}d"t
tv�rdS|t
td"v�r
dSttD]
}|d|k�rdS�q|t
td#v�r*dSd$d%d!�|}t�rKtd&k�rKtdk�rKtd'ad}
 309  |d(v�rKd}tdait
t<gtt<|
 310  �r�tdk�rht
 311  d)tt�d�d*tt<dt
td<tt
td<dt
td<gt
td	<gt
td+<gt
td#<it
td
 312  <tdait
t<gtt<|�r�tdk�r�t
 313  d,td�d-tt<d-t
td<d.t
td<d/t
tddt
tddft
td<gt
td	<gt
td+<gt
td#<it
td
 314  <tdait
t<gtt<|tt<|t
td<|�sd0|�d1d2�}|�d3�t
td4<t|�t
td<|	t
td5<tdk�r3tt
td<n/t�rLtd6k�rLd/t
tddtft
td<nd/t
tddt
tddft
td<tt
t� ��D]}
t
t|
�sxt
t|
=�qj|t
td"<gt
td	<gt
td+<gt
td#<it
td
 315  <it
td7<|dk�r�gt
td8<|d!v�r�|t
td'd+v�r�t
td'd+�!|�t"�#t
td'd
 316  �t
td
 317  <zt
td
 318  |t
td
 319  |d9�$d:�=Wn
 320  t%�y�Ynw|d;v�rdzt&t
td
 321  |t
td'd
 322  d�t
td
 323  |<Wn
 324  t%�yYnw|d<k�rL|	�rL|	t
td
 325  v�rL||	k�sLt&t
td
 326  |t
td
 327  |	�t
td
 328  |<z
t
td'd#�!|�Wn
 329  t%�ycYnw|d%k�r�t'd�|�d3�d1|�}|�r�t(|�d�|�d��\}}}}t)||||�|d!v�r�ttd�!t
t�ttttdd&d	<tt=tdattd�!t
t�ttttdd&d	<tt=tdadSdS|d7k�rt|�d��\}}}	}|du�r|�r�td=d�t|��	d�D��}ng}|	du�s	Jt|	���|t
td7|<d7|tfadSdS|dk�r@t(||�d��\}}}}t)||||�}|du�r>d>|tfadSdS|d?v�rt
td
 330  }|�d��*�}|�+d@�}|dk�r�|dAk�r�t,|��+dB�d'}|d|d�d@||dd�}|�+d@�}||d�d@k�r�d"t
tv�r�t
 331  dC|�d�|d|�f�|dD�-t
td"�}|dk�r�d}d}n|d|��*�}||d'd�}t|��	d�}t.|�dk�r�|d}t
 332  dEdD�-|dd���d}dFd�t|��	d�D�D�]}t/�|�}|�s|dGv�rd}
nt0|�1��t
 333  dH|t|�f��q�t|�d��}
|dGv�r4|
dIk�s-|
dJk�r4|
|�d�7}
|
|v�r=i||
<|dKk�rI||�d�}|dAk�r�|�d�|}t2�|��r�|
t
td"v�r�tdk�r�dLt
td'dv�rxt
 334  dM�|
t
tdk�r�t
 335  dN|
t
tdf�t
td"�!|
�n
t3dO|
�nt3dP|
�|dQv�r�|}d9||
v�r�||
d9�!|�n|g||
d9<|d:k�r�t
tddk�r�t
 336  dR��q�|
t
td"v�r�q�d+t
tv�r�gt
td+<t
td+�!|
�|
}�q�|t
td
 337  <|du�rd>|tfadSdS|dSk�r(dTd�|�d��	dD�D�t
tdU<dS|dVk�rNt
td
 338  }|�d��*�dd&�}d}t|��	d�D]�}zdWd�|�	dX�D�\}
}Wnt%�yjt
 339  dY||f�Y�qGwt4|�}t|
�}
|
|v�r|i||
<dX||
v�r�||
dX|k�s�t
 340  dZ|
||
dX|f�t5||�}|�r�|�6d[�d\k�r�t|�}t7�8|�D]}t||�9�|�:�����d]d^��||�9�|�:��<�q�d�-|�}n|�6d[�d_k�r�|dd����d]d^��dDd`�}zt;|i|�}Wnt<t=t>f�y} zt3da|| f�WYd} ~ �qGd} ~ wwt|�||
dX<d9||
v�r/||
d9�!dV�ndVg||
d9<|
}�qG|t
td
 341  <|du�rLd>|tfadSdS|dbk�rh|�d��*���dck�rgdt
tdb<dS|�d��rfdbt
tv�r{t
tdb}!ni}!|!du�r�t
 342  dd�i}!t|�d���	d�D]�}i}"t�de|tj�}|�s�t
 343  df|��q�t?�|�d��}#|#�s�t
 344  dg|��q�t(|#�d�|#�d��\}}}}t@||�\}$}%}&||"d[<|$|"dh<|%|"di<|&|"dj<t|"� ��D]}
|"|
�s�|"|
=�q�t|�d���	d�D]\}'dk|'v�r&zdld�|'�	dk�D�\}(})Wnt%�y%t
 345  dm|'�Y�q�w|'�*�}(})t.|(�t.|)�k�r<dk�sEnt
 346  dn|'��q�tAtB|(�tB|)�d�D]	}*|"|!tC|*�<�qP�q��q�|!t
tdb<dSdS|dok�
 347  rg}d}+d},d}-d}.d}/|�d�D]i}0|/�s�|0dpk�r�|.}.|0dqk�r�|.�r�|-d}-�q~|0drk�r�|/d}/n	|0dsk�r�|/d}/|-dk�r�|+|0}+�q~|-dk�r�|,|0},�q~|-d'k�r�|+�*�}+|+�DdD��r�|+dd��*�}+|�!|+|,g�|0}+d},d}-�q~|-d'k�	r|+�*�}+|+�DdD��r�|+dd��*�}+|�!|+|,g�i}1d
 348  t
tv�	rt
td
 349  }1d}|D]�}2dtd�|2D�}2|2dddDk�	r5|2ddd�|2d<|2dddrk�	rHt
 350  du|2d��	qd}d}3t.|2d�}4tdvd�t|2d��	d�D��D]�}|ddrk�	rst
 351  du|��	qbd}.||4k�	r�|.�	s�|2d|dDk�	s�|2d|dpk�	r�|.}.|d}||4k�	r�|.�	s�|2d|dDk�	r�|d}||1v�	r�i|1|<dX|1|v�	r�|1|dX|2d|3|d�k�	s�t
 352  dw||1|dX|2d|3|d�f�|2d|3|d�|1|dX<|}3|}�	qb�	q|1t
td
 353  <|du�
 354  r	d>|tfadSdS|dxk�
 355  r�|�d��*�}|ddqk�
 356  s"dy|}g}5d}-d}6d}7|D]:}0|0dqk�
 357  r9|-d}-�
 358  q,|-d6k�
 359  rV|6�*�}6|6�
 360  sGdz}6|5�!|6|7g�|-d'}-d}6d}7|-d'�
 361  ra|6|0}6�
 362  q,|7|0}7�
 363  q,|6�*�}6|6�
 364  spdz}6|5�!|6|7g�i}8dxt
tv�
 365  r�t
tdx}8|5D].}0|0d|8v�
 366  r�g|8|0d<d{d�t|0d��	d�D�D]}|�
 367  r�|8|0d�!|��
 368  q��
 369  q�|8t
tdx<dx|6tfadS|d|k�rvt�d}|�d�tj�}|�rj|�1�}9d|t
tv�
 370  r�it
td|<|�d�}it
td||<d}:d~|9v�rg|9d~du�rgd|9v�r|9ddu�rd}:|:t
td||d�<d�d�|9d~�	dD�D�}i};|D]9}2dX|2v�rUt�d�|2tj�}#|#�rL|#�d|��*�|;|#�d���*�<n
t
 371  d�t|2��n|2|;|2<|;t
td||d�<�q+dS	dSt0|�1��t
 372  d��dS|d�v�r�d�t
tv�r�it
td�<t
td�}<|�d�d�k�r�d�|<v�r�tE|<d�tF��r�|<d�g|<d�<|<d��!|�d��dS|�d�|<|�d�<dS|dk�r�tdu�r�t�r�t
 373  d��dSt}=tGt
|=tdd'�|�d��dStdk�r�t0|�1��t
 374  d��dSdS)�Nrr)r�r�r�r`rrwrzBanalyzeline: no group yet. Creating program group with name "%s".
 375  �programrrrrfZfromsky�from)r�r�r�zblock\s*data�
 376  block datazpython\s*module�
python modulezabstract\s*interface�abstract interfacer`r)rI�_BLOCK_DATA_r)�	interfacerlrnz2analyzeline: No name/args pattern found for line.
 377  cSr^r$�r��rl�xr$r$r%rn��zanalyzeline.<locals>.<listcomp>rz<analyzeline: argument list is malformed (missing argument).
 378  )r�r�rrr�r�r	r�rprnz&analyzeline: Creating module block %s
 379  �modulerzDanalyzeline: Creating additional interface block (groupcounter=%s).
 380  rp�unknown_interfacez%s:%sZunknown_r�r�r�prefixr��r��varnamesrIr��r�r�r�cSr^r$rqrrr$r$r%rn�rt�variable)r�r�r�r�r�r�r�r��::r�rEz'All arguments will have attribute %s%s
 381  rzXanalyzeline: cannot handle multiple attributes without type specification. Ignoring %r.
 382  cSr^r$rqrrr$r$r%rn�ro�r�r�zEanalyzeline: no name pattern found in %s statement for %s. Skipping.
 383  �operator�
 384  assignmentr��__user__z8analyzeline: missing __user__ module (could be nothing)
 385  z;analyzeline: appending intent(callback) %s to %s arguments
 386  z,analyzeline: intent(callback) %s is ignored
 387  z=analyzeline: intent(callback) %s is already in argument list
 388  )r�r�r�r�r�r�z(analyzeline: ignoring program arguments
 389  r�cSr^r$rqrrr$r$r%rn�ro�
implementedbyr�cSr^r$rqrrr$r$r%rnrorLzManalyzeline: could not extract name,expr in parameter statement "%s" of "%s"
 390  zGanalyzeline: Overwriting the value of parameter "%s" ("%s") with "%s".
 391  r/r0r
 392  �e�complexz+1j*(z1analyzeline: Failed to evaluate %r. Ignoring: %s
 393  r��nonez<analyzeline: Overwriting earlier "implicit none" statement.
 394  z9\s*(?P<this>.*?)\s*(\(\s*(?P<after>[a-z-, ]+)\s*\)\s*|)\ZzDanalyzeline: could not extract info of implicit statement part "%s"
 395  zManalyzeline: could not extract types pattern of implicit statement part "%s"
 396  rJrKrM�-cSr^r$rqrrr$r$r%rnSrozZanalyzeline: expected "<char>-<char>" instead of "%s" in range list of implicit statement
 397  z^analyzeline: expected "<char>-<char>" instead of "%s" in range list of implicit statement (2)
 398  r��'ryrBrDcSr^r$rqrrr$r$r%rn�roz>analyzeline: implied-DO list "%s" is not supported. Skipping.
 399  cSr^r$rqrrr$r$r%rn�roz=analyzeline: changing init expression of "%s" ("%s") to "%s"
 400  r�z//�_BLNK_cSr^r$rqrrr$r$r%rn�ror�zR\A\s*(?P<name>\b\w+\b)\s*((,(\s*\bonly\b\s*:|(?P<notonly>))\s*(?P<list>.*))|)\s*\ZrQZnotonly�onlycSr^r$rqrrr$r$r%rn�roz7\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
 401  �mapz0analyzeline: Could not crack the use statement.
 402  )rr�usercodez-analyzeline: No context for multiline block.
 403  z+analyzeline: No code implemented for line.
 404  )Hr�r#rrrr�r��basenamerrr-rrrrr�r�r�r�rc�dictrirrr
�removerrr
r�r�rgrQrRr�copy�deepcopyrUr�rYr0�cracktypespec0�
 405  updatevarsr��findr8r�rR�namepatternrarr[rd�get_parameters�determineexprtyperZ�
real16pattern�finditer�startr��eval�SyntaxError�	NameError�	TypeError�typespattern4implicit�
cracktypespecr��ord�chrr��
 406  isinstancer��appendmultiline)>r�r9r+r�newnamerfrbr�rr�Z
 407  needmoduleZ
needinterface�itrX�tr/�selector�attr�edeclrd�	last_namer�r{�pl�chr�r@�apZinitexprr_�tt�vr��implrVrA�
 408  kindselect�
 409  charselectrMr�ZbegcZendc�o�dl�ilr��fc�inpr�rr��jZllen�cl�bn�olZ	commonkey�mmZisonlyr�r
 410  �gcr$r$r%r:�s�
 411  ��
 412  
 413  
 414  �
 415  ��
 416  �
 417  
 418  ��
 419  ���
 420  ��
 421  �
 422  
 423  ���
 424   ��
 425  
 426  ��
 427  �
 428  �
 429  
 430  
 431  
 432  ��
 433  	
 434  �
 435  �
 436  
 437  $
 438   �
 439  �
 440  
 441  �
 442  
 443  
 444  
 445  
 446  �����
 447  
 448  
 449  �
 450  �
 451  
 452  ��
 453   �
 454  �����
 455  �
 456  
 457  �����
 458  �
 459  �
 460  ��"����
 461  2
 462  
 463  
 464  
 465  
 466  
 467  
 468  �
 469  
 470  �$�""�
 471  0��
 472  �
 473  
 474  
 475  
 476   ��
 477  �
 478  
 479  ���
 480  ��
 481  
 482  
 483  
 484  �
 485  �r:cCs:d|vri|d<|d}||vrg||<||�|�dS)N�f2pymultilines�r)r�Zcontext_name�mlr
 486  r$r$r%r�sr�cCs�d}d}t�d|tj�rd}nt�d|tj�rd}n|����}t�t|��}|s/td�dS|��}t	|�
 487  ��D]
 488  }t||�||<q9|dvrP|d}|d}|�d	�}|d
 489  kri|d|���}||dd�}||||fS)Nzdouble\s*complex�double complexzdouble\s*precisionzdouble precisionz>cracktypespec0: no kind/char_selector pattern found for line.
 490  )r�r1�logicalr0�	characterr`rrr}rr)
r�r�r�r�r��
selectpatternr8r-rrQrRrHr�)r/r�r�r�r@r
 491  rXr{r$r$r%r�s0�
 492  r�z)\s*(?P<name>\b\w+\b)\s*(?P<after>.*)\s*\ZzB\s*(\(\s*(kind\s*=)?\s*(?P<kind>.*)\s*\)|\*\s*(?P<kind2>.*?))\s*\Zz2\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>.*)|(f2py_len\s*=\s*(?P<f2py_len>.*))|))\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�|��}t|�dkr|S|d}tdt|�d�D]}||dkr2||ddvs1||ddvr2q|||}q||d}|S)Nrrr�z()[]{}=+-/* r	)r�rRr�)�expr�expr2r{r$r$r%�removespaces?sr�cCs~d}d}d}d}|D]2}|dkr|dvr||7}|}q
 493  |s#|dvr#|}||kr+|}n|dkr6|r6|d7}q
 494  ||7}|}q
 495  |S)	a(
 496      The function replace all spaces in the input variable line which are 
 497      surrounded with quotation marks, with the triplet "@_@".
 498  
 499      For instance, for the input "a 'b c'" the function returns "a 'b@_@c'"
 500  
 501      Parameters
 502      ----------
 503      line : str
 504  
 505      Returns
 506      -------
 507      str
 508  
 509      rFNrx)rxr��")r�r�r��@_@r$)r+�fragment�insideZ
current_quote�escapedr�r$r$r%�markinnerspacesNs&r�c	Cs�d}t||�\}}}|rFdd�t|��d�D�}g}t�d�}	|D]"}
 510  |
 511  s&q!|	�|
 512  �}|r>|�d���}||
 513  t|�d�}
 514  |�	|
 515  �q!|}dd�t|��d�D�}
g}|
D]"}dd�tt
 516  t|��dd	��d
 517  �D�D]
}|rw|�	|�dd��qjqV|D�]�}t
�|�}|s�tdt|��q{t|�d
��}i}|ttdv�r�ttd|��}d|v}|r�||d<n|r�||dks�td||d|f�d|vr�t�|�|d<n:|�rt|���D]0}||dv�r|||d|k�std|||d|||f�q�t�||�|d|<q�d|v�r'|�r'|�r||d<nEtd||f�n<|�rct|���D]2}||dv�rV|||d|k�sVtd|||d|||f��q0t�||�|d|<�q0d|v�rm||d<n|�r�|d|k�s�td||d|f�d|v�r�t�|�|d<n8|�r�|D]}
 518  |
 519  |dv�r�|d�	|
 520  ��q�n t�|�|d<t�|�|d<t�|�|d<||d<t�|�|d<d|�d��p�gv�r�|ttdv�r�dttv�r�gttd<ttd�	|�|�d��r<t�t|�d���}|�r1|��}dD]}||ddu�r"||d||<||d=�q
 521  t|���D]}||du�r=t||�||<�q*||=�q*d|v�ryd |v�ry|dd!k�r]|d |d<|d =n|d d"|d|d <|d=td#|||||d f�d |v�r�d$|d }d|v�s�|d�s�|g|d<n-|d�	|�|dD]!}|dd%�d&k�r�||k�r�|dd'=td(|||f�n�q�d|v�r	|d)v�r�d|v�s�|d�s�i|d<|d|dd*<n'|d+k�r	d|v�s�|d�s�i|d<d|dv�r|dd=|d|dd*<d,|v�r0d-|v�r*|d-|d,k�s*td.||d-|d,f�n|d,|d-<ntd/||�d��t|���D]}||�sL||=�qB|ttd|<d0ttv�rfttd0�	|�|}q{|S)1NcSr^r$rqrrr$r$r%rnyrozupdatevars.<locals>.<listcomp>rz(?P<start>[a-zA-Z]+)r�cSr^r$rqrrr$r$r%rn�rocSr^r$rqrrr$r$r%rn�ror��rGz@ @r�z;updatevars: no name pattern found for entity=%s. Skipping.
 522  rfrr/zIupdatevars: attempt to change the type of "%s" ("%s") to "%s". Ignoring.
 523  rJzVupdatevars: attempt to change the kindselector "%s" of "%s" ("%s") to "%s". Ignoring.
 524  rKzEupdatevars:%s: attempt to change empty charselector to %r. Ignoring.
 525  zVupdatevars: attempt to change the charselector "%s" of "%s" ("%s") to "%s". Ignoring.
 526  rMzMupdatevars: attempt to change the typename of "%s" ("%s") to "%s". Ignoring.
 527  rIr�rrr)rR�array�init�2rRr�rrz-updatevars: "%s %s" is mapped to "%s %s(%s)"
 528  �
dimension(%s)�	r�r	z5updatevars:%s: attempt to change %r to %r. Ignoring.
 529  �r�r1r�r0rr�r�rLzTupdatevars: attempt to change the init expression of "%s" ("%s") to "%s". Ignoring.
 530  z?updatevars: could not crack entity declaration "%s". Ignoring.
 531  rz)r�r
rr�r�r�r�r�rRrr�r�r�r�r-r�rgrrr�rQrRrdrZ�lenarraypatternr8rrH)r/r�rIZ
 532  entitydeclr�r�r�rMr�r�rr��s�elZel1r��e1�enamer�Znot_has_typespecrXr@�d1�lk�dm�dm1r$r$r%r�ss,
 533  
 534  (��
 535  
 536  
 537  �
 538  
 539  �$
 540  �
 541  �$�
 542  
 543  
 544  �
 545  �(
 546  �
 547  �
 548  
 549  ��
 550  
 551  
 552  
 553  
 554  
 555  ���
 556  �r�c	Cs�d}d}d}|r�|dvrLt�|�}|stdt|��dS|��}|d|d<|d=t|���D]	}||s9||=q0t|���D]
 557  \}}t|�||<q@n�|dkr�t	�|�}|satdt|��dS|��}|d|d<|d=|dr�t
 558  �t|d��}|��}d	D]}||d
 559  r�||d
 560  ||<||||<||d
 561  =q�|ddur�|d|d<|d=t|���D]	}||s�||=q�t|���D]
 562  \}}t|�||<q�n'|dkr�t�d
|tj
�}|r�|�d�}ntdt||��ntdt|��|||fS)Nr�z4cracktypespec: no kindselector pattern found for %s
 563  Zkind2rr�z4cracktypespec: no charselector pattern found for %s
 564  Zcharlen�lenkind)rR�kindr��f2py_lenr`z\s*\(\s*(?P<name>\w+)\s*\)rfz'cracktypespec: no typename found in %s
 565  z'cracktypespec: no selector used for %s
 566  )rJr�r-r�rrQrR�itemsrgrK�lenkindpatternr
r�r�r�)	r/r�r�r�rMrXr{r�r�r$r$r%r�s|
 567  
 568  ���
 569  
 570  �
 571  ���
 572  ��
 573  r�cCs�|si}|s|Sd|vr|g|d<|S|r|d�|�||dvr$|S|dkr7d|dvr7|d�|�|S|dkrJd|dvrJ|d�|�|S|dkr]d|dvr[|d�|�|S|dkrpd|dvrn|d�|�|S|d�|�|S)NrIrD�	automaticr�r�r�)rVr�rWr$r$r%rSCs6
 574  �	���rScC�Z|si}|s|Sd|vr||d<|St|���D]}|s"||dvr*|||d|<q|S)NrJ�rQrR�rV�selrWrXr$r$r%rT^s�rTcCr�)NrKr�r�r$r$r%rUls�rU�unknowncCsd|vr|dS|S)Nrfr$)rr�r$r$r%�getblockname{sr�cCs0z
d|d|dfaWdStyYdSw)Nz
 575  In: %s:%s
 576  rkrf)rr�)rr$r$r%�setmesstext�s
 577  �r�cCs2i}d|vrt|d�}d|vr|�|d�|S)N�parent_blockr�)�get_usedict�update)r�usedictr$r$r%r��sr�c	Cs�|duri}t|�}|s|St|���D]J\}}|��}|tvr,td||�d�f�qt|}t|�}|s7q|r?td|�t|���D]\}}||vrYtdt	|�t	|�f�|||<qEq|S)Nz0get_useparameters: no module %s info used by %s
 578  rfz,get_useparameters: mapping for %s not impl.
 579  zEget_useparameters: overriding parameter %s with value from module %s
 580  )
 581  r�rQr�r�rr-rZr�rdr�)	r�	param_mapr�Zusename�mapping�mvarsr_rXr�r$r$r%�get_useparameters�s4��
 582  �r�c
 583  s�ts|St|t�r��fdd�|D�}|St|�td�|dfd��dur,t|���dur_d|vr_|d}t|���D] }||}d|vr^|d}d|vr^|d}|�vr^�||d<q>��fd	d�|d
 584  D�}	|	|d
 585  <|S)Nc�g|]}t|�d�d��qS�r�)�tabr���
 586  postcrack2)rl�g�r�r�r$r%rn���zpostcrack2.<locals>.<listcomp>�%sBlock: %s
 587  rfrrrJr�cr�r�r��rl�br�r$r%rn�r�r)rr�rQr�r-r�rR)
 588  rr�r��retrr��varr��valZnew_bodyr$r�r%r��s6
 589  ���r�cCsJt|t�r3g}g}|D]#}t|�t||dd�}d|vr)d|dvr)|�|�q|�|�q||St|�t|t�sHd|vrHtdt|���d|vr]|ddks]td||dfd	�t	|�}t
 590  |�}t|�|d
 591  <t|d
 592  �|d<d|vr|dr|d}t
|||d�|d
<g}d|vr�|d}t|���D]}d|vr�|�|�q�ni}d}	d|vr�|d}	d|v�r�|d�r�g}
 593  d|vr�|d}
 594  t�|d
 595  �}|	r�|	d}nd}||vr�d}
d||
f|vr�|
d}
d||
f|vs�d||
f}dgi|	dd�}|dD]w}||
 596  v�rdg}d}|d
D]I}|d}|ddk�rYd}
|d
D]}|
d}
d|v�rB|d|k�rBt�|�}|d
|
=n�q$|�rY|d
�sQ|d
|=|
 597  |
 598  �|�=n�q|d
�|��q||v�rxt||��sx|||d
 599  |<�q|d
 600  �s�|d
�r�|
 601  |d<d|gi||dd�}i||<t�|�|�r�||d<|S)zi
 602      TODO:
 603            function return values
 604            determine expression types if in argument list
 605      r��r�rfr�rz0postcrack: Expected block dictionary instead of rwr�rr�sortvarsrrr�rrrZ__user__routinesZunknown__user__routinesrz%s_%irpZ_user_interface)rrrrfr	rm)rrrrfr)r�rQr��	postcrackrr�r�r�r-�analyzeargs�
analyzecommon�analyzevars�sortvarnames�analyzebodyrRr�rU�
 606  isexternalr)rrr�ZgretZuretr�Z
userisdefinedZuseblockrXrfrr��mnamer{rpr��edefr�r��bbZmblockr$r$r%r�s�
 607  �
 608  ��
 609  ��
 610  
 611  
 612  �
 613  
 614  ���
 615  �
 616  rcCsg}g}t|���D]}d||vr||dr|�|�q
 617  |�|�q
 618  t|�}d}|r�|d}d}|dd�D]}|||dvrFd}nq8|rm|dd�|g}|d}||krltdd�|�d�||}	|Sn|�|�|dd�}t|�}d}|s,|S)NrPrrzTsortvarnames: failed to compute dependencies because of cyclic dependencies between �, r�)rQrRrrRrdr�)rZindep�depr�r�r{r=�wr$r$r%r3sF����
 619  �rcCs~t|�s|Sg}t|d���D]�}g}|d|D]�}t�d|tj�}|r�g}|�d�r<dd�t|�d���d�D�}t	|�d��
 620  ��}||dvrsd	|d|vrd|d|d	�d
 621  d�|��n&d
 622  d�|�g|d|d	<n|r�d	d
 623  d�|�gi|d|<ni|d|<||vr�|�|�n
 624  |}t
d||f�|�|�q||d|<qd
|vr�||d
<|S|d
||d
<|S)Nr�z2\A\s*\b(?P<name>.*?)\b\s*(\((?P<dims>.*?)\)|)\s*\Z�dimscSr^r$rqrrr$r$r%rnartz!analyzecommon.<locals>.<listcomp>rrfrrIr�rzNanalyzecommon: failed to extract "<name>[(<dims>)]" from "%s" in common /%s/.
 625 626  commonvars)�	hascommonrQrRr�r�r�r�r
rrgr�rr�rd)rrrXZcomvarsr�r�rr�r$r$r%rUsR�
 627  ����
 628  �
 629  ��rcCst|�g}|dD]w}||d<|ddvr?|dur!|d|vr!q
 630  |d}|dtvr,q
 631  tr5|dtvr5q
 632  t|ddd	�|d
 633  <n|}t|||dd�}|dd
vr^|ds^|�d�s^d|vr^q
 634  |d�dd�dkrnt�|�q
 635  |ddkr||dt	|d<|�|�q
 636  |S)Nrr�rr{rfrz
 637        T��as_interface�saved_interfacer�rrur�rr�r�pythonmodulervr)
 638  r�r r!�crack2fortrangenrrZr�rrr)rrr�rr��as_r$r$r%r	�s<���r	cCs�t|�t}i}d|vrO|ddur&d}tdkr"tdt|d��||fSt|d���D] }|d|�d�dvrD|d|||<q.|d|d||<q.||fS)Nr�rz6buildimplicitrules: no implicit rules for routine %s.
 639  rfr/)rDr�)r��defaultimplicitrulesr
r-r�rQrRrZ)r�
implicitrules�	attrrulesrXr$r$r%�buildimplicitrules�s ��rcCs,t|||�}t|�ttfvr|Std|��)z2 Like `eval` but returns only integers and floats zr=%r)r�r`r2r4r�)r�r�r�r�r$r$r%�myeval�srz\A\b\w+\b\Zc	Cs
 640  ztt|ii��}d|dfWStyYnwt�|�r"dd|fSt|�}|D]�}t|�|kr1q(t�d|d|�r<q(t�d|dtj	�}|�|�}|�rz�|�|�}|rkd|�
 641  d	�d|�
 642  d
 643  �f}|�|�}|sWt|ii�}	|�|�}|r�d|�
 644  d	�d|�
 645  d
 646  �f}|�|�}|sxt|ii�|	}
 647  |�|�}|r�d|�
 648  d	�d|�
 649  d
 650  �f}|�|�}|s�t|ii�}|�|�}|r�d|�
 651  d	�d|�
 652  d
 653  �f}|�|�}|s�t|ii�}|
 654  d|	|kr�|
 655  d|	|kr�|
 656  |	|fWSWd
SWd
St�yYd
Swq(d
S)a
 657      Obtain ``a`` and ``b`` when ``e == "a*x+b"``, where ``x`` is a symbol in
 658      xset.
 659  
 660      >>> getlincoef('2*x + 1', {'x'})
 661      (2, 1, 'x')
 662      >>> getlincoef('3*x + x*2 + 2 + 1', {'x'})
 663      (5, 3, 'x')
 664      >>> getlincoef('0', {'x'})
 665      (0, 0, None)
 666      >>> getlincoef('0*x', {'x'})
 667      (0, 0, 'x')
 668      >>> getlincoef('x*x', {'x'})
 669      (None, None, None)
 670  
 671      This can be tricked by sufficiently complex expressions
 672  
 673      >>> getlincoef('(x - 0.5)*(x - 1.5)*(x - 1)*x + 2*x + 3', {'x'})
 674      (2.0, 3.0, 'x')
 675      rNrz\w\s*\([^)]*\b�\b�(?P<before>.*?)\b�\b(?P<after>.*)z%s(%s)%srrg�?g�?)NNN)r2rr��getlincoef_re_1r�rRr��searchr�r�r�)r��xsetr�Zlen_ersr?r�r@�eer�r�c2r$r$r%�
 676  getlincoef�s��
 677  
 678  
 679  
 680  �
 681  �
 682  �
 683  �
 684  �
 685  �
 686  �
 687  � ����� r'z\b[a-z][\w$]*\bcCs�||vrW||�dg�}d||vr5t||�s5t�||d�D]}||vr4||vr4||kr4|�|�q!|dd�D]}|�|g�pHt|||�D]}||vrT|�|�qIq;n
 688  tdt|��g}|||<|S)NrPrLz,_get_depend_dict: no dependence info for %s
 689  )rZ�isstring�word_pattern�findallr�_get_depend_dictr-r�)rfr�deps�words�wordrr$r$r%r+	s(
 690  �
 691  �
 692  ���r+cCs*t|���}i}|D]}t|||�q
 693  |Sr')rQrRr+)rrq�depend_dictr�r$r$r%�_calc_depend_dict!	s
 694  r0cs�t���g}t����D]}�|s|�|��|=q�rBt����D]\}}�fdd�|D�}|s;|�|��|=q#|�|<q#�s�fdd�|D�S)z
 695      c�g|]}|�vr|�qSr$r$)rlr�)r/r$r%rn4	�z$get_sorted_names.<locals>.<listcomp>cr1r$r$)rlrf�rr$r%rn:	r2)r0rQrRrr�)rrqrf�lstZnew_lstr$)r/rr%�get_sorted_names)	s 
 696  �
 697  
 698  �r5cCs@|ddvr|dd�}t�|�rdSt�|�rdSd|dS)	Nr�'"rr	��zkind(rD)r�r��real8pattern)r\r$r$r%�
 699  _kind_func=	s
 700  
 701  r:cCsLd|}|dkr
 702  dS|dkrdS|dkrdS|dkrd	S|dd
 703  kr$dSdS)
Nr��rirlr8lr7��r	r$)r�r�r$r$r%�_selected_int_kind_funcH	sr>cCsZ|dkrdS|dkrdSt����}|�d�r|dkrdSd	S|dkr%dS|dkr+dSd	S)
 704  N�r8r=r7)�aarch64�power�ppc�riscv�s390x�sparc��r�r	)�platform�machiner�r�)�pr��radixrIr$r$r%�_selected_real_kind_funcX	s
 705  �rLcCst�|�}t�|�}dtfdtfdtffD]\}}||vr!|||<qg}t|�D]}d||vr=d||dvr=|�|�q(t�dtj�}t�dtj�}	t�dtj�}
 706  |D�]0}d	||v�rx||d	}t	||�ry|�
 707  �}d
 708  D]}|j|�}qq|�d|�}|	�d|�}d
}
d||vr�d||dvr�t
|�}|�d||ddd�}t
|�|k}
|
s�|
 709  �|�s�|�d�}t
|�dkr�d�|dd���
 710  ��|d�
 711  �d�}t||��rt|�}t�|�D]}t||��|����
 712  ��dd��||��|���<q�d�|�}nt||��rtd|�d��t�|��rd}nt�|��r%d}z
 713  t|||�||<Wn!t�yP}z|||<td|t|�f�WYd}~nd}~wwt||��rht||t ��rht!||�||<|�
 714  �}||k�rw||||<qUt"||�tdt|��qU|S)Nr��selected_int_kind�selected_real_kindrIr�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*\)rL))z.false.�False)z.true.�Truez
 715  kind("\1")zselected_int_kind(\1)FrJr�rrr	r
 716  r�zAget_parameters[TODO]: implement evaluation of complex expression r�r7r8zget_parameters: got "%s" on %s
 717  z2get_parameters:parameter %s does not have value?!
 718  )#r�r:r>rLr5rr�r�r��	islogicalr�r��subrRr�rr��isdoublerQr�r�r�r��	iscomplexr-r#r9r�r�r�r(r�r2r�ra)rZ
global_paramsr_Zg_paramsrf�func�param_namesr�Zkind_reZselected_int_kind_reZselected_kind_rer��replZis_replacedZ
 719  orig_v_lenZv_r�r�r��nlr$r$r%r�k	s�
 720  
 721  ��
 722  ���
 723  
 724  
 725  &
 726  �
 727  � ��
 728  �
 729  �r�cCs|dvrdSt||�S)N)z(:)�(*)rrY)�_eval_scalar)�lengthr_r$r$r%�_eval_length�	s
 730  r\z\d+_c
 731  Cs�t|�r|�d�d}zt|i|�}t|t�rtnt|�}W|Stttfy-|YSt	yL}zt
 732  d||t|���f�WYd}~|Sd}~ww)Nr�rz,"%s" in evaluating %r (available names: %s)
 733  )
�_is_kind_numberrr�r�r�r�r�r�r�r�rdrQrR)�valuer_r�r$r$r%rZ�	s����rZc@
s�t|�t|�\}}t�|d��|ddkr#|d�vr#i�|d<d|dvrb�d=d|ddvrb|ddd}t��tdd�|d	D��BD]}d
 734  D]}||vr`t��|i�|��|<qOqKg}|d}|D]}z�||�|�Wqjty�Yqjwt��	��D]}||vr�|�|�q�t
 735  �t|��}	i}
 736  t�
d�j}t��	��D].}||�}
|
r�||
��|
���}z|
 737  |Wq�ty�t�
d
|tj�j|
 738  |<Yq�wq�|D�]�}|dt|�	��vr�t�|||d��|<d�|v�rnd�|v�r
 739  d�|dv�sn|�r[|d��}t||�	��D]>}|dk�r-|||dk�r-�q|�|v�r@|||�||<�q|dk�rX|||D]}t�||��|<�qK�qn||dv�rntdt|�|df�d�|v�r�d�|dv�r��|dd}z
 740  tt|i|	��}Wn
 741  t�y�Ynw|�|dd<d�|v�r�d�|dv�r؈|dd}z
 742  tt|i|	��}Wn
 743  t�y�Ynw|�|dd<i}d�|v�rq�|d}|��g�|d<d\}}}}}|D�]K}|dd�dk�r|dd���dd�}na|dd�dk�r)|dd���dd�}nK|dd�dk�r?|dd���dd�}n5|dd�d k�rU|dd���dd�}n|dd!�d"k�rk|d!d���dd�}n	t�||��|<|�r�d�|v�r�g�|d<d#d$�t|��d%�D�D]}|�d&d�}|�|dv�r��|d�|��q�d}|�r�|�d'd(�}|�d)d*�}d"�|v�r�|g�|d"<n	�|d"�|�d}|du�rd�|v�r�g�|d<td+d$�t|��d%�D��D]}|�|dv�r�|d�|��q�d}|du�rEd �|v�r!g�|d <d,d$�t|��d%�D�D]}|�|d v�rA�|d �|��q-d}�q�|�rqd�|v�rqg�|d<td-d$�t|��d%�D��D�]
 744  }|d.k�rod.nd/}||	v�r|t|	|�}|	D].}t�
d0|d1tj�}|�|�}
|
�r�|
�d2�t|	|�|
�d3�}|�|�}
|
�s��q~||k�r�|g}nt|d.��d4�}t|�d5k�r�d/|v�r�d/g}d/}t|�dk�r�|d|k�r�d6|dg}t|�d5k�rft t!j"j#|�\}}||d} | j$t!j%j&d7�}i}!|dD]Z}t!�'|�}"| �(|"��r`z| �)|"�\}}#||#fd8d9�}$t|�*��}%|%�+|#�*��Wnt,�yL}&zd}$t| �*��}%WYd}&~&nd}&~&wwt�fd:d�|%D��}'|$t|'�f|!|<�q|!||<�|d�|��qed �|v�rHd|v�rH||dv�rH�|�dg�}(g})t-t.t/t0��|�}*t1�|��r�t2�|d�D�]:\}+}|�|���du�r�n�|*�r���3�D]�\}\},}-��fd;d<��t�}.�||.�||(v�s�d=�|v�s�d�|v�r�q�|,du�r1||.v�r1d>}/|,t!�'d?|�d@|+�dA���}0|0j$t!j%j&d7�}0|0�|d=<|g|-�|d<d �|v�r0d?|�d@|+�dB|��g�|d <n4dC}/d�|v�r@g�|d<dD�|dv�rR�|d�dD�|(�|�|)�d?|�d@|+�dB|����|�dg�}1dE|1v�s�dF|1v�s�|1�|/�r~dFndE�|1�r�|1�|d<�q��du�r��3�D]K\}\},}-�|�dg�}'�|�dg�D]}2|2�4d��r�d�5|2���}2|'�6|2dGd��dH���q�|'�r�tt|'���|d<||'v�r�|(�|��q��q�nNt7�|��r2d�|v�r2d/�|dv�rt8�|dd/|	�}3|3�|dd/<n#d�|dv�r2t8�|dd|	�}3�|dd=|3�|dd/<|)�r;|)�|d <|(�rHtt|(���|d<d=�|v�r�d�|v�r\g�|d<dE�|dv�rwdF�|dv�rw�|d�dE�d�|v�r�g�|d<t|
 745  �3��D]\}}
|
�|d=��r��|d�|��q��|d�s��|d=t9�|��r�t:�|d=|	��|d=<q�t��	��D]�}||dk�r�d"�|v�r�|d"|d"<|ddk�r�dI|v�r|dI�v�rt;�|�|dI��|<dJ|v�r�|dJ}4|4�dKd�}5|4|5k}6|5�dLd�}4|4|5k}7t<d�|4�}
|
�r�t=|
�dM�|
�d3��\}8}9}}:t>|8|9�\};}<}=|8�|d<|;�rld|;v�rfzt|;di|	�|;d<Wn
 746  t�yeYnw|;�|d<|<�ru|<�|d<|=�r~|=�|dN<|6�r�t�|dK��|<|7�r�t�|dL��|<�q�tdOt|dJ���q�|ddPv�rhdQ|v�r�t�|d|dQ�}>nt�|d�}>t��	��D]}t-t?t@��|��r�|>�|��q�dR|v�r|>�6t|dR�	���t|dR�	��D]}|dR|D]
}||>v�r|>�|��q��q�|ddk�r'dI|v�r |>�|dI�n|>�|d�|ddSv�rF|d}?|?�v�rFd�|?v�rF�|?d|d<|ddTk�rV|>�6t��	���t��	��D]}||>v�rf�|=�q\�S)UNrrr�rfrrIcss�|]}|dVqdS)rfNr$r�r$r$r%�	<genexpr>�	s�zanalyzevars.<locals>.<genexpr>rr~rz[A-Za-z][\w$]*z.*\b%s\brr/r��	undefinedzCanalyzevars: typespec of variable %s is not defined in routine %s.
 747  rKrRrJr�)NNNNNr�r�rr	r�r�rPr�rOr8rNcSr^r$rqrrr$r$r%rnC
 748  rozanalyzevars.<locals>.<listcomp>rr�z\n\nz
 749  
 750  z\n r�cSr^r$rqrrr$r$r%rnT
 751  rocSr^r$rqrrr$r$r%rn[
 752  rocSr^r$rqrrr$r$r%rna
 753  ro�:rr r!rrz@:@r�1)�languagecSs|||Sr'r$)r�rr�r$r$r%�solve_v�
 754  szanalyzevars.<locals>.solve_vc3s �|]}|j�vr|jVqdSr')r�)rlr�r3r$r%r_�
 755  s�
 756  ��cs:��|dgg�dD]}||vr|�|��||�q
 757  dS)Nr)rZ�add)r�r,�v1)�coeffs_and_deps�compute_depsr$r%rh�
 758  s
 759  
 760  ��z!analyzevars.<locals>.compute_depsrLFzshape(rrDz) == T�inr�r�r?rr�rx�pure�	recursiverrMz'analyzevars: prefix (%s) were not used
 761  )rvrrmrlrr�)r�r�r`)Ar�rr�rrSrZr�KeyErrorrQrRr�r�r�r�r�r�r�r�r�r-r�r�r�r��reverser�r
rr�rrr�rRr�r�Expr�parse�tostring�Languager��	as_symbolr��linear_solve�symbolsr��RuntimeError�l_or�isintent_in�isintent_inout�isintent_inplace�isarray�	enumerater�r�r��extendr(r\�isscalarrZrYr0r�r��isintent_callback�isintent_aux)@rrr�genr�rXZsvarsrrr_Zdep_matches�
 762  name_matchr�r�Zln0r�Zdimension_exprsr��dimr�rPrOrNr��tmpr
 763  �starrJr?r�r��d2�dsizeZsolver_and_depsr�r�rdZall_symbolsr�Zv_depsZn_depsZn_checksZ
 764  n_is_inputr{�solverr,Zall_depsZis_requiredr�Zv_attr�aar[�prZpr1ZispureZisrecr/r�r�r�r�rMZ
 765  neededvarsrfr$)rgrhrr%r�	s�"���
 766  ���
 767   
 768  �����
 769  �
 770   �
 771  ��"
 772  
 773  
 774  ��
 775  ��
 776  
 777  ����&��
 778  
 779  
 780  
 781  ����
 782  �
 783  
 784  ��
 785  �
 786  
 787  ��L���
 788  �
 789  
 790  
 791  �
 792  �
 793  
 794  �����
 795  
 796  �
 797  
 798  
 799  ��
 800  
 801  �rz\A[a-z]+[\w$]*\ZcCs�|}t�|�}|r^t|�\}}t||d|�}d}|D]}	|	��}	|	tjtjvr,d}	||	}q|ddkr<|d}n|d}|}||dvsN||dvr^|d}||dvsN||dvsN||vr~d	}
 802  |t|
 803  �|vrx|
 804  d	}
 805  |t|
 806  �|vsl|t|
 807  �}|r�||d|<|S||dvr�||dvr�|d||d|<ni|d|<d
 808  |vr�||d
 809  |dvr�t	|d|d�|d|<|S)
NrZe_r�r	r��_err�rrrr�)
 810  �analyzeargs_re_1r�rr�r�r\�ascii_lowercase�digitsr�rS)rrrZorig_aZ	a_is_exprrr�at�nar�rXr$r$r%�	expr2name]sD
 811  
 812  ��	�r�cCst|�t|�\}}d|vrg|d<g}|dD]
}t|||�}|�|�q||d<d|vrLt|d���D]\}}|D]}||dvrJi|d|<q<q6|dD]!}|d|vrqd|vr`g|d<|d|dvrq|d�|d�qPd|vr�|d|dvr�i|d|d<|S)Nrr�rrrfrr�)r�rr�rrQr�)rrr�rrrXZargs1r�r$r$r%r�s4���rz\A\(.+?,.+?\)\Zz\A[+-]?\d+(_(?P<name>\w+)|)\Zz*\A[+-]?[\d.]+[-\d+de.]*(_(?P<name>\w+)|)\Zz
 813  \A\(.*\)\Zz\A(?P<name>\w+)\s*\(.*?\)\s*\ZcCsPt|t�r	ddiSt|t�rddiSt|t�rddiSt|t�r"|Stt|���)Nr/r1r0r�)r�r2r4r�r��AssertionErrorr�)r�r$r$r%�_ensure_exprdict�s
 814  
 815  
 816  
 817  r�cCs�||vr
 818  t||�S|��}t�|�rddiSt�|�}|r5d|��vr1|�d�r1tdt|��ddiSt	�|�}|rSd|��vrO|�d�rOtdt|��ddiSdD]%}dd	�t
 819  ||d
 820  ��d|d�D�D]}||vryt||�SqiqUi}t�|�r�t
|dd
�||�}n.t�|�}|r�|�d�}t
|�d�||�}|r�d|vr�|d=|s�|d|vr�t||d�S|ddvr�dddid�S|s�tdt|��|S)Nr/r�rfz:determineexprtype: selected kind types not supported (%s)
 821  r1r0)�+r�rrycSr^r$rqrrr$r$r%rn�roz%determineexprtype.<locals>.<listcomp>r�rFrr	rIrr6r�r)r/rKz>determineexprtype: could not determine expressions (%s) type.
 822  )r�r��determineexprtype_re_1r��determineexprtype_re_2rr�r-r��determineexprtype_re_3r
r�determineexprtype_re_4r��determineexprtype_re_5)r�r�rulesr��opr�r��rnr$r$r%r��sX
 823  
 824  
 825  �
 826  
 827  �(��
 828  
 829  
 830  
 831  �r�r�FcCs�t|�d}t|t�r3|D]#}|r'|ddvr'|dtvrq
tr'|dtvr'q
|t|||d�}q
|Sd}d}d}|d}|dkrCdSg}	d|vrM|d}d|vr||d}
 832  |dD]}t|||	�}t|
 833  |�sl|	�|�qY|dd	ksu|	r|d
 834  d�	|	�}d}d|vr�t|d�
 835  ��D]}
d
||t|
|d|
f}q�|�dg�dd�}|d	kr�d|vr�|�
d�|r�d||td�	|�|f}d}d|vr�t|d|t�}d}d|vr�t|d|t�}|dkr�d}d}d|vr�d|d}|d|	vr�|	�|d�t|d|t|d�}t||d|	|t|d�}
 836  d}d|v�r&|�s&d|d}d|v�rLd}t|d���D]\}
}d||t|
d�	|�f}�q5||}|dk�rX|dk�rXd}d||||||||||
 837  |||||f}|S)Nrrr{rfrrjrrr�z(%s)rrz	%s%s%s %sr��callbackz%s%sintent(%s) %sr�r�rwr�z result (%s)rrkz! in %sr�z%s%sentry %s(%s)rlroz%%s%s%s %s%s%s %s%s%s%s%s%s%send %s %s)r�r�rQr r!rr�r~rr�rRrrZr��use2fortran�common2fortran�vars2fortranr�)rr�rr�r�rxrfrZ	blocktype�argslrrrrXZ
 838  intent_lstr�r�r�r�messZentry_stmtsr{r$r$r%r�s�
 839  
 840  ��
 841  
 842  ���
 843  ��rc	CsVd}t|���D] }|dkrd||d�||�f}qd|||d�||�f}q|S)Nrr�z
%s%scommon %srz%s%scommon /%s/ %s)rQrRr�)r�r�r�rXr$r$r%r�(sr�cCsd}t|���D]{}d|||f}||ikr&|r%|ddkr%|dd�}qd||vr6||dr6d|}d||vru||drud}t||d���D]&}|||d|krdd	|||f}d}qNd
 844  |||||d|f}d}qN|r�|ddkr�|dd�}q|S)Nrz%s%suse %s,r	rr�z%s only:r�r��%s%s%sz
 845  %s%s%s=>%sr�)r�r�r�r�r�rXr$r$r%r�2s*�r�c	CsR|d}g}|D]}z	t�d|}Wn	tyYqw||�r&|�|�q|S)Nr�zisintent_%s)�globalsrlr)rr4r�r�r�r$r$r%�true_intent_listJs�
 846  �r�c	Cst|�d}g}|D]
}||dvr|�|�q
 847  d|vr7|dD]}||vr0||vr/|�|�q td|�q d|vrB|�|d�|sVt|���D]}||vrU|�|�qJ|D�],}d||vr�||dD]}||vr�d||vr�|||dvr�td||f�qgd|vr�||dvr�t||�r�d	|||f}d
 848  |||f}t||�r�d|||f}||vr�d||vr�qXd
}	|dD]}
 849  ||
 850  dkr�|
 851  ddkr�d}	nq�|	r�qX||vr�t|�t	d|�qX||dkr�|ddks�|�
 852  d�r�qXd||v�r(d||v�rd||dv�r||v�rd
 853  |||f}qXt||�t	d|�qX||d}|dk�rDd||v�rDd|||df}i}d||v�rT||d}n
d||v�ra||d}d|v�r|ddv�rvd||df}n6d ||df}n-d!|v�r�d"||d!f}d#|v�r�d$||d#f}nd%|}n
d#|v�r�d&||d#f}d'}
d||v�r�d(d)�||dD�}|�r�d*|v�r�d+|v�r�|�d+�|�r�d,|d-�|�f}d-}
d.||v�r�d/||
d-�||d.�f}d-}
d0||v�rt
||�}|�rd1||
d-�|�f}d-}
d2||v�r*d3||
d-�||d2�f}d-}
d||v�rAd4||
d-�||d�f}d-}
d5||v�rx||d5}||dd6v�rpzt|�}d7|j|jf}Wn
 854  t�yoYnwd8|||f}nd9||f}d:|||f}qX|S);z&
 855      TODO:
 856      public sub
 857      ...
 858      rrrz7vars2fortran: Confused?!: "%s" is not defined in vars.
 859  rzrPzHvars2fortran: Warning: cross-dependence between variables "%s" and "%s"
 860  rz%s%sintent(callback) %sz%s%sexternal %sz%s%soptional %sr/rrrfrr�rz/vars2fortran: No definition for argument "%s".
 861  r�rIr�z-vars2fortran: No typespec for argument "%s".
 862  r`rMz%s(%s)rJrKr)rraz%s*(%s)z%s*%srRz	%s(len=%sr�z%s,kind=%s)z%s)z%s(kind=%s)r�cSsg|]}|dvr|�qS))r�r$)rlr�r$r$r%rn�s�z vars2fortran.<locals>.<listcomp>z
 863  intent(in)zintent(out)z%s, %srr�z%s%sdimension(%s)r�z%s%sintent(%s)rOz
%s%scheck(%s)z%s%sdepend(%s)rL)r�r�z(%s,%s)z%s :: %s=%sz%s :: %sr�)r�rrdr|rQrRr~�
 864  isoptional�showr-rZr�r�r�r�r0�imagr�)rrrr�rr��noutrr
 865  r�r��vardefr�r�r�r4r�r$r$r%r�Xs�
 866  �
 867  ��
 868  �
 869  $
 870  ��� 
 871  
 872  
 873  
 874  
 875  
 876  
 877  ���r�cCsztdd�t|t�tdd�gattd�}tdd�tD]}td|j�d�d�t||�}qtdd�t	|�}t|S)NzReading fortran codes...
 878  rzPost-processing...
 879  z"Applying post-processing hooks...
 880  z  r�zPost-processing (stage 2)...
 881  )
 882  r-r�rrrr�post_processing_hooks�__name__�traverser�)�files�postlist�hookr$r$r%�crackfortran�s
 883  
 884  
 885  
 886  
 887  r�cCs$t|�d}d}dt}|||S)Nr�zE!    -*- f90 -*-
 888  ! Note: the context of this file is case sensitive.
 889  z�
 890  ! This file was auto-generated with f2py (version:%s).
 891  ! See:
 892  ! https://web.archive.org/web/20140822061353/http://cens.ioc.ee/projects/f2py2e
 893  )r�f2py_version)r�pyf�header�footerr$r$r%�
crack2fortran�s�r�cCs(t|t�ot|�dkot|dttf�S)Nrr)r��tuplerRr2r�)�objr$r$r%�_is_visit_pair
s
 894  
 895  
 896  ��r�cOs<t|�r,|ddkr|S||||g|�Ri|��}|dur%t|�s#J�|S|}|\}}nd|f}d}t|t�rbg}t|�D]#\}	}
 897  t|	|
 898  f|g|�R||g|d�|��\}}|dur`|�|�q=n2t|t�r�t�}|��D]"\}
}
 899  t|
|
 900  f|g|�R||g|d�|��\}}|dur�|||<qnn|}|dur�|S||fS)a�Traverse f2py data structure with the following visit function:
 901  
 902      def visit(item, parents, result, *args, **kwargs):
 903          """
 904  
 905          parents is a list of key-"f2py data structure" pairs from which
 906          items are taken from.
 907  
 908          result is a f2py data structure that is filled with the
 909          return value of the visit function.
 910  
 911          item is 2-tuple (index, value) if parents[-1][1] is a list
 912          item is 2-tuple (key, value) if parents[-1][1] is a dict
 913  
 914          The return value of visit must be None, or of the same kind as
 915          item, that is, if parents[-1] is a list, the return value must
 916          be 2-tuple (new_index, new_value), or if parents[-1] is a
 917          dict, the return value must be 2-tuple (new_key, new_value).
 918  
 919          If new_index or new_value is None, the return value of visit
 920          is ignored, that is, it will not be added to the result.
 921  
 922          If the return value is None, the content of obj will be
 923          traversed, otherwise not.
 924          """
 925      rr�N)�parentsr�)r�r�rQr{r�rr�r�)r��visitr�r�r�kwargs�
 926  new_result�parent�
 927  result_keyrUr^�	new_index�new_item�key�new_key�	new_valuer$r$r%r�	
sZ
 928  
 929  ��
 930  �
 931  ��
 932  ��
 933  ���r�c
 934  Os:|d\}}|\}}dd�}	|dvr#|dddksJ�|dd}
 935  n|d	kr8|d
 936  ddks1J�|d
 937  d}
 938  nd}
 939  d}|
 940  durU|}|
 941  ��D]
\}}
t|
�rS|	||�}qFn(|dkr}|d
 942  dd}
 943  |}|
 944  ��D]\}}
t|
�r|t�d
|dd||�}qg|dur�||kr�td|�d|�d|�d|�d�	d�||fSdS)a�Previously, Fortran character was incorrectly treated as
 945      character*1. This hook fixes the usage of the corresponding
 946      variables in `check`, `dimension`, `=`, and `callstatement`
 947      expressions.
 948  
 949      The usage of `char*` in `callprotoargument` expression can be left
 950      unchanged because C `character` is C typedef of `char`, although,
 951      new implementations should use `character*` in the corresponding
 952      expressions.
 953  
 954      See https://github.com/numpy/numpy/pull/19388 for more information.
 955  
 956      r	cSs0t�d|d||�}t�d|d||�}|S)Nz[*]\s*\brz\b\s*[\[]\s*0\s*[\]])r�rR)�varnamer^r$r$r%�	fix_usage]
s
 957  �z8character_backward_compatibility_hook.<locals>.fix_usage)r�rO�����rrrrLr�N�
callstatementz
 958  (?<![&])\brr�zcharacter_bc_hook[rwz
]: replaced `z` -> `z`
 959  )r��ischaracterr�rRr-)�itemr�r�rr�Z
 960  parent_key�parent_valuer�r^r�Z	vars_dictr�r��vdr$r$r%�%character_backward_compatibility_hookK
sL
 961  ��������r��__main__raz-quietz-verboserz-fixz?Use option -f90 before -fix if Fortran 90 code is in fix form.
 962  z-skipemptyendsz--ignore-containsz-f77z-f90r�z-hz-showz-mr�zUnknown option %s
 963  z	OSError: a  Warning: You have specified module name for non Fortran 77 code that
 964    should not need one (expect if you are scanning F90 code for non
 965    module blocks but then you should use flag -skipemptyends and also
 966    be sure that the files do not contain programs without program
 967    statement).
 968  z Writing fortran code to file %s
 969  r)r)r)r)r�r')rN)Nr)r)NN)rr)r�F)rF)��__doc__r(r\r�r�r�r�rHr�r��ImportErrorrr�auxfuncsr�versionr�r
 970  rrr
rrrrrrrr�rrrrrrrrrr"rr!r#rr rrr&r-�	_MAXCACHErr�rcrtr�rgrrrurvr|r�r�r�r�r#r�r�r�r�r�r�r�r��beforethisafter�fortrantypesr0r�r-r.�
groupbegins77r��
groupbegins90r��	groupendsr+�endifsr*�moduleproceduresr6r/r r!r#r$r'r(r)r"r%r&r2r5r9r1r3r4r,�Srrr�rr7rr8r
rHrYr�r`rfrgrhr�r9r[r\rcrir:r�r�r�rJrKr�r�r�r�r�r�rSrTrUr�r�r�r�r�rrrr	rrr"r'r)r+r0r5r:r>rLr�r\r]rZrr�r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�rr�r��funcsr��f2�f3�
showblocklist�argvr�rdr�r�r��OSError�detailr�r�r*r$r$r$r%�<module>sL
�&
 971  	
 972  f����
 973  ��
 974  ��������������
 975  ��
 976  ��
 977  ��
 978  ��
 979  ��
 980  ��
 981  ��
 982  ��
 983  ��
 984  ��
 985  ��
 986  ��
 987  ��
 988  ��
 989  ��
 990  ��
 991  ��
 992  ��
 993  
 994  ���� �������5
 995  ����%<		 `"+#H^{%�-K
 996  	B
 997  <
 998  
 999  
1000  
1001  
1002  �
1003  
1004  
1005  
1006  
1007  
1008   �����H