a
    xd"                     @   sT   d dl mZ d dlZd dlZd dlmZmZmZm	Z	 G dd dZ
G dd dZdS )    )absolute_importN)CommandGlobItemPipelineSeqc                   @   sf   e Zd Zd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dd Zdd ZdS )ShLexerFc                 C   s    || _ d| _t|| _|| _d S )Nr   )dataposlenendwin32Escapes)selfr   r    r   S/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/lit/ShUtil.py__init__   s    
zShLexer.__init__c                 C   s   | j | j }|  jd7  _|S )N   r   r	   r   cr   r   r   eat   s    zShLexer.eatc                 C   s   | j | j S Nr   r   r   r   r   look   s    zShLexer.lookc                 C   s&   | j | j |kr"|  jd7  _dS dS )z
        maybe_eat(c) - Consume the character c if it is the next character,
        returning True if a character was consumed. r   TFr   r   r   r   r   	maybe_eat   s    zShLexer.maybe_eatc                 C   s   | j | jd d  d dd }d|v s`d|v s`d|v s`d|v s`d|v s`d|v s`d	|v s`d
|v rdd S | jd t| | _d|v sd|v rt|S |S )Nr   r   |&<>'";\*?)r   r	   splitr
   r   )r   r   chunkr   r   r   lex_arg_fast   s"     zShLexer.lex_arg_fastc                 C   sn  |dv r|  |}n|}d}d}| j| jkrL|  }| sF|dv rLqLq |dv r| s`qLt|}|  }t|t	rt
|dksJ |d |fS |dks|dkr|   |  |}d	|v sd
|v rd}||7 }q | js"|dkr"|   | j| jkrtjd| j  |S ||  7 }q |dv r>d}||  7 }q ||  7 }q |r\|r\J |rjt|S |S )Nz'"Fz|&;z><r   r   r   r   r"   r#   Tr!   'escape at end of quoted argument in: %rz*?)lex_arg_quotedr	   r   r   isspaceisdigitintlex_one_token
isinstancetupler
   r   r   litutilwarningr   r   )r   r   strZunquoted_glob_charZquoted_glob_charnumtokZ
quoted_argr   r   r   lex_arg_slow-   sH    


zShLexer.lex_arg_slowc                 C   s   d}| j | jkr|  }||kr$|S |dkr|dkr| j | jkrVtjd| j  |S |  }|dkrp|d7 }q|dkr|d7 }q|d| 7 }q||7 }qtjd| j  |S )N r!   r   r'   zmissing quote character in %r)r	   r   r   r/   r0   r1   r   )r   delimr2   r   r   r   r   r(   h   s(    


zShLexer.lex_arg_quotedc                 C   sf   | j }| |}| j }|| _ | |}|d urb||krFtd||f | j |krbtd| j |f |S )NzFast path failure: %r != %r)r	   r&   r5   
ValueError)r   r   r	   resr   	referencer   r   r   lex_arg_checked   s    


zShLexer.lex_arg_checkedc                 C   s   |  |p| |S r   )r&   r5   r   r   r   r   lex_arg   s    zShLexer.lex_argc                 C   s   |   }|dkr|fS |dkr2| dr,dS |fS |dkr\| drHdS | drVdS |fS |dkr| drrdS | drd	S |fS |d
kr| drdS | drdS |fS | |S )z2
        lex_one_token - Lex a single 'sh' token. r    r   )||r   )&&r   )z&>)z>&)z>>r   )z<&)z<<)r   r   r<   r   r   r   r   r,      s4    






zShLexer.lex_one_tokenc                 c   s2   | j | jkr.|   r"|   q |  V  q d S r   )r	   r   r   r)   r   r,   r   r   r   r   lex   s    
zShLexer.lexN)F)__name__
__module____qualname__r   r   r   r   r&   r5   r(   r;   r<   r,   r?   r   r   r   r   r      s   
	; r   c                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )ShParserFc                 C   s"   || _ || _t||d | _d S )N)r   )r   pipefailr   r?   tokens)r   r   r   rD   r   r   r   r      s    zShParser.__init__c                 C   s   | j D ]
}|  S d S r   )rE   )r   itemr   r   r   r?      s    
zShParser.lexc                 C   s&   |   }|d ur"t|g| j| _|S r   )r?   	itertoolschainrE   )r   tokenr   r   r   r      s    zShParser.lookc                 C   s   |   }|stdt|tr.td|d  |g}g }|  }|d u rJqt|ttfrh||    q8t|tsvJ |d dv rq|   }|   }|std|d  |||f q8t||S )Nzempty command!z%syntax error near unexpected token %rr   )r   r    r   r=   r>   zsyntax error near token %r)	r?   r8   r-   r.   r   r2   r   appendr   )r   r4   argsZ	redirectsopargr   r   r   parse_command   s,    
zShParser.parse_commandc                 C   s@   d}|   g}|  dkr2|   ||    qt||| jS )NF)r   )rN   r   r?   rJ   r   rD   )r   negatecommandsr   r   r   parse_pipeline   s    
zShParser.parse_pipelinec                 C   sd   |   }|  r`|  }t|tr.t|dks2J |  sJtd|d  t||d |   }q|S )Nr   zmissing argument to operator %rr   )rQ   r   r?   r-   r.   r
   r8   r   )r   lhsoperatorr   r   r   parse   s    
zShParser.parseN)FF)	r@   rA   rB   r   r?   r   rN   rQ   rT   r   r   r   r   rC      s   
#	rC   )
__future__r   rG   Zlit.utilr/   Zlit.ShCommandsr   r   r   r   r   rC   r   r   r   r   <module>   s    7