B
    ž†\Q&  ã               @   s>  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G dd„ de
ƒ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&d-d)d*„Z'd+d,„ Z(dS ).é    )Ú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   ú=lib/python3.7/site-packages/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.appendiÿÿ  c             C   sV   |dkrB|d8 }| j  t|d d ƒ¡ | j  t|d d ƒ¡ n| j  t|ƒ¡ d S )Niÿÿ  i   i   i Ø  i Ü  )r   r   Ú_unichr)r   Úchar_numberr   r   r   Úappend_charval%   s
    z$UnicodeLiteralBuilder.append_charvalc             C   s   | j  t|ƒ¡ d S )N)r   r   r   )r   r   r   r   r   r   /   s    c             C   s   |   |¡ d S )N)r   )r   r   Ú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 )N)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 )N)r   Útarget_encoding)r   r%   r   r   r   r	   ?   s    zBytesLiteralBuilder.__init__c             C   s@   t |tƒr| | j¡}t |tƒs0ttt|ƒƒƒ‚| j 	|¡ d S )N)
r   r   Úencoder%   r   r   r   r   r   r   )r   r   r   r   r   r   C   s    
zBytesLiteralBuilder.appendc             C   s   | j  t|ƒ d¡¡ d S )Nz
ISO-8859-1)r   r   r   r&   )r   r   r   r   r   r   I   s    z"BytesLiteralBuilder.append_charvalc             C   s   |   |¡ d S )N)r   )r   r   r   r   r   r   r   L   s    z"BytesLiteralBuilder.append_uescapec             C   s   t t| jƒ| jƒS )N)Úbytes_literalÚ
join_bytesr   r%   )r   r   r   r   r   O   s    zBytesLiteralBuilder.getstringc             C   s   |   ¡ S )N)r   )r   r   r   r   ÚgetcharS   s    zBytesLiteralBuilder.getcharc             C   s   |   ¡ d fS )N)r   )r   r   r   r   r   W   s    zBytesLiteralBuilder.getstringsN)r   r   r    r!   r	   r   r   r   r   r)   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 )N)r$   r   r   r   )r   r%   r   r   r   r	   ^   s    
zStrLiteralBuilder.__init__c             C   s   | j  |¡ | j |¡ d S )N)r   r   r   )r   r   r   r   r   r   b   s    zStrLiteralBuilder.appendc             C   s   | j  |¡ | j |¡ d S )N)r   r   r   )r   r   r   r   r   r   f   s    z StrLiteralBuilder.append_charvalc             C   s   | j  |¡ | j |¡ d S )N)r   r   r   r   )r   r   r   r   r   r   r   j   s    z StrLiteralBuilder.append_uescapec             C   s   | j  ¡ | j ¡ fS )N)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   r*   [   s   r*   c               @   sD   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S )r   Nc             C   s   | S )Nr   )r   Úmemor   r   r   Ú__deepcopy__x   s    zEncodedString.__deepcopy__c             C   s   | j d k	st‚|  | j ¡S )N)Úencodingr   r&   )r   r   r   r   Ú
byteencode{   s    zEncodedString.byteencodec             C   s   | j d kst‚|  d¡S )NzUTF-8)r-   r   r&   )r   r   r   r   Ú
utf8encode   s    zEncodedString.utf8encodec             C   s
   | j d kS )N)r-   )r   r   r   r   Ú
is_unicodeƒ   s    zEncodedString.is_unicodec             C   s   t | ƒS )N)Ústring_contains_surrogates)r   r   r   r   Úcontains_surrogates‡   s    z!EncodedString.contains_surrogatesc             C   s   t |  ¡ dƒS )NÚutf8)r'   r/   )r   r   r   r   Úas_utf8_stringŠ   s    zEncodedString.as_utf8_string)r   r   r    r-   r,   r.   r/   Úpropertyr0   r2   r4   r   r   r   r   r   r   s   r   c             C   s@   x:t t| ƒD ],}|dkrdS d|  kr0dkrn qdS qW 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.
    iÿÿ  Ti Ø  iÿß  F)ÚmapÚord)ZustringÚcr   r   r   r1   Ž   s    r1   c               @   s<   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
Zdd„ Z	dS )ÚBytesLiteralNc             C   s   | S )Nr   )r   r+   r   r   r   r,   ¡   s    zBytesLiteral.__deepcopy__c             C   s    t rt| ƒS |  d¡ d¡S d S )Nz
ISO-8859-1)Ú
IS_PYTHON3r   r   r&   )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.
        z
