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_importN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 r5   r6   r+   r   r   r   resetA      
zIncrementalEncoder.resetc                 C   s   | j S Nr8   r9   r   r   r   getstateD   s   zIncrementalEncoder.getstatec                 C   s
   || _ d S r<   r8   )r+   r6   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})
r6   upper	HEXDIGITSindexappendr   UnicodeErrorr   r   r   )r+   r   finalr6   encodedczr   r   r   r,   J   s$   


zIncrementalEncoder.encodeNr0   F)	r1   r2   r3   __doc__r7   r:   r=   r>   r,   r   r   r   r   r4   :   s    
r4   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   rH   r   r   r   r/   g   s   zIncrementalDecoder.decodeNrL   )r1   r2   r3   rM   r/   r   r   r   r   rN   e   s    rN   c                   @      e Zd ZdZdS )StreamWriterz-Combination of hexlify codec and StreamWriterNr1   r2   r3   rM   r   r   r   r   rP   k       rP   c                   @   rO   )StreamReaderz-Combination of hexlify codec and StreamReaderNrQ   r   r   r   r   rS   o   rR   rS   c                	   C   s   t jdttttttdS )zencodings module APIhexlify)namer,   r/   incrementalencoderincrementaldecoderstreamwriterstreamreader)codecs	CodecInfor   r(   r4   rN   rP   rS   r   r   r   r   getregentrys   s   r\   r0   )rM   
__future__r   rZ   r   r%   	NameErrorAttributeErrorstrrD   r   r(   r)   r4   rN   rP   rS   r\   r   r   r   r   <module>   s$   


+