B
    \ Çc‚6  ã               @   sÞ   d Z ddlZddlZddlZddlZdddgZG dd„ deƒZdZdZ	dZ
d	Zd
ZG dd„ dƒZdd„ ZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZdd„ ZG dd„ dƒZG dd„ dƒZG dd„ dƒZdd„ ZdS )z‰Macintosh binhex compression/decompression.

easy interface:
binhex(inputfilename, outputfilename)
hexbin(inputfilename, outputfilename)
é    NÚbinhexÚhexbinÚErrorc               @   s   e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__© r   r   úlib/python3.7/binhex.pyr      s   é   i €  é@   ó   c               @   s   e Zd Zdd„ ZdS )ÚFInfoc             C   s   d| _ d| _d| _d S )Nz????r   )ÚTypeÚCreatorÚFlags)Úselfr   r   r	   Ú__init__0   s    zFInfo.__init__N)r   r   r   r   r   r   r   r	   r   /   s   r   c          	   C   st   t ƒ }t | d¡2}| d¡}d|kr,d|_| dd¡ | ¡ }W d Q R X tj 	| ¡\}}| 
ddd¡}|||dfS )	NÚrbi   r   ZTEXTé   ú:ú-r
   )r   ÚioÚopenÚreadr   ÚseekÚtellÚosÚpathÚsplitÚreplace)ÚnameÚfinfoÚfpÚdataZdsizeÚdirÚfiler   r   r	   Úgetfileinfo5   s    
r&   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Úopenrsrcc             G   s   d S )Nr   )r   Úargsr   r   r	   r   C   s    zopenrsrc.__init__c             G   s   dS )Nó    r   )r   r(   r   r   r	   r   F   s    zopenrsrc.readc             G   s   d S )Nr   )r   r(   r   r   r	   ÚwriteI   s    zopenrsrc.writec             C   s   d S )Nr   )r   r   r   r	   ÚcloseL   s    zopenrsrc.closeN)r   r   r   r   r   r*   r+   r   r   r   r	   r'   B   s   r'   c               @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú_Hqxcoderenginez(Write data to the coder in 3-byte chunksc             C   s    || _ d| _d| _td | _d S )Nr)   r
   )Úofpr#   ÚhqxdataÚLINELENÚlinelen)r   r-   r   r   r	   r   R   s    z_Hqxcoderengine.__init__c             C   sh   | j | | _ t| j ƒ}|d d }| j d |… }| j |d … | _ |sHd S | jt |¡ | _|  d¡ d S )Né   r   )r#   Úlenr.   ÚbinasciiÚb2a_hqxÚ_flush)r   r#   ZdatalenZtodor   r   r	   r*   X   s    
z_Hqxcoderengine.writec             C   sv   d}xF|t | jƒ| j krJ|| j }| j | j||… d ¡ t| _|}qW | j|d … | _|rr| j | jd ¡ d S )Nr   ó   
s   :
)r2   r.   r0   r-   r*   r/   )r   ZforceÚfirstZlastr   r   r	   r5   c   s    
z_Hqxcoderengine._flushc             C   s6   | j r| jt | j ¡ | _|  d¡ | j ¡  | `d S )Nr
   )r#   r.   r3   r4   r5   r-   r+   )r   r   r   r	   r+   n   s
    

z_Hqxcoderengine.closeN)r   r   r   Ú__doc__r   r*   r5   r+   r   r   r   r	   r,   O   s
   r,   c               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú_Rlecoderenginez4Write data to the RLE-coder in suitably large chunksc             C   s   || _ d| _d S )Nr)   )r-   r#   )r   r-   r   r   r	   r   x   s    z_Rlecoderengine.__init__c             C   s@   | j | | _ t| j ƒtk rd S t | j ¡}| j |¡ d| _ d S )Nr)   )r#   r2   ÚREASONABLY_LARGEr3   Úrlecode_hqxr-   r*   )r   r#   Úrledatar   r   r	   r*   |   s    z_Rlecoderengine.writec             C   s0   | j rt | j ¡}| j |¡ | j ¡  | `d S )N)r#   r3   r;   r-   r*   r+   )r   r<   r   r   r	   r+   „   s
    
