
[[\5                 @   sB  d  Z  d d l Z d d l Z d d l Z d d l Z d d d g Z Gd d   d e  Z e d  \ Z	 Z
 Z d Z d	 Z d
 Z Gd d   d  Z d d   Z Gd d   d  Z Gd d   d  Z Gd d   d  Z Gd d   d  Z d d   Z Gd d   d  Z Gd d   d  Z Gd 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   /usr/lib/python3.4/binhex.pyr      s      i   @   s   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__/   s    		zFInfo.__init__N)r   r   r   r   r   r   r   r	   r   .   s   r   c          
   C   s   t    } t j |  d  J } | j d  } d | k rE d | _ n  | j d d  | j   } Wd  QXt j j	 |   \ } } | j
 d d d  } | | | d f S)	Nrbi   r   ZTEXT   :-   )r   ioopenreadr   seektellospathsplitreplace)namefinfofpdataZdsizedirfiler   r   r	   getfileinfo4   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   B   s    zopenrsrc.__init__c             G   s   d S)N    r   )r   r(   r   r   r	   r   E   s    zopenrsrc.readc             G   s   d  S)Nr   )r   r(   r   r   r	   writeH   s    zopenrsrc.writec             C   s   d  S)Nr   )r   r   r   r	   closeK   s    zopenrsrc.closeN)r   r   r   r   r   r*   r+   r   r   r   r	   r'   A   s   r'   c               @   sF   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   Q   s    			z_Hqxcoderengine.__init__c             C   s   |  j  | |  _  t |  j   } | d d } |  j  d  |  } |  j  | d   |  _  | s` d  S|  j t j |  |  _ |  j d  d  S)Nr
   r   )r#   lenr.   binasciib2a_hqx_flush)r   r#   ZdatalenZtodor   r   r	   r*   W   s    z_Hqxcoderengine.writec             C   s   d } x] | t  |  j  |  j k re | |  j } |  j j |  j | |  d  t |  _ | } q	 W|  j | d   |  _ | r |  j j |  j d  n  d  S)Nr   s   
s   :
)r1   r.   r0   r-   r*   r/   )r   Zforcefirstlastr   r   r	   r4   b   s    !	
z_Hqxcoderengine._flushc             C   sL   |  j  r( |  j t j |  j   |  _ n  |  j d  |  j j   |  ` d  S)Nr   )r#   r.   r2   r3   r4   r-   r+   )r   r   r   r	   r+   m   s
    	z_Hqxcoderengine.closeN)r   r   r   __doc__r   r*   r4   r+   r   r   r   r	   r,   N   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   w   s    	z_Rlecoderengine.__init__c             C   sX   |  j  | |  _  t |  j   t k  r) d  St j |  j   } |  j j |  d |  _  d  S)Nr)   )r#   r1   REASONABLY_LARGEr2   rlecode_hqxr-   r*   )r   r#   rledatar   r   r	   r*   {   s    z_Rlecoderengine.writec             C   sE   |  j  r. t j |  j   } |  j j |  n  |  j j   |  ` d  S)N)r#   r2   r:   r-   r*   r+   )r   r;   r   r   r	   r+      s
    	z_Rlecoderengine.closeN)r   r   r   r7   r   r*   r+   r   r   r   r	   r8   t   s   r8   c               @   sp   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  rH | } t j | d  } d } n  yx | j d  t |  }	 t |	  |  _ d |  _ | d  k r t	   } n  | |  _
 | |  _ |  j | |  t |  _ Wn | r | j   n    Yn Xd  S)NFwbTs0   (This file must be converted with BinHex 4.0):r   )
isinstancestrr   r   r*   r,   r8   r-   crcr   dlenrlen
_writeinfo_DID_HEADERstater+   )
r   Zname_finfo_dlen_rlenr-   r    r!   rA   rB   Zclose_on_errorZofnameZhqxerr   r   r	   r      s*    				zBinHex.__init__c             C   s  t  |  } | d k r' t d   n  t | g  | j d  d } | j | j } } t | t  r{ | j d  } n  t | t  r | j d  } n  | | } t j	 d | j
  } t j	 d |  j |  j  }	 | | | |	 }
 |  j |
  |  j   d  S)N?   zFilename too longzlatin-1s    z>hz>ii)r1   r   bytesencoder   r   r>   r?   structpackr   rA   rB   _write	_writecrc)r   r    r!   nldZtpZcrZd2Zd3Zd4infor   r   r	   rC      s     
