a
    jCit  ã                   @   s|   d Z ddlZddlZddlZddlZg d¢ZddlmZ eƒ jZ	[dd„ Z
ejddd	�d
d„ ƒZdd„ Zdd„ Zdd„ ZdS )a£  Filename matching with shell patterns.

fnmatch(FILENAME, PATTERN) matches according to the local convention.
fnmatchcase(FILENAME, PATTERN) always takes case in account.

The functions operate by translating the pattern into a regular
expression.  They cache the compiled regular expressions for speed.

The function translate(PATTERN) returns a regular expression
corresponding to PATTERN.  (It does not compile it.)
é    N)ÚfilterÚfnmatchÚfnmatchcaseÚ	translate)Úcountc                 C   s"   t j | ¡} t j |¡}t| |ƒS )a½  Test whether FILENAME matches PATTERN.

    Patterns are Unix shell style:

    *       matches everything
    ?       matches any single character
    [seq]   matches any character in seq
    [!seq]  matches any char not in seq

    An initial period in FILENAME is not special.
    Both FILENAME and PATTERN are first case-normalized
    if the operating system requires it.
    If you don't want this, use fnmatchcase(FILENAME, PATTERN).
    )ÚosÚpathÚnormcaser   )ÚnameÚpat© r   ú#/usr/local/lib/python3.9/fnmatch.pyr      s    r   é   T)ÚmaxsizeÚtypedc                 C   s<   t | tƒr(t| dƒ}t|ƒ}t|dƒ}nt| ƒ}t |¡jS )Nz
ISO-8859-1)Ú
isinstanceÚbytesÚstrr   ÚreÚcompileÚmatch)r   Zpat_strZres_strÚresr   r   r   Ú_compile_pattern,   s    

r   c                 C   sh   g }t j |¡}t|ƒ}t jtu r@| D ]}||ƒr&| |¡ q&n$| D ]}|t j |¡ƒrD| |¡ qD|S )zJConstruct a list from those elements of the iterable NAMES that match PAT.)r   r   r	   r   Ú	posixpathÚappend)Únamesr   Úresultr   r
   r   r   r   r   6   s    
r   c                 C   s   t |ƒ}|| ƒduS )z�Test whether FILENAME matches PATTERN, including case.

    This is a version of fnmatch() which doesn't case-normalize
    its arguments.
    N)r   )r
   r   r   r   r   r   r   F   s    r   c                 C   sL  t ƒ }g }|j}dt| ƒ }}||k �r | | }|d }|dkrZ|rP|d |urX||ƒ q|dkrl|dƒ q|dk�rð|}||k r–| | dkr–|d }||k r²| | d	kr²|d }||k rÐ| | d	krÐ|d }q²||krä|d
ƒ �qþ| ||… }d|v�r| dd¡}nŠg }	| | dk�r"|d n|d }
|  d|
|¡}
|
dk �rF�ql|	 | ||
… ¡ |
d }|
d }
�q*|	 | ||… ¡ d dd„ |	D ƒ¡}t dd|¡}|d }|d dk�rÈd|dd…  }n|d dv �rÞd| }|d|› d	�ƒ q|t |¡ƒ q||k�sJ ‚|}g }|j}dt|ƒ }}||k �rZ|| |u�rZ||| ƒ |d7 }�q*||k �r(|| |u �svJ ‚|d7 }||k�r”|dƒ �q(|| |u�s¦J ‚g }||k �rÜ|| |u�rÜ| || ¡ |d7 }�qªd |¡}||k�r|dƒ ||ƒ n"t	ƒ }|d|› d|› d|› d�ƒ �qZ||k�s6J ‚d |¡}d|› d�S ) zfTranslate a shell PATTERN to a regular expression.

    There is no way to quote meta-characters.
    r   é   Ú*éÿÿÿÿú?Ú.ú[ú!ú]z\[z--ú\ú\\é   ú-é   c                 s   s"   | ]}|  d d¡  dd¡V  qdS )r%   r&   r(   z\-N)Úreplace)Ú.0Úsr   r   r   Ú	<genexpr>~   s   ÿztranslate.<locals>.<genexpr>z([&~|])z\\\1ú^N)r.   r"   z.*Ú z(?=(?P<gz>.*?z))(?P=gú)z(?s:z)\Z)
Úobjectr   Úlenr*   ÚfindÚjoinr   ÚsubÚescapeÚ_nextgroupnum)r   ZSTARr   ÚaddÚiÚnÚcÚjÚstuffÚchunksÚkZinpZfixedZgroupnumr   r   r   r   P   s’    







ÿ




 
r   )Ú__doc__r   r   r   Ú	functoolsÚ__all__Ú	itertoolsr   Ú__next__r7   r   Ú	lru_cacher   r   r   r   r   r   r   r   Ú<module>   s   
	
