3
���h � @ s� d Z ddgZddlZddlZddlZejdej�Zejdej�Zejdej�Z dd � Z
ejd
�Zejd�Zejd�Z
d
d� Zdd� Zejd�Zdd� Zdd� Zejd�Zdd� Zdd� Zejdej�Zdd� Zdd� Zed�Zdd � Zed!kr�e� dS )"a�
process_file(filename)
takes templated file .xxx.src and produces .xxx file where .xxx
is .pyf .f90 or .f using the following template rules:
'<..>' denotes a template.
All function and subroutine blocks in a source file with names that
contain '<..>' will be replicated according to the rules in '<..>'.
The number of comma-separated words in '<..>' will determine the number of
replicates.
'<..>' may have two different forms, named and short. For example,
named:
<p=d,s,z,c> where anywhere inside a block '<p>' will be replaced with
'd', 's', 'z', and 'c' for each replicate of the block.
<_c> is already defined: <_c=s,d,c,z>
<_t> is already defined: <_t=real,double precision,complex,double complex>
short:
<s,d,c,z>, a short form of the named, useful when no <p> appears inside
a block.
In general, '<..>' contains a comma separated list of arbitrary
expressions. If these expression must contain a comma|leftarrow|rightarrow,
then prepend the comma|leftarrow|rightarrow with a backslash.
If an expression matches '\<index>' then it will be replaced
by <index>-th expression.
Note that all '<..>' forms in a block must have the same number of
comma-separated entries.
Predefined named template rules:
<prefix=s,d,c,z>
<ftype=real,double precision,complex,double complex>
<ftypereal=real,double precision,\0,\1>
<ctype=float,double,complex_float,complex_double>
<ctypereal=float,double,\0,\1>
�process_str�process_file� Nz2(\n|\A)(( (\$|\*))|)\s*(subroutine|function)\bz+\n\s*end\s*(subroutine|function)\b.*(\n|\Z)z\n (\$|\*)\s*function\bc C s� g }d}x�t j| |�}|dkr P |j� }tj| ||j� �rrx6| jd||�}|dkrTP |}| ||d � dkr<P q<W |d7 }tj| |j� �}|r�|j� d p�t| � }}|j ||f� q
W |S )z� Return a list of tuples for each function or subroutine each
tuple is the start and end of a subroutine or function to be
expanded.
r N�
� � z
$���)
�routine_start_re�search�start�function_start_re�match�end�rfind�routine_end_re�len�append)�astrZspanlist�ind�mr
�ir
� r �>/tmp/pip-build-5_djhm0z/numpy/numpy/distutils/from_template.py�parse_structure: s( r z<\s*(\w[\w\d]*)\s*>z<\s*(\w[\w\d]*)\s*=\s*(.*?)\s*>z<\s*((.*?))\s*>c C sT t j| �}i }x@|D ]8}|d j� p*t|�}|d jdd�}t|�}|||< |