U
    e-                     @   sN  d dl mZ d dlZd dlZejd  dkrDeeeef\ZZ	Z
ZdZneeeef\ZZ	Z
ZdZe
 Ze ZejZG dd deZG dd	 d	eZG d
d deZG dd deZdd Zdd ZG dd de
Zdd Zdd Zdd Zddddddd d!jZd"e e!ee"d# Z#d$d% Z$d&d' Z%e% Z&d(d) Z'd*d+ Z(d1d-d.Z)d/d0 Z*dS )2    )absolute_importN   TFc                   @   sT   e Zd ZdZdd Zdd Zejdkr0dd Znd	d Zd
d Z	dd Z
dd ZdS )UnicodeLiteralBuilderzAssemble a unicode string.
    c                 C   s
   g | _ d S N)charsself r	   B/tmp/pip-unpacked-wheel-7k3cqui1/Cython/Compiler/StringEncoding.py__init__   s    zUnicodeLiteralBuilder.__init__c                 C   s>   t |tr|d}t |ts.ttt|| j| d S )NASCII)	
isinstance_bytesdecode_unicodeAssertionErrorstrtyper   appendr   
charactersr	   r	   r
   r      s    

zUnicodeLiteralBuilder.append  c                 C   sV   |dkrB|d8 }| j t|d d  | j t|d d  n| j t| d S )Nr               r   r   _unichrr   char_numberr	   r	   r
   append_charval%   s
    z$UnicodeLiteralBuilder.append_charvalc                 C   s   | j t| d S r   r   r   r	   r	   r
   r    /   s    c                 C   s   |  | d S r   )r    r   r   Zescape_stringr	   r	   r
   append_uescape2   s    z$UnicodeLiteralBuilder.append_uescapec                 C   s   t d| jS )N )EncodedStringjoinr   r   r	   r	   r
   	getstring5   s    zUnicodeLiteralBuilder.getstringc                 C   s   d |   fS r   r&   r   r	   r	   r
   
getstrings8   s    z UnicodeLiteralBuilder.getstringsN)__name__
__module____qualname____doc__r   r   sys
maxunicoder    r"   r&   r(   r	   r	   r	   r
   r      s   


r   c                   @   sH   e Zd Z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 )BytesLiteralBuilderz*Assemble a byte string or char value.
    c                 C   s   g | _ || _d S r   )r   target_encodingr   r0   r	   r	   r
   r   ?   s    zBytesLiteralBuilder.__init__c                 C   s@   t |tr|| j}t |ts0ttt|| j	| d S r   )
r   r   encoder0   r   r   r   r   r   r   r   r	   r	   r
   r   C   s    
zBytesLiteralBuilder.appendc                 C   s   | j t|d d S N
ISO-8859-1)r   r   r   r2   r   r	   r	   r
   r    I   s    z"BytesLiteralBuilder.append_charvalc                 C   s   |  | d S r   )r   r!   r	   r	   r
   r"   L   s    z"BytesLiteralBuilder.append_uescapec                 C   s   t t| j| jS r   )bytes_literal
join_bytesr   r0   r   r	   r	   r
   r&   O   s    zBytesLiteralBuilder.getstringc                 C   s   |   S r   r'   r   r	   r	   r
   getcharS   s    zBytesLiteralBuilder.getcharc                 C   s   |   d fS r   r'   r   r	   r	   r
   r(   W   s    zBytesLiteralBuilder.getstringsN)r)   r*   r+   r,   r   r   r    r"   r&   r7   r(   r	   r	   r	   r
   r/   <   s   r/   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )StrLiteralBuilderzDAssemble both a bytes and a unicode representation of a string.
    c                 C   s   t || _t | _d S r   )r/   r   r   r   r1   r	   r	   r
   r   ^   s    