zBinHex._writeinfoc             C   s,   t  j | |  j  |  _ |  j j |  d  S)N)r2   crc_hqxr@   r-   r*   )r   r#   r   r   r	   rK      s    zBinHex._writec             C   sJ   |  j  d k  r d } n d } |  j j t j | |  j    d |  _  d  S)Nr   z>hz>H)r@   r-   r*   rI   rJ   )r   Zfmtr   r   r	   rL      s
    	zBinHex._writecrcc             C   sE   |  j  t k r t d   n  |  j t |  |  _ |  j |  d  S)NzWriting data at the wrong time)rE   rD   r   rA   r1   rK   )r   r#   r   r   r	   r*      s    zBinHex.writec             C   s?   |  j  d k r( t d |  j f   n  |  j   t |  _ d  S)Nr   zIncorrect data size, diff=%r)rA   r   rB   rL   	_DID_DATArE   )r   r   r   r	   
close_data   s    
zBinHex.close_datac             C   sa   |  j  t k  r |  j   n  |  j  t k r: t d   n  |  j t |  |  _ |  j |  d  S)Nz'Writing resource data at the wrong time)rE   rQ   rR   r   rB   r1   rK   )r   r#   r   r   r	   
write_rsrc   s    zBinHex.write_rsrcc             C   s   |  j  t k  r |  j   n  |  j  t k r: t d   n  |  j d k rb t d |  j f   n  |  j   |  j j   d  |  _  |  ` d  S)NzClose at the wrong timer   z$Incorrect resource-datasize, diff=%r)rE   rQ   rR   r   rB   rL   r-   r+   )r   r   r   r	   r+      s    
	zBinHex.closeN)r   r   r   r   rC   rK   rL   r*   rR   rS   r+   r   r   r   r	   r<      s   
r<   c             C   s   t  |   } t | |  } t j |  d  } x) | j d  } | sI Pn  | j |  q0 | j   | j   t |  d  } x) | j d  } | s Pn  | j	 |  q | j   | j   d S)zEbinhex(infilename, outfilename): create binhex-encoded copy of a filer   i  N)
r&   r<   r   r   r   r*   rR   r+   r'   rS   )inpoutr!   r-   ifprN   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   )rV   eof)r   rV   r   r   r	   r      s    	z_Hqxdecoderengine.__init__c             C   s   d } | } x | d k r |  j  r( | S| d d d } |  j j |  } xi y t j |  \ } |  _  PWn t j k
 r Yn X|  j j d  } | s t d   n  | | } qO | | } | t |  } | r |  j  r t d   q q W| S)z&Read at least wtd bytes (or until EOF)r)   r   r   r
      r   zPremature EOF on binhex file)rX   rV   r   r2   Za2b_hqxZ
Incompleter   r1   )r   ZtotalwtdZdecdatawtdr#   Z
decdatacurnewdatar   r   r	   r      s,    	 
z_Hqxdecoderengine.readc             C   s   |  j  j   d  S)N)rV   r+   )r   r   r   r	   r+      s    z_Hqxdecoderengine.closeN)r   r   r   r7   r   r   r+   r   r   r   r	   rW      s    rW   c               @   sF   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   )rV   
pre_bufferpost_bufferrX   )r   rV   r   r   r	   r   &  s    			z_Rledecoderengine.__init__c             C   s_   | t  |  j  k r2 |  j | t  |  j   n  |  j d  |  } |  j | d   |  _ | S)N)r1   r^   _fill)r   rZ   rvr   r   r	   r   ,  s
    z_Rledecoderengine.readc             C   sH  |  j  |  j j | d  |  _  |  j j rU |  j t j |  j   |  _ d |  _  d  St |  j   } |  j  d d   t d t k r | d } nv |  j  d d   t k r | d } nP |  j  d	 d   t d k r | d } n& |  j  d
 d  t k r n
 | d } |  j t j |  j  d  |   |  _ |  j  | d   |  _  d  S)NrY   r)   r
   s    r   r   rc   rb   )	r]   rV   r   rX   r^   r2   Zrledecode_hqxr1   RUNCHAR)r   rZ   markr   r   r	   r_   3  s&     	!
 z_Rledecoderengine._fillc             C   s   |  j  j   d  S)N)rV   r+   )r   r   r   r	   r+   V  s    z_Rledecoderengine.closeN)r   r   r   r7   r   r   r_   r+   r   r   r   r	   r\   #  s
   #r\   c               @   sp   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   s   t  | t  r$ t j | d  } n  xI | j d  } | sK t d   n  | d k r] q' n  | d k r' Pq' q' t |  } t |  |  _ d |  _	 |  j
   d  S)Nr   r   zNo binhex data founds      :r   )r>   r?   r   r   r   r   rW   r\   rV   r@   _readheader)r   rV   ZchZhqxifpr   r   r	   r   Z  s    	zHexBin.__init__c             C   s.   |  j  j |  } t j | |  j  |  _ | S)N)rV   r   r2   rP   r@   )r   r1   r#   r   r   r	   _readp  s    zHexBin._readc             C   sn   t  j d |  j j d   d d @} |  j d @|  _ | |  j k ra t d |  j | f   n  d |  _ d  S)Nz>hr   r   i  zCRC error, computed %x, read %x)rI   unpackrV   r   r@   r   )r   Zfilecrcr   r   r	   	_checkcrcu  s    &zHexBin._checkcrcc             C   s	  |  j  d  } |  j  t |   } |  j  d  } |  j   | d d  } | d d  } t j d | d d   d } t j d	 | d d
   d |  _ t j d	 | d
 d   d |  _ | |  _ t   |  _ | |  j _	 | |  j _
 | |  j _ t |  _ d  S)Nr   rY   r      	   z>h   r   z>l      rl   rm   rn   ro   rp   )ri   ordrk   rI   rj   rA   rB   FNamer   r   r   r   rD   rE   )r   r1   ZfnameresttypeZcreatorflagsr   r   r	   rh     s    
 ##	zHexBin._readheaderc             G   s   |  j  t k r t d   n  | rC | d } t | |  j  } n	 |  j } d } x3 t |  | k  r | |  j | t |   } qU W|  j | |  _ | S)NzRead data at wrong timer   r)   )rE   rD   r   minrA   r1   ri   )r   nr`   r   r   r	   r     s    
	!zHexBin.readc             C   sS   |  j  t k r t d   n  |  j r< |  j |  j  } n  |  j   t |  _  d  S)Nzclose_data at wrong time)rE   rD   r   rA   ri   rk   rQ   )r   dummyr   r   r	   rR     s    	