ISO-8859-1)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   Úas_c_string_literal¶   s    z BytesLiteral.as_c_string_literal)
r   r   r    r-   r,   r.   r/   r;   r0   r?   r   r   r   r   r9      s   r9   c             C   s    t | tƒst‚t| ƒ} || _| S )N)r   Úbytesr   r9   r-   )Úsr-   r   r   r   r'   »   s    r'   c             C   s,   t | ttfƒst‚t| ƒ} |d k	r(|| _| S )N)r   r   r@   r   r   r-   )rA   r-   r   r   r   Úencoded_stringÂ   s
    rB   úúúÚ
úú	ú)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
	é   éÿÿÿÿrK   z\"rJ   z\\r   c             S   s   g | ]}d t |ƒ ‘qS )z\%03o)r7   )Ú.0r8   r   r   r   ú
<listcomp>à   s    z'_to_escape_sequence.<locals>.<listcomp>)Úreprr   )rA   r   r   r   Ú_to_escape_sequence×   s    rR   c                 s†   g } i ‰xBt D ]:}d dd„ |D ƒ¡}|  |¡ t|ƒ d¡ˆ| d¡< qW t dd | ¡  d¡¡j‰‡fdd„‰ ‡ ‡fd	d
„}|S )Nr   c             S   s   g | ]}d |  dd¡ ‘qS )z[%s]rJ   z\\)Úreplace)rO   r8   r   r   r   rP   ç   s    z,_build_specials_replacer.<locals>.<listcomp>r
   z(%s)ú|c                s   ˆ |   d¡ S )NrM   )Úgroup)Úm)Úreplacementsr   r   Úreplace_specialsë   s    z2_build_specials_replacer.<locals>.replace_specialsc                s
   ˆˆ | ƒS )Nr   )rA   )rX   Úsubr   r   rS   í   s    z)_build_specials_replacer.<locals>.replace)Ú
_c_specialr   r   rR   r&   ÚreÚcompilerY   )ZsubexpsZspecialZregexprS   r   )rX   rW   rY   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 )
Nz
ISO-8859-1z
	\rM   rN   ú'z\'rL   é   z\x%02X)r:   r   rQ   r7   )r8   Únr   r   r   Úescape_charô   s    
ra   c             C   sÌ   t | ƒ} y
|  d¡S  tk
r&   Y nX tr|tƒ }|j|j }}x0| D ](}|dkrf|d|  d¡ƒ qF||ƒ qFW | d¡S g }|j}x2| D ]*}t|ƒ}|dkr®|d| ƒ qŒ||ƒ qŒW t	|ƒ d¡S dS )z×Escape 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\%3oz
ISO-8859-1N)
Ú_replace_specialsr   ÚUnicodeDecodeErrorr:   Ú	bytearrayr   Úextendr&   r7   r(   )rA   Zs_newr   rf   ÚbÚlr8   Úor   r   r   r=     s*    



r=   éÐ  c             C   sÔ   t | ƒ|k r| S d}g }x¬|t | ƒk rÄ|| }t | ƒ|d kr¬d| |d |… kr¬|d| |d |…  d¡ 8 }x:| |d  dkrª|d8 }||krr|| |d  d }P qrW | | ||… ¡ |}qW d |¡S d S )Nr   é   rJ   rM   é   z"")ÚlenÚfindr   r   )rA   ÚlimitÚstartZchunksÚendr   r   r   r<   !  s     $r<   c             C   s.  t tt| ƒƒdg } tjdkrzg |  }}xÖ| D ]F}|dkrjt|d dƒ\}}| |d ¡ | |d ¡ q.| |¡ q.W n†| g  }}xz| D ]r}d|  kr¢dkròn nL|ròd|d   krÂdkròn n,|d | }}|d	@ d
> |d	@  d |d< qŠ| |¡ qŠW ||krg }d tt|ƒ¡d tt|ƒ¡fS )zBCreate Py_UNICODE[] representation of a given unicode string.
    r   i   i   i Ø  i Ü  iÿß  rN   iÿÛ  iÿ  é
   ú,)	Úlistr6   r7   r"   r#   Údivmodr   r   r   )rA   Úutf16Úutf32Z
code_pointZhighZlowZ	code_unitr   r   r   Úencode_pyunicode_string6  s$    




8
rx   )rj   ))Z
__future__r   r[   r"   Úversion_infor   r@   Úchrr   Ú_strr   r   r:   ZunicodeZunichrZempty_bytesZempty_unicoder   r(   Úobjectr   r$   r*   r   r1   r9   r'   rB   ÚgetZchar_from_escape_sequenceÚtupler6   ÚrangerZ   rR   r]   rc   ra   r=   r<   rx   r   r   r   r   Ú<module>   sB   %	

