U
    pdT                     @   s   d Z ddddgZdZdZdZdZzd	d
lmZmZ W n e	k
rP   dZdZY nX dd Z
dd ZdddZdddZdddZdddZdd Zdd Zdd Zedkre  dS ) zHConversions to/from quoted-printable transport encoding as per RFC 1521.encodedecodeencodestringdecodestring   =L   s   0123456789ABCDEF        )a2b_qpb2a_qpNc                 C   sH   t | tst| dkr|S | dkr&|S | tkpFd|   ko@dkn   S )zDecide whether a particular byte ordinal needs to be quoted.

    The 'quotetabs' flag indicates whether embedded tabs and spaces should be
    quoted.  Note that line-ending tabs and spaces are always encoded, as per
    RFC 1521.
        	   _       ~)
isinstancebytesAssertionErrorESCAPE)c	quotetabsheader r   /usr/lib/python3.8/quopri.pyneedsquoting   s    r   c                 C   sB   t | trt| dkstt| } ttt| d  t| d  f S )zQuote a single character.      )r   r   lenr   ordr   HEXr   r   r   r   quote$   s    r   Fc                 C   s2  t dk	r,|  }t |||d}|| dS |dfdd}d}|  }|sNqg }	d}
|dd dkrv|dd }d}
|D ]D}t|f}t|||rt|}|r|dkr|	d	 qz|	| qz|dk	r|| t	|	}t
|tkr||dtd
  dd |td
 d }q|}q>|dk	r.|||
d dS )av  Read 'input', apply quoted-printable encoding, and write to 'output'.

    'input' and 'output' are binary file objects. The 'quotetabs' flag
    indicates whether embedded tabs and spaces should be quoted. Note that
    line-ending tabs and spaces are always encoded, as per RFC 1521.
    The 'header' flag indicates whether we are encoding spaces as _ as per RFC
    1522.Nr   r      
c                 S   sj   | r<| dd  dkr<| | d d t| dd   |  n*| dkrX| t| |  n| | |  d S )Nr      .)writer   )soutputlineEndr   r   r   r$   ;   s
    (zencode.<locals>.writer   r"   r   r   r   s   =
)r'   )r
   readr$   readliner   r   r   appendEMPTYSTRINGjoinr   MAXLINESIZE)inputr&   r   r   dataodatar$   ZprevlinelineZoutlinestrippedr   Zthisliner   r   r   r   ,   s>    	




c                 C   sF   t d k	rt | ||dS ddlm} || }| }t|||| | S )Nr    r   BytesIO)r
   ior4   r   getvalue)r%   r   r   r4   infpoutfpr   r   r   r   j   s    c                 C   s  t dk	r*|  }t ||d}|| dS d}|  }|s>qdt| }}|dkr||d | dkrd}	|d }|dkr||d | dkr|d }qtnd}	||k r|||d  }
|
dkr|r|d	 }|d }q|
tkr||
 }|d }q|d |kr|	sd}	qq|d |k rJ||d |d
  tkrJ|t }|d
 }q|d
 |k rt||d |d
  rt||d
 |d  r|tt||d |d  f }|d }q||
 }|d }q|	s.||d  d}q.|r|| dS )zRead 'input', apply quoted-printable decoding, and write to 'output'.
    'input' and 'output' are binary file objects.
    If 'header' is true, decode underscore as space (per RFC 1522).Nr   r   r   r   r!   s    	r   r         )	r	   r(   r$   r)   r   r   ishexr   unhex)r.   r&   r   r/   r0   newr1   inpartialr   r   r   r   r   u   sP    
  
 
 
 ( 
B" 
 
c                 C   sD   t d k	rt | |dS ddlm} || }| }t|||d | S )Nr9   r   r3   )r	   r5   r4   r   r6   )r%   r   r4   r7   r8   r   r   r   r      s    c                 C   sV   t | tstd|   ko dkn  pTd|   ko8dkn  pTd|   koPdkS   S )zDReturn true if the byte ordinal 'c' is a hexadecimal digit in ASCII.   0   9   a   f   A   F)r   r   r   r   r   r   r   r<      s    r<   c                 C   s   d}| D ]}t |f}d|  kr*dkr8n n
td}n`d|  krLdkr^n ntdd }n:d	|  krrd
krn ntd	d }ndstdt| |d t||  }q|S )z.Get the integer value of a hexadecimal number.r   rB   rC   0rD   rE   a
   rF   rG   Fznon-hex digit r   )r   r   r   repr)r%   bitsr   r?   r   r   r   r=      s    

r=   c                  C   s  dd l } dd l}z|| jdd  d\}}W nV |jk
r } z6| j| _t| td td td | d W 5 d }~X Y nX d}d}|D ] \}}|dkrd}|d	krd}q|r|r| j| _td
 | d |sdg}d}	|D ]}
|
dkr| jj	}nTzt
|
d}W nD tk
rP } z$| jd|
|f  d}	W Y qW 5 d }~X Y nX z*|rjt|| jj	 nt|| jj	| W 5 |
dkr|  X q|	r| |	 d S )Nr   r   Ztdz"usage: quopri [-t | -d] [file] ...z-t: quote tabsz-d: decode; default encoder:   z-tz-dz -t and -d are mutually exclusive-rbz%s: can't open (%s)
)sysgetoptargverrorstderrstdoutprintexitstdinbufferopenOSErrorr$   closer   r   )rO   rP   ZoptsargsmsgZdecoZtabsorI   stsfilefpr   r   r   main   sT      
 

rb   __main__)F)FF)F)F)__doc____all__r   r-   r   r+   Zbinasciir	   r
   ImportErrorr   r   r   r   r   r   r<   r=   rb   __name__r   r   r   r   <module>   s*   

>

+
.