z_Rlecoderengine.closeN)r   r   r   r8   r   r*   r+   r   r   r   r	   r9   u   s   r9   c               @   sL   e 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d„ Z
dS )ÚBinHexc       
      C   s    |\}}}}d}t |tƒr.|}t |d¡}d}yR| d¡ t|ƒ}	t|	ƒ| _d| _|d kr`t	ƒ }|| _
|| _|  ||¡ t| _W n   |r”| ¡  ‚ Y nX d S )NFÚwbTs0   (This file must be converted with BinHex 4.0):r   )Ú
isinstanceÚstrr   r   r*   r,   r9   r-   Úcrcr   ÚdlenÚrlenÚ
_writeinfoÚ_DID_HEADERÚstater+   )
r   Zname_finfo_dlen_rlenr-   r    r!   rB   rC   Zclose_on_errorZofnameZhqxerr   r   r	   r   Œ   s*    



zBinHex.__init__c             C   s´   t |ƒ}|dkrtdƒ‚t|gƒ| d¡ d }|j|j }}t|tƒrR| d¡}t|tƒrf| d¡}|| }t 	d|j
¡}t 	d| j| j¡}	|| | |	 }
|  |
¡ |  ¡  d S )Né?   zFilename too longzlatin-1ó    z>hz>ii)r2   r   ÚbytesÚencoder   r   r?   r@   ÚstructÚpackr   rB   rC   Ú_writeÚ	_writecrc)r   r    r!   ÚnlÚdÚtpZcrZd2Zd3Zd4Úinfor   r   r	   rD   £   s    




zBinHex._writeinfoc             C   s    t  || j¡| _| j |¡ d S )N)r3   Úcrc_hqxrA   r-   r*   )r   r#   r   r   r	   rM   ¶   s    zBinHex._writec             C   s4   | j dk rd}nd}| j t || j ¡¡ d| _ d S )Nr   z>hz>H)rA   r-   r*   rK   rL   )r   Zfmtr   r   r	   rN   º   s
    
zBinHex._writecrcc             C   s0   | j tkrtdƒ‚| jt|ƒ | _|  |¡ d S )NzWriting data at the wrong time)rF   rE   r   rB   r2   rM   )r   r#   r   r   r	   r*   Ä   s    
zBinHex.writec             C   s,   | j dkrtd| jf ƒ‚|  ¡  t| _d S )Nr   zIncorrect data size, diff=%r)rB   r   rC   rN   Ú	_DID_DATArF   )r   r   r   r	   Ú
close_dataÊ   s    
zBinHex.close_datac             C   sB   | j tk r|  ¡  | j tkr$tdƒ‚| jt|ƒ | _|  |¡ d S )Nz'Writing resource data at the wrong time)rF   rT   rU   r   rC   r2   rM   )r   r#   r   r   r	   Ú
write_rsrcÐ   s    

zBinHex.write_rsrcc             C   sx   | j d krd S zJ| j tk r"|  ¡  | j tkr4tdƒ‚| jdkrNtd| jf ƒ‚|  ¡  W d d | _ | j}| `| ¡  X d S )NzClose at the wrong timer   z$Incorrect resource-datasize, diff=%r)rF   rT   rU   r   rC   rN   r-   r+   )r   r-   r   r   r	   r+   Ø   s    



zBinHex.closeN)r   r   r   r   rD   rM   rN   r*   rU   rV   r+   r   r   r   r	   r=   ‹   s   
r=   c          	   C   s   t | ƒ}t||ƒ}t | d¡.}x| d¡}|s2P | |¡ q"W | ¡  W dQ R X t| dƒ}x| d¡}|snP | |¡ q^W | 	¡  | 	¡  dS )zEbinhex(infilename, outfilename): create binhex-encoded copy of a filer   i ô N)
r&   r=   r   r   r   r*   rU   r'   rV   r+   )ÚinpÚoutr!   r-   ÚifprP   r   r   r	   r   é   s"    

 

 c               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú_Hqxdecoderenginez*Read data via the decoder in 4-byte chunksc             C   s   || _ d| _d S )Nr   )rY   Úeof)r   rY   r   r   r	   r     s    z_Hqxdecoderengine.__init__c             C   sº   d}|}x¬|dkr´| j r|S |d d d }| j |¡}xRyt |¡\}| _ P W n tjk
rf   Y nX | j d¡}|s€tdƒ‚|| }q:W || }|t|ƒ }|s
| j s
tdƒ‚q
W |S )z&Read at least wtd bytes (or until EOF)r)   r   r   r1   é   r
   zPremature EOF on binhex file)r[   rY   r   r3   Za2b_hqxZ
Incompleter   r2   )r   ZtotalwtdZdecdataÚwtdr#   Z
decdatacurÚnewdatar   r   r	   r     s,    
 
z_Hqxdecoderengine.readc             C   s   | j  ¡  d S )N)rY   r+   )r   r   r   r	   r+   %  s    z_Hqxdecoderengine.closeN)r   r   r   r8   r   r   r+   r   r   r   r	   rZ   þ   s    rZ   c               @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú_RledecoderenginezRead data via the RLE-coderc             C   s   || _ d| _d| _d| _d S )Nr)   r   )rY   Ú
pre_bufferÚpost_bufferr[   )r   rY   r   r   r	   r   +  s    z_Rledecoderengine.__init__c             C   sD   |t | jƒkr"|  |t | jƒ ¡ | jd |… }| j|d … | _|S )N)r2   ra   Ú_fill)r   r]   Úrvr   r   r	   r   1  s
    z_Rledecoderengine.readc             C   sô   | j | j |d ¡ | _ | jjr>| jt | j ¡ | _d| _ d S t| j ƒ}| j dd … td t krl|d }nX| j dd … tkrˆ|d }n<| j dd … td kr¨|d }n| j dd… tkr¼n|d	 }| jt | j d |… ¡ | _| j |d … | _ d S )
