B
    d7                 @   s  d dl mZ yd dlmZ W n ek
r4   eZY nX ye W n ek
rV   eZY nX d dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlmZ e	jjZg Zdd Zdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zedd Zedd Z edd Z!edd Z"dd  Z#e$d!j%Z&d"d# Z'd$d% Z(dCd&d'Z)dDd(d)Z*d*d+ Z+d,d- Z,ed.d/ Z-edEd1d2Z.dd3e
j/d4fd5d6Z0G d7d8 d8Z1G d9d: d:e2Z3d;d< Z4d=d> Z5d?d@ Z6dAdB Z7dS )F    )absolute_import)
basestringN)contextmanagerc              C   s   xt D ]} |   qW d S )N)_function_cachesclear)cache r   Y/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/Cython/Utils.pyclear_function_caches   s    
r
   c                s.   i  t   t  fdd}|_|S )Nc                 s(     | }|kr$|   } | < |S )N)get)argsres)r   f
uncomputedr   r	   wrapper&   s    z cached_function.<locals>.wrapper)r   appendobjectZuncached)r   r   r   )r   r   r   r	   cached_function"   s    
r   c                s   dj    fdd}|S )Nz
__%s_cachec                sN   t |  d }|d kr$i }t|  | ||kr4|| S | f|  }||< |S )N)getattrsetattr)selfr   r   r   )
cache_namer   r   r	   r   0   s    zcached_method.<locals>.wrapper)__name__)r   r   r   )r   r   r	   cached_method.   s    
	r   c             C   s   t j| \}}|| S )N)ospathsplitext)r   Znewsufbase_r   r   r	   replace_suffix;   s    r   c             C   s&   t j| rt |  tj| dddS )Nwz
ISO-8859-1)encoding)r   r   existsunlinkcodecsopen)r   r   r   r	   open_new_file@   s    
r&   c             C   sT   yt | }W n tk
r    Y n0X |d |  |rPt| |j|jd f d S )NzN#error Do not use this file, it is the result of a failed Cython compilation.
   )r&   EnvironmentErrorwritecloser   utimest_atimest_mtime)r   str   r   r   r	   castrate_fileO   s    r/   c             C   s   t | }||kS )N)modification_time)r   timeZftimer   r   r	   file_newer_than_   s    r2   c             C   s6   yt |  W n" tk
r0   t j| s, Y nX d S )N)r   makedirsOSErrorr   isdir)r   r   r   r	   safe_makedirsd   s
    r6   c             C   s^   t j|t j| }yt|}W n tk
r>   t| Y nX t| |sNdS t	| | dS )z
    Copy file sourcefile to directory destdir (creating it if needed),
    preserving metadata. If the destination file exists and is not
    older than the source file, the copying is skipped.
    N)
r   r   joinbasenamer0   r4   r6   r2   shutilcopy2)Z
sourcefileZdestdirdestfileZdesttimer   r   r	   copy_file_to_dir_if_newerl   s    
r<   c             C   s0   t j| }| |kr|S t|r(t|S |S d S )N)r   r   dirnameis_package_dirfind_root_package_dir)	file_pathdirr   r   r	   r?      s    r?   c             C   s,   x&|D ]}t j| |} t| sd S qW | S )N)r   r   r7   r>   )rA   Zpackage_namesr=   r   r   r	   check_package_dir   s
    
rB   c             C   s,   x&dD ]}t j| |}t|rdS qW d S )N)z__init__.pyz__init__.pycz__init__.pyxz__init__.pxdr'   )r   r   r7   path_exists)Zdir_pathfilenamer   r   r   r	   r>      s    
r>   c             C   s   t j| rdS yft}t|dd }|rtt j| }||rt|t|d d  }y|| dS  t	k
rr   dS X W n t
k
r   Y nX dS )NTarchiver'   F)r   r   r"   
__loader__r   normpath
startswithlenget_dataIOError	NameError)r   loaderarchive_pathrG   arcnamer   r   r	   rC      s"    


