o
    ^]                  	   @   s   d Z ddlmZ ddlZddlZze W n eefy!   eZY nw dZ	dddZ
ddd	ZG d
d dejZG dd dejZG dd dejZG dd deejZG dd deejZdd ZdS )aL  Python 'hex' Codec - 2-digit hex with spaces content transfer encoding.

Encode and decode may be a bit missleading at first sight...

The textual representation is a hex dump: e.g. "40 41"
The "encoded" data of this is the binary form, e.g. b"@A"

Therefore decoding is binary to text and thus converting binary data to hex dump.

    )absolute_importNZ0123456789ABCDEFstrictc                 C   s    t dd |  D t| fS )'40 41 42' -> b'@ab'c                 S      g | ]}t |d qS    int.0h r   </usr/lib/python3/dist-packages/serial/tools/hexlify_codec.py
<listcomp>(       zhex_encode.<locals>.<listcomp>)serialto_bytessplitlendataerrorsr   r   r   
hex_encode&   s    r   c                 C   s&   t ddd t| D t| fS )b'@ab' -> '40 41 42' c                 s       | ]
}d  t|V  qdS z{:02X} Nformatordr   br   r   r   	<genexpr>-       zhex_decode.<locals>.<genexpr>)unicodejoinr   	iterbytesr   r   r   r   r   
hex_decode+   s   &r'   c                   @   s    e Zd ZdddZdddZdS )Codecr   c                 C   s   t dd | D S )r   c                 S   r   r   r   r
   r   r   r   r   3   r   z Codec.encode.<locals>.<listcomp>)r   r   r   selfr   r   r   r   r   encode1   s   zCodec.encodec                 C      t ddd t|D S )r   r   c                 s   r   r   r   r    r   r   r   r"   7   r#   zCodec.decode.<locals>.<genexpr>r$   r%   r   r&   r)   r   r   r   decode5   s   zCodec.decodeNr   )__name__
__module____qualname__r+   r.   r   r   r   r   r(   0   s    
r(   c                   @   s<   e Zd ZdZdddZdd Zdd Zd	d
 ZdddZdS )IncrementalEncoderzIncremental hex encoderr   c                 C   s   || _ d| _d S Nr   )r   state)r*   r   r   r   r   __init__=   s   
zIncrementalEncoder.__init__c                 C   s
   d| _ d S r4   r5   r*   r   r   r   resetA      
zIncrementalEncoder.resetc                 C   s   | j S Nr7   r8   r   r   r   getstateD   s   zIncrementalEncoder.getstatec                 C   s
   || _ d S r;   r7   )r*   r5   r   r   r   setstateG   r:   zIncrementalEncoder.setstateFc                 C   s   | j }g }| D ]>}|tv r)t|}|r"|||d@   d}q	d|d>  }q	|dkr;|r8| jdkr8tdd}q	| jdkrGtd|q	|| _ t	|S )	z        Incremental encode, keep track of digits and emit a byte when a pair
        of hex digits is found. The space is optional unless the error
        handling is defined to be 'strict'.
           r          r   zodd number of hex digitsznon-hex digit found: {!r})
r5   upper	HEXDIGITSindexappendr   UnicodeErrorr   r   r   )r*   r   finalr5   Zencodedczr   r   r   r+   J   s$   


zIncrementalEncoder.encodeNr/   F)	r0   r1   r2   __doc__r6   r9   r<   r=   r+   r   r   r   r   r3   :   s    
r3   c                   @   s   e Zd ZdZdddZdS )IncrementalDecoderzIncremental decoderFc                 C   r,   )Nr   c                 s   r   r   r   r    r   r   r   r"   h   r#   z,IncrementalDecoder.decode.<locals>.<genexpr>r-   )r*   r   rG   r   r   r   r.   g   s   zIncrementalDecoder.decodeNrJ   )r0   r1   r2   rK   r.   r   r   r   r   rL   e   s    rL   c                   @      e Zd ZdZdS )StreamWriterz-Combination of hexlify codec and StreamWriterNr0   r1   r2   rK   r   r   r   r   rN   k       rN   c                   @   rM   )StreamReaderz-Combination of hexlify codec and StreamReaderNrO   r   r   r   r   rQ   o   rP   rQ   c                	   C   s   t jdttttttdS )zencodings module APIZhexlify)namer+   r.   incrementalencoderincrementaldecoderstreamwriterstreamreader)codecs	CodecInfor   r'   r3   rL   rN   rQ   r   r   r   r   getregentrys   s   rY   r/   )rK   Z
__future__r   rW   r   r$   	NameErrorAttributeErrorstrrC   r   r'   r(   r3   rL   rN   rQ   rY   r   r   r   r   <module>   s$   


+