zStrLiteralBuilder.__init__c                 C   s   | j | | j| d S r   )r   r   r   r   r	   r	   r
   r   b   s    zStrLiteralBuilder.appendc                 C   s   | j | | j| d S r   )r   r    r   r   r	   r	   r
   r    f   s    z StrLiteralBuilder.append_charvalc                 C   s   | j | | j| d S r   )r   r   r   r    r!   r	   r	   r
   r"   j   s    z StrLiteralBuilder.append_uescapec                 C   s   | j  | j fS r   )r   r&   r   r   r	   r	   r
   r(   n   s    zStrLiteralBuilder.getstringsN)	r)   r*   r+   r,   r   r   r    r"   r(   r	   r	   r	   r
   r8   [   s   r8   c                   @   s^   e Zd ZdZdd Zdd Zdd Zedd	 Zd
d Z	dd Z
dd ZeedsZdd ZdS )r$   Nc                 C   s   | S r   r	   r   memor	   r	   r
   __deepcopy__x   s    zEncodedString.__deepcopy__c                 C   s   | j d k	st| | j S r   encodingr   r2   r   r	   r	   r
   
byteencode{   s    zEncodedString.byteencodec                 C   s   | j d kst| dS )NzUTF-8r<   r   r	   r	   r
   
utf8encode   s    zEncodedString.utf8encodec                 C   s
   | j d kS r   )r=   r   r	   r	   r
   
is_unicode   s    zEncodedString.is_unicodec                 C   s   t | S r   )string_contains_surrogatesr   r	   r	   r
   contains_surrogates   s    z!EncodedString.contains_surrogatesc                 C   s   t |  dS )Nutf8)r5   r?   r   r	   r	   r
   as_utf8_string   s    zEncodedString.as_utf8_stringc                 C   s,   | j d kr|  }nt|  | j }| S r   )r=   rD   r5   r>   as_c_string_literal)r   sr	   r	   r
   rE      s    

z!EncodedString.as_c_string_literalisasciic                 C   s.   z|  d W n tk
r$   Y dS X dS d S )NasciiFT)r2   UnicodeEncodeErrorr   r	   r	   r
   rG      s
    zEncodedString.isascii)r)   r*   r+   r=   r;   r>   r?   propertyr@   rB   rD   rE   hasattrr   rG   r	   r	   r	   r
   r$   r   s   

r$   c                 C   s@   t t| D ]0}|dkr dS d|  kr0dkr
n q
 dS q
dS )z
    Check if the unicode string contains surrogate code points
    on a CPython platform with wide (UCS-4) or narrow (UTF-16)
    Unicode, i.e. characters that would be spelled as two
    separate code units on a narrow platform.
    r   Tr     F)mapord)ustringcr	   r	   r
   rA      s    rA   c                 C   sn   d}t jdk}tt| D ]P}|dk s,|dkr8|rh dS q|sB dS |dkrZ|rT dS d}q|sd dS d}q|S )a  
    Check if the unicode string contains lone surrogate code points
    on a CPython platform with wide (UCS-4) or narrow (UTF-16)
    Unicode, i.e. characters that would be spelled as two
    separate code units on a narrow platform, but that do not form a pair.
    Fr   r   rL   T  )r-   r.   rM   rN   )rO   Zlast_was_startZunicode_uses_surrogate_encodingrP   r	   r	   r
   string_contains_lone_surrogates   s     
rR   c                   @   sN   e Zd ZdZdd Zdd Zdd Zdd	 Zd
Zdd Z	e
edsJdd ZdS )BytesLiteralNc                 C   s   | S r   r	   r9   r	   r	   r
   r;      s    zBytesLiteral.__deepcopy__c                 C   s    t rt| S | ddS d S r3   )
IS_PYTHON3r   r   r2   r   r	   r	   r
   r>      s    zBytesLiteral.byteencodec                 C   s   dst d|  d S )NFz this is not a unicode string: %r)r   r   r	   r	   r
   r?      s    zBytesLiteral.utf8encodec                 C   s
   |  dS )zcFake-decode the byte string to unicode to support %
        formatting of unicode strings.
        r4   )r   r   r	   r	   r
   __str__   s    zBytesLiteral.__str__Fc                 C   s   t t| }d| S )Nz"%s")split_string_literalescape_byte_string)r   valuer	   r	   r
   rE      s    z BytesLiteral.as_c_string_literalrG   c                 C   s   dS )NTr	   r   r	   r	   r
   rG      s    zBytesLiteral.isascii)r)   r*   r+   r=   r;   r>   r?   rU   r@   rE   rK   r   rG   r	   r	   r	   r
   rS      s   
