U
    pd                     @   sj   d Z ddlZddlZddlZddlZddddg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	translatec                 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/lib/python3.8/fnmatch.pyr      s       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k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   0   s    
c                 C   s   t |}|| dk	S )zTest 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   @   s    c           	      C   s  dt |  }}d}||k r| | }|d }|dkr>|d }q|dkrP|d }q|dkr|}||k rz| | d	krz|d }||k r| | d
kr|d }||k r| | d
kr|d }q||kr|d }q| || }d|kr|dd}ng }| | d	kr|d n|d }| d||}|dk r(qN|| ||  |d }|d }q|| ||  ddd |D }tdd|}|d }|d d	krd|dd  }n|d dkrd| }d||f }q|t| }qd| S )zfTranslate a shell PATTERN to a regular expression.

    There is no way to quote meta-characters.
    r       *z.*?.[!]z\[z--\\\   -   c                 s   s"   | ]}| d d ddV  qdS )r$   r%   r'   z\-N)replace).0sr   r   r   	<genexpr>t   s   ztranslate.<locals>.<genexpr>z([&~|])z\\\1^N)r-   r!   z%s[%s]z	(?s:%s)\Z)lenr)   findr   joinr   subescape)	r
   inr   cjZstuffZchunkskr   r   r   r   J   sV    






)__doc__r   r   r   	functools__all__r   	lru_cacher   r   r   r   r   r   r   r   <module>   s   
	