zHexBin.close_datac             G   s   |  j  t k r |  j   n  |  j  t k r: t d   n  | r_ | d } t | |  j  } n	 |  j } |  j | |  _ |  j |  S)Nz Read resource data at wrong timer   )rE   rD   rR   rQ   r   rv   rB   ri   )r   rw   r   r   r	   	read_rsrc  s    
	zHexBin.read_rsrcc             C   sB   |  j  r |  j |  j   } n  |  j   t |  _ |  j j   d  S)N)rB   ry   rk   	_DID_RSRCrE   rV   r+   )r   rx   r   r   r	   r+     s
    	
	zHexBin.closeN)r   r   r   r   ri   rk   rh   r   rR   ry   r+   r   r   r   r	   rf   Y  s   
rf   c             C   s   t  |   } | j } | s' | j } n  t j | d  } x) | j d  } | sU Pn  | j |  q< | j   | j   | j	 d  } | r t
 | d  } | j |  x) | j	 d  } | s Pn  | j |  q | j   n  | j   d S)z6hexbin(infilename, outfilename) - Decode binhexed filer=   i  N)rf   r   rr   r   r   r   r*   r+   rR   ry   r'   )rT   rU   rV   r!   r-   rN   r   r   r	   r     s.    	 

 )r7   r   r   rI   r2   __all__	Exceptionr   rangerD   rQ   rz   r9   r/   rd   r   r&   r'   r,   r8   r<   r   rW   r\   rf   r   r   r   r   r	   <module>   s*   &Y*6d