rS   c                 C   s    t | tstt| } || _| S r   )r   bytesr   rS   r=   rF   r=   r	   r	   r
   r5      s    r5   c                 C   s,   t | ttfstt| } |d k	r(|| _| S r   )r   r   rY   r   r$   r=   rZ   r	   r	   r
   encoded_string   s
    r[   c                 C   s"   t | trt| |S t| |S d S r   )r   rY   r5   r[   rZ   r	   r	   r
   encoded_string_or_bytes_literal   s    

r\   
	)z\az\bz\fz\nz\rz\tz\v)\z??"    c                 C   sH   | dkrt | dd S | dkr$dS | dkr0dS dd	d
 | D S d S )Nz
	   re   z\"rd   \\r#   c                 S   s   g | ]}d t | qS )z\%03o)rN   .0rP   r	   r	   r
   
<listcomp>  s     z'_to_escape_sequence.<locals>.<listcomp>)reprr%   rF   r	   r	   r
   _to_escape_sequence  s    ro   c                     s   g } i t D ]:}ddd |D }| | t|d|d< qtdd|  djfdd  fd	d
}|S )Nr#   c                 S   s   g | ]}d | dd qS )z[%s]rd   ri   )replacerj   r	   r	   r
   rl      s     z,_build_specials_replacer.<locals>.<listcomp>r   z(%s)|c                    s    |  d S )Nrg   )group)m)replacementsr	   r
   replace_specials$  s    z2_build_specials_replacer.<locals>.replace_specialsc                    s
    | S r   r	   rn   )ru   subr	   r
   rp   &  s    z)_build_specials_replacer.<locals>.replace)
_c_specialr%   r   ro   r2   recompilerv   )Zsubexpsspecialregexprp   r	   )ru   rt   rv   r
   _build_specials_replacer  s    
r|   c                 C   sZ   t r| d} | dkr&t| dd S | dkr2dS t| }|dk sJ|dkrRd	| S | S d S )
Nr4   z
	\rg   rh   'z\'rf      z\x%02X)rT   r   rm   rN   )rP   nr	   r	   r
   escape_char-  s    
r   c                 C   s   t | } z| dW S  tk
r(   Y nX trzt }|j|j }}| D ](}|dkrf|d| d qF|| qF|dS g }|j}| D ]*}t|}|dkr|d|  q|| qt	|dS dS )zEscape a byte string so that it can be written into C code.
    Note that this returns a Unicode string instead which, when
    encoded as ISO-8859-1, will result in the correct byte sequence
    being written.
    r      z\%3or4   N)
_replace_specialsr   UnicodeDecodeErrorrT   	bytearrayr   extendr2   rN   r6   )rF   Zs_newr   r   blrP   or	   r	   r
   rW   ;  s*    


rW     c                 C   s   t | |k r| S d}g }|t | k r|| }t | |d krd| |d | kr|d| |d | d 8 }| |d  dkr|d8 }||krn|| |d  d }qqn|| ||  |}qd|S d S )Nr      rd   rg      z"")lenfindr   r%   )rF   limitstartchunksendr	   r	   r
   rV   Z  s     $rV   c                 C   s&  t tt| dg } tjdkrvg |  }}| D ]F}|dkrht|d d\}}||d  ||d  q,|| q,n| g  }}| D ]r}d|  krdkrn nL|rd|d   krdkrn n,|d | }}|d	@ d
> |d	@  d |d< q|| q||krg }dtt|dtt|fS )zBCreate Py_UNICODE[] representation of a given unicode string.
    r   r   r   r   r   rL   rh   rQ   i  
   ,)	listrM   rN   r-   r.   divmodr   r%   r   )rF   utf16utf32
code_pointhighlowZ	code_unitr	   r	   r
   encode_pyunicode_stringo  s$    


8
r   )r   )+
__future__r   rx   r-   version_infor   rY   chrr   _strr   r   rT   unicodeunichrZempty_bytesZempty_unicoder%   r6   objectr   r/   r8   r$   rA   rR   rS   r5   r[   r\   getZchar_from_escape_sequencetuplerM   rangerw   ro   r|   r   r   rW   rV   r   r	   r	   r	   r
   <module>   sH   %.#

