B
    ܜwa6                 @   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 )zMacintosh 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}|st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rn|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}|rt	|d}|| x|d}|sP || 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