Nr\   r)   éýÿÿÿrH   r1   éÿÿÿÿr   éþÿÿÿr
   )	r`   rY   r   r[   ra   r3   Zrledecode_hqxr2   ÚRUNCHAR)r   r]   Zmarkr   r   r	   rb   8  s&    



z_Rledecoderengine._fillc             C   s   | j  ¡  d S )N)rY   r+   )r   r   r   r	   r+   [  s    z_Rledecoderengine.closeN)r   r   r   r8   r   r   rb   r+   r   r   r   r	   r_   (  s
   #r_   c               @   sL   e 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d„ Z
dS )ÚHexBinc             C   sj   t |tƒrt |d¡}x.| d¡}|s.tdƒ‚|dkr8q|dkrP qW t|ƒ}t|ƒ| _d| _	|  
¡  d S )Nr   r
   zNo binhex data foundó   ó   :r   )r?   r@   r   r   r   r   rZ   r_   rY   rA   Ú_readheader)r   rY   ZchZhqxifpr   r   r	   r   _  s    


zHexBin.__init__c             C   s    | j  |¡}t || j¡| _|S )N)rY   r   r3   rS   rA   )r   r2   r#   r   r   r	   Ú_readu  s    zHexBin._readc             C   sN   t  d| j d¡¡d d@ }| jd@ | _|| jkrDtd| j|f ƒ‚d| _d S )Nz>hr   r   iÿÿ  zCRC error, computed %x, read %x)rK   ÚunpackrY   r   rA   r   )r   Zfilecrcr   r   r	   Ú	_checkcrcz  s    
zHexBin._checkcrcc             C   s¾   |   d¡}|   t|ƒ¡}|   d¡}|  ¡  |dd… }|dd… }t d|dd… ¡d }t d|dd	… ¡d | _t d|d	d… ¡d | _|| _tƒ | _|| j_	|| j_
|| j_t| _d S )
Nr
   é   é   é	   z>hé   r   z>lé   )rl   Úordrn   rK   rm   rB   rC   ÚFNamer   r   r   r   rE   rF   )r   r2   ÚfnameÚrestÚtypeZcreatorÚflagsr   r   r	   rk   „  s    

zHexBin._readheaderc             G   sn   | j tkrtdƒ‚|r,|d }t|| jƒ}n| j}d}x&t|ƒ|k r\||  |t|ƒ ¡ }q8W | j| | _|S )NzRead data at wrong timer   r)   )rF   rE   r   ÚminrB   r2   rl   )r   Únrc   r   r   r	   r   ˜  s    
zHexBin.readc             C   s6   | j tkrtdƒ‚| jr$|  | j¡}|  ¡  t| _ d S )Nzclose_data at wrong time)rF   rE   r   rB   rl   rn   rT   )r   Údummyr   r   r	   rU   ¦  s    
zHexBin.close_datac             G   sZ   | j tkr|  ¡  | j tkr$tdƒ‚|r>|d }t|| jƒ}n| j}| j| | _|  |¡S )Nz Read resource data at wrong timer   )rF   rE   rU   rT   r   rz   rC   rl   )r   r{   r   r   r	   Ú	read_rsrc®  s    

zHexBin.read_rsrcc             C   sD   | j d krd S z| jr"|  | j¡}|  ¡  W d d | _ | j ¡  X d S )N)rF   rC   r}   rn   rY   r+   )r   r|   r   r   r	   r+   »  s    
zHexBin.closeN)r   r   r   r   rl   rn   rk   r   rU   r}   r+   r   r   r   r	   rh   ^  s   
rh   c          	   C   s®   t | ƒ}|j}|s|j}t |d¡&}x| d¡}|s8P | |¡ q(W W dQ R X | ¡  | d¡}|r¢t	|dƒ}| |¡ x| d¡}|sŒP | |¡ q|W | 
¡  | 
¡  dS )z6hexbin(infilename, outfilename) - Decode binhexed filer>   i ô N)rh   r   ru   r   r   r   r*   rU   r}   r'   r+   )rW   rX   rY   r!   r-   rP   r   r   r	   r   Æ  s,    
 



 )r8   r   r   rK   r3   Ú__all__Ú	Exceptionr   rE   rT   r:   r/   rg   r   r&   r'   r,   r9   r=   r   rZ   r_   rh   r   r   r   r   r	   Ú<module>   s,   
&^*6h