rC   c             C   sJ   t | trFy&t }|d kr$t }| |} W n tk
rD   Y nX | S )N)
isinstancebytessysgetfilesystemencodinggetdefaultencodingdecodeUnicodeDecodeError)rD   Zfilename_encodingr   r   r	   decode_filename   s    
rW   s   (\w*coding)[:=]\s*([-\w.]+)c             C   s   d}d}x2t |dk r:| d}||7 }|d}|s
P q
W t|d }|rj|ddkrj|d	d
S t |dkrt|d }|r|d	d
S dS )Nr          i     
r   r'   s   c_string_encoding   z	iso8859-1zUTF-8)rI   readsplit_match_file_encodinggrouprU   )r   linesstartdatamr   r   r	   detect_opened_file_encoding   s     

rd   c             C   s   |  ddkr| d dS )z
    Read past a BOM at the beginning of a source file.
    This could be added to the scanner, but it's *substantially* easier
    to keep it at this level.
    r'   u   ﻿r   N)r\   seek)r   r   r   r	   skip_bom   s    rf   c             C   s   d }yL|d kr>t | d}t|}|d t j|||d}nt j| ||d}W n^ tk
r   tj| rn y"t	}| 
|jrt|| ||}W n ttfk
r   Y nX Y nX |d krt| t| |S )Nrbr   )r!   errors)ior%   rd   re   TextIOWrapperr4   r   r   r"   rF   rH   rE   open_source_from_loaderrL   AttributeErrorFileNotFoundErrorrf   )source_filenamer!   error_handlingstreamr   rM   r   r   r	   open_source_file   s.    
rq   c             C   sB   t j|}|t| jd d  }| |}tjt|||dS )Nr'   )r!   rh   )	r   r   rG   rI   rE   rJ   ri   rj   BytesIO)rM   rn   r!   ro   ZnrmpathrO   rb   r   r   r	   rk     s    
rk   c             C   s   d}| d d dkr$d}| dd  } t | dk r<t| d} n~| d dkr| d }|dkrlt| dd  d	} q|d
krt| dd  d} q|dkrt| dd  d} qt| d} n
t| d} |r|  S | S )NFr'   -Tr[   r   0xX   ZoO   ZbB)rI   int)valueZis_negZliteral_typer   r   r	   str_to_number  s"    
rz   c             C   s,   t | trt| } d|   ko$dk n   S )Ni   l        )rP   r   rz   )ry   r   r   r	   long_literal+  s    
r{   c              C   sz   dt jkrt jd S d} t jdkrFtjdkr:t jd} nt jd} | rdt j| rdt j	| dS t jt j	dd	S )
z
    Return the base directory containing Cython's caches.

    Priority:

    1. CYTHON_CACHE_DIR
    2. (OS X): ~/Library/Caches/Cython
       (posix not OS X): XDG_CACHE_HOME/cython if XDG_CACHE_HOME defined
    3. ~/.cython

    ZCYTHON_CACHE_DIRNposixdarwinz~/Library/CachesXDG_CACHE_HOMEcython~z.cython)
r   environnamerR   platformr   
expanduserr   r5   r7   )parentr   r   r	   get_cython_cache_dir1  s    



r   r[   c             #   s   t | }zltjddVdgffdd	t  |  z fdd}|V  W d t ||    X W d Q R X W d t | X d S )Nza+b)moderX   c                s$    j s d   | d< | d S )Nr   )closedre   r\   )_output)	temp_filer   r	   read_outputU  s    
z captured_fd.<locals>.read_outputc                 s    }  r|   S | S )N)rU   )result)r!   r   r   r	   
get_output]  s    zcaptured_fd.<locals>.get_output)r   duptempfileTemporaryFiledup2filenor*   )rp   r!   orig_streamr   r   )r!   r   r   r	   captured_fdP  s    

