a
    ãIþf…  ã                   @   sh   d Z ddlZddlZddlZg d¢ZG dd„ deƒZdddœdd	„Zdd
d„Zdd„ Z	e
dkrde	ƒ  dS )zImplementation of the UUencode and UUdecode functions.

encode(in_file, out_file [,name, mode], *, backtick=False)
decode(in_file [, out_file, mode, quiet])
é    N)ÚErrorÚencodeÚdecodec                   @   s   e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__© r   r   úlib/python3.9/uu.pyr   '   s   r   F©Úbacktickc             	   C   sz  g }zX| dkrt jj} n^t| tƒrx|du r8tj | ¡}|du rdzt | ¡j	}W n t
yb   Y n0 t| dƒ} | | ¡ |dkrŠt jj}nt|tƒr¨t|dƒ}| |¡ |du r´d}|du rÀd}| dd¡}| dd	¡}| d
|d@ |f  d¡¡ |  d¡}t|ƒdkr,| tj||d¡ |  d¡}qþ|r>| d¡ n
| d¡ W |D ]}| ¡  qNn|D ]}| ¡  qd0 dS )zUuencode fileú-NÚrbÚwbi¶  Ú
z\núz\rzbegin %o %s
iÿ  Úasciié-   r   r
   s   `
end
s    
end
)ÚsysÚstdinÚbufferÚ
isinstanceÚstrÚosÚpathÚbasenameÚstatÚst_modeÚAttributeErrorÚopenÚappendÚstdoutÚreplaceÚwriter   ÚreadÚlenÚbinasciiZb2a_uuÚclose)Úin_fileÚout_fileÚnameÚmoder   Úopened_filesÚdataÚfr   r   r	   r   *   sJ    








ÿr   c              
   C   s„  g }| dkrt jj} nt| tƒr4t| dƒ} | | ¡ z2|  ¡ }|sLtdƒ‚| 	d¡sXq8| 
dd¡}t|ƒdkr8|d dkr8zt|d	 d
ƒ W q¨W q8 ty¤   Y q80 q8|du r8|d  d¡ d¡}tj |¡ràtd|› ƒ‚| 	tj¡s(dtj› |v s(tjr8| 	tj¡s(dtj› |v r8td|› dƒ‚|du rPt|d	 d
ƒ}|dkrdt jj}n0t|tƒr”t|dƒ}t ||¡ |}| |¡ |  ¡ }|rD| d¡dkrDzt |¡}	W nl tjy, }
 zP|d d d@ d d d }t |d|… ¡}	|st j d|
 ¡ W Y d}
~
n
d}
~
0 0 | |	¡ |  ¡ }qœ|sRtdƒ‚W |D ]}| ¡  qXn|D ]}| ¡  qn0 dS )zDecode uuencoded filer   r   z'No valid begin line found in input files   beginó    é   é   r   é   é   Ns    	
r   z Cannot overwrite existing file: z..zRefusing to write to z due to directory traversalr   s   endé    é?   é   é   zWarning: %s
zTruncated input file)r   r   r   r   r   r   r   Úreadliner   Ú
startswithÚsplitr$   ÚintÚ
ValueErrorÚrstripr   r   r   ÚexistsÚsepÚaltsepr    ÚchmodÚstripr%   Za2b_uuÚstderrr"   r&   )r'   r(   r*   Úquietr+   ZhdrZ	hdrfieldsÚfpÚsr,   ÚvÚnbytesr-   r   r   r	   r   d   sv    





ÿþ
ýü




&

ÿr   c                  C   s4  ddl } | jdd}|jddddd	d
d |jddddd	d
d | ¡ \}}t|ƒdkrl| d¡ t d¡ tjj	}tj
j	}t|ƒdkr|d }t|ƒdkr¤|d }|jrì|jràt|tƒrÆt|dƒ}nttjd dƒ t d¡ t||ƒ nD|jr&t|tƒrt|dƒ}nttjd dƒ t d¡ t||ƒ dS )zuuencode/uudecode main programr   Nz'usage: %prog [-d] [-t] [input [output]])Zusagez-dz--decoder   zDecode (instead of encode)?FÚ
store_true)ÚdestÚhelpÚdefaultÚactionz-tz--textÚtextz2data is text, encoded format unix-compatible text?r/   zincorrect number of argumentsr1   r   z: cannot do -t to stdoutr   z: cannot do -t from stdin)ÚoptparseZOptionParserZ
add_optionÚ
parse_argsr$   Úerrorr   Úexitr   r   r    r   rM   r   r   r   ÚprintÚargvr   )rN   ÚparserZoptionsÚargsÚinputÚoutputr   r   r	   Útest®   s6    




rX   Ú__main__)NN)NNF)Ú__doc__r%   r   r   Ú__all__Ú	Exceptionr   r   r   rX   r   r   r   r   r	   Ú<module>   s   :
J&