U
    ;vf                     @   sl   d Z ddlmZ ejZddlmZmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ dddZd	d
 ZdS )aM  

Build common block mechanism for f2py2e.

Copyright 2000 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/05/06 10:57:33 $
Pearu Peterson

   )__version__)hasbody	hascommonhasnoteisintent_hideoutmess)	capi_maps)	func2subr)	rmbadnamec           
         s   g }t  rF d  D ]*\}} fdd|D }||||f qn$t rj d D ]}|t|d }qV|rg }g }|D ](}	|	d |krz||	d  ||	 qz|S |S )Ncommonc                    s   i | ]}| d  | qS )vars ).0vblockr   ;/tmp/pip-unpacked-wheel-sdaoq5e2/numpy/f2py/common_rules.py
<dictcomp>   s      z$findcommonblocks.<locals>.<dictcomp>body    )r   itemsappendr   findcommonblocks)
r   topretkeyvalueZvars_bZtretnamestr   r   r   r      s"    r   c                 C   s  g g dgd}dg}|fdd}dg}|fdd}dg}|fdd	}dg}|fd
d}	t | D ]L\}
}}|
 }g g  }}|D ]&}t|| r|| q|| q|rtd|
d|d|f  ntd|
d|f  |d|
  |d |D ]}|t|| q|
dkr.|dd|  n|d|
d|f  |dd|  |d |d|
  g }|D ]}t	|| }t
|| }tj| }t||| }|d r|d|d   n
|d |d  }|sd}|d||d |||f  qr|d t|}ddd |D }|d|
|f  |d  |D ]}|d!|
|f  qH|d" d#|krxd$}nd%}|d&|||
 dd'gt| f  |d(|
  |d)|||
 |
f  |d* |d+|
|
f  |d, |d-|
  |d. |
d#d/}|	d0|  |	d1 |D ]Z}|	d2t|||   t|| r || d3 }t|trld4|}|	d5|  q |	d6 |d7 d8|
dtd9d: ||f  q^||d;< ||d<< |d= |d>< t|d7 d?krd|d7< ||d= fS )@Nz"COMMON blocks:\n")commonhooksinitcommonhooksdocs c                 S   s   d|d | f |d< d S )Nz%s
      %sr   r   linesr   r   r   fadd4   s    zbuildhooks.<locals>.faddc                 S   s   d|d | f |d< d S Nz%s
%sr   r   r$   r   r   r   cadd8   s    zbuildhooks.<locals>.caddc                 S   s   d|d | f |d< d S r(   r   r$   r   r   r   iadd<   s    zbuildhooks.<locals>.iaddc                 S   s   d|d | f |d< d S r(   r   r$   r   r   r   dadd@   s    zbuildhooks.<locals>.daddzF		Constructing COMMON block support for "%s"...
		  %s
		  Hidden: %s
,z7		Constructing COMMON block support for "%s"...
		  %s
z subroutine f2pyinit%s(setupfunc)zexternal setupfuncZ_BLNK_z	common %szcommon /%s/ %szcall setupfunc(%s)zend
z'static FortranDataDef f2py_%s_def[] = {Zdimsz(%s)z-1z	{"%s",%s,{{%s}},%s, %s},Zrankz
	{NULL}
};c                 S   s   g | ]}d | qS )zchar *r   )r   r&   r   r   r   
<listcomp>l   s     zbuildhooks.<locals>.<listcomp>zstatic void f2py_setup_%s(%s) {z	int i_f2py=0;z!	f2py_%s_def[i_f2py++].data = %s;}_Z	F_FUNC_USF_FUNCz3extern void %s(f2pyinit%s,F2PYINIT%s)(void(*)(%s));zchar*z static void f2py_init_%s(void) {z*	%s(f2pyinit%s,F2PYINIT%s)(f2py_setup_%s);z}
z5	tmp = PyFortranObject_New(f2py_%s_def,f2py_init_%s);z	if (tmp == NULL) return NULL;z=	if (F2PyDict_SetItemString(d, "%s", tmp) == -1) return NULL;z	Py_DECREF(tmp);z\_z&\subsection{Common block \texttt{%s}}
z\begin{description}z\item[]{{}\verb@%s@{}}note
z--- %sz\end{description}r"   z"	/%s/ %s\n"c                 S   s   | | S )Nr   )r   dr   r   r   <lambda>       zbuildhooks.<locals>.<lambda>r    r!   r   Zlatexdocr   )r   lowerr   r   r   joinr	   Zvar2fixfortranr   ZgetctypeZ
get_elsizeZ
c2capi_mapZ
getarrdimsstripr
   upperlenreplaceZgetarrdocsignr   
isinstancelistmap)mr   Zfwrapr'   Zchooksr)   Zihooksr*   docr+   nameZvnamesr   Z
lower_nameZhnamesZinamesnZidimsctZelsizeatdmZdmsZinames1Zinames1_tpsr0   Ztnamer1   r   r   r   
buildhooks/   s    
  
 







rF   N)r   )__doc__r#   r   versionZf2py_versionZauxfuncsr   r   r   r   r   r   r	   Zcrackfortranr
   r   rF   r   r   r   r   <module>   s   