r   rZ   Tc             C   sb   |r| | |  y
|j}W n tk
r8   |}Y nX | |  |rR| | |r^|  d S )N)r)   flushbufferrl   )sZheader_textendfiler   outr   r   r	   print_bytesi  s    




r   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )LazyStrc             C   s
   || _ d S )N)callback)r   r   r   r   r	   __init__x  s    zLazyStr.__init__c             C   s   |   S )N)r   )r   r   r   r	   __str__z  s    zLazyStr.__str__c             C   s   |   S )N)r   )r   r   r   r	   __repr__|  s    zLazyStr.__repr__c             C   s   |   | S )N)r   )r   rightr   r   r	   __add__~  s    zLazyStr.__add__c             C   s   ||    S )N)r   )r   leftr   r   r	   __radd__  s    zLazyStr.__radd__N)r   
__module____qualname__r   r   r   r   r   r   r   r   r	   r   w  s
   r   c               @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )
OrderedSetr   c             C   s   g | _ t | _| | d S )N)_listset_setupdate)r   elementsr   r   r	   r     s    zOrderedSet.__init__c             C   s
   t | jS )N)iterr   )r   r   r   r	   __iter__  s    zOrderedSet.__iter__c             C   s   x|D ]}|  | qW d S )N)add)r   r   er   r   r	   r     s    
zOrderedSet.updatec             C   s&   || j kr"| j| | j | d S )N)r   r   r   r   )r   r   r   r   r	   r     s    
zOrderedSet.addN)r   )r   r   r   r   r   r   r   r   r   r   r	   r     s   
r   c                s    fdd}|S )z6Class decorator for creating a class with a metaclass.c                sl   | j  }|d}|d k	rDt|tr,|g}x|D ]}|| q2W |dd  |dd   | j| j|S )N	__slots____dict____weakref__)r   copyr   rP   strpopr   	__bases__)cls	orig_varsslots	slots_var)	metaclassr   r	   r     s    



zadd_metaclass.<locals>.wrapperr   )r   r   r   )r   r	   add_metaclass  s    r   c             C   s   | dks|  drtdd S )Nr   zcython.z;cython is a special module, cannot be used as a module name)rH   
ValueError)Zfull_module_namer   r   r	   $raise_error_if_module_name_forbidden  s    r   c             C   s   g }d}xXt d| D ]H}|dkrHdddd| }|ddg dd	 }q|d
kr|t| qW |dgd	  dd }|d	  |7  < d}x|D ]}|d> | }qW d| S )zn
    Parse and translate '4.3a1' into the readable hex representation '0x040300A1' (like PY_VERSION_HEX).
       z
([.abrc]+))abrc         r   NrY   .   rw   z0x%08X)rer]   r   rx   )version_stringdigitsZrelease_statusdigit
hexversionr   r   r	   build_hex_version  s    
r   c       
   	   C   s   t j|}t  }|t js*|t j7 }g }x^|D ]V}t j|}||r|yt j||}W q t	k
rx   |}Y qX n|}|
| q4W t j| |d }|d|d 7 }t| d d}	|	| W d Q R X d S )Nz: \
  z \
  
z.depr    )r   r   r=   getcwdendswithsepabspathrH   relpathr   r   r7   r%   r)   )
targetsourcedependenciesZsrc_base_dircwdpathsfnamenewpathZdeplineoutfiler   r   r	   write_depfile  s$    


r   )NN)NN)r[   N)8
__future__r   __builtin__r   ImportErrorr   rm   rL   r4   r   rR   r   ri   r$   r9   r   
contextlibr   r   getmtimer0   r   r
   r   r   r   r&   r/   r2   r6   r<   r?   rB   r>   rC   rW   compilesearchr^   rd   rf   rq   rk   rz   r{   r   r   stdoutr   r   r   r   r   r   r   r   r   r   r   r	   <module>   sb   





!
	