U
    ”¼pd‚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   ú/usr/lib/python3.8/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 5 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   F   s    zopenrsrc.readc                 G   s   d S r)   r   r*   r   r   r	   ÚwriteI   s    zopenrsrc.writec                 C   s   d S r)   r   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   r1   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$   Úlenr2   ÚbinasciiÚb2a_hqxÚ_flush)r   r$   ZdatalenZtodor   r   r	   r.   X   s    
z_Hqxcoderengine.writec                 C   sr   d}|t | jƒ| j krH|| j }| j | j||… d ¡ t| _|}q| j|d … | _|rn| j | jd ¡ d S )Nr   ó   s   :)r7   r2   r4   r1   r.   r3   )r   ZforceÚfirstZlastr   r   r	   r:   c   s    
z_Hqxcoderengine._flushc                 C   s6   | j r| jt | j ¡ | _|  d¡ | j ¡  | `d S )Nr
   )r$   r2   r8   r9   r:   r1   r/   r   r   r   r	   r/   n   s
    

z_Hqxcoderengine.closeN)r   r   r   Ú__doc__r   r.   r:   r/   r   r   r   r	   r0   O   s
   r0   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 r,   )r1   r$   r5   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 r,   )r$   r7   ÚREASONABLY_LARGEr8   Úrlecode_hqxr1   r.   )r   r$   Úrledatar   r   r	   r.   |   s    z_Rlecoderengine.writec                 C   s0   | j rt | j ¡}| j |¡ | j ¡  | `d S r)   )r$   r8   r@   r1   r.   r/   )r   rA   r   r   r	   r/   „   s
    
z_Rlecoderengine.closeN)r   r   r   r=   r   r.   r/   r   r   r   r	   r>   u   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 )ÚBinHexc           
      C   s    |\}}}}d}t |tƒr.|}t |d¡}d}zR| 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.   r0   r>   r1   Úcrcr   ÚdlenÚrlenÚ
_writeinfoÚ_DID_HEADERÚstater/   )
r   Zname_finfo_dlen_rlenr1   r!   r"   rG   rH   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ó    ú>hz>ii)r7   r   ÚbytesÚencoder   r   rD   rE   ÚstructÚpackr   rG   rH   Ú_writeÚ	_writecrc)r   r!   r"   ÚnlÚdÚtpZcrZd2Zd3Zd4Úinfor   r   r	   rI   £   s    




zBinHex._writeinfoc                 C   s    t  || j¡| _| j |¡ d S r)   )r8   Úcrc_hqxrF   r1   r.   ©r   r$   r   r   r	   rS   ¶   s    zBinHex._writec                 C   s4   | j dk rd}nd}| j t || j ¡¡ d| _ d S )Nr   rN   z>H)rF   r1   r.   rQ   rR   )r   Zfmtr   r   r	   rT   º   s
    
zBinHex._writecrcc                 C   s0   | j tkrtdƒ‚| jt|ƒ | _|  |¡ d S )NzWriting data at the wrong time)rK   rJ   r   rG   r7   rS   rZ   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)rG   r   rH   rT   Ú	_DID_DATArK   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)rK   r[   r\   r   rH   r7   rS   rZ   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 5 d | _ | j}| `| ¡  X d S )NzClose at the wrong timer   z$Incorrect resource-datasize, diff=%r)rK   r1   r/   r[   r\   r   rH   rT   r5   r   r   r	   r/   Ø   s    



zBinHex.closeN)r   r   r   r   rI   rS   rT   r.   r\   r]   r/   r   r   r   r	   rB   ‹   s   
rB   c              	   C   sˆ   t | ƒ}t||ƒ}t | d¡*}| d¡}|s0q<| |¡ q | ¡  W 5 Q R X t| dƒ}| d¡}|shqt| |¡ qX| 	¡  | 	¡  dS )zEbinhex(infilename, outfilename): create binhex-encoded copy of a filer   é ô N)
r'   rB   r   r   r   r.   r\   r(   r]   r/   )ÚinpÚoutr"   r1   ÚifprV   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   )ra   Úeof©r   ra   r   r   r	   r     s    z_Hqxdecoderengine.__init__c                 C   s´   d}|}|dkr°| j r|S |d d d }| j |¡}zt |¡\}| _ W qˆW n tjk
rd   Y nX | j d¡}|s~tdƒ‚|| }q6|| }|t|ƒ }|s| j stdƒ‚q|S )z&Read at least wtd bytes (or until EOF)r-   r   r   r6   é   r
   zPremature EOF on binhex file)rc   ra   r   r8   Za2b_hqxZ
Incompleter   r7   )r   ZtotalwtdZdecdataÚwtdr$   Z
decdatacurÚnewdatar   r   r	   r     s*     


z_Hqxdecoderengine.readc                 C   s   | j  ¡  d S r)   ©ra   r/   r   r   r   r	   r/   %  s    z_Hqxdecoderengine.closeN)r   r   r   r=   r   r   r/   r   r   r   r	   rb   þ   s    rb   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   )ra   Ú
pre_bufferÚpost_bufferrc   rd   r   r   r	   r   +  s    z_Rledecoderengine.__init__c                 C   sD   |t | jƒkr"|  |t | jƒ ¡ | jd |… }| j|d … | _|S r)   )r7   rk   Ú_fill)r   rf   Ú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 )
Nre   r-   éýÿÿÿrM   r6   éÿÿÿÿr   éþÿÿÿr
   )	rj   ra   r   rc   rk   r8   Zrledecode_hqxr7   ÚRUNCHAR)r   rf   Zmarkr   r   r	   rl   8  s*    
ÿ



ÿz_Rledecoderengine._fillc                 C   s   | j  ¡  d S r)   rh   r   r   r   r	   r/   [  s    z_Rledecoderengine.closeN)r   r   r   r=   r   r   rl   r/   r   r   r   r	   ri   (  s
   #ri   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   sf   t |tƒrt |d¡}| d¡}|s,tdƒ‚|dkr6q|dkrqBqt|ƒ}t|ƒ| _d| _	|  
¡  d S )Nr   r
   zNo binhex data foundr;   ó   :r   )rD   rE   r   r   r   r   rb   ri   ra   rF   Ú_readheader)r   ra   ZchZhqxifpr   r   r	   r   _  s    


zHexBin.__init__c                 C   s    | j  |¡}t || j¡| _|S r)   )ra   r   r8   rY   rF   )r   r7   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 )NrN   r   r   iÿÿ  zCRC error, computed %x, read %x)rQ   Úunpackra   r   rF   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
   é   é   é	   rN   é   r   z>lé   )ru   Úordrw   rQ   rv   rG   rH   ÚFNamer   r   r   r   rJ   rK   )r   r7   ZfnameÚrestÚtypeZcreatorÚflagsr   r   r	   rt   „  s    

zHexBin._readheaderc                 G   sj   | j tkrtdƒ‚|r,|d }t|| jƒ}n| j}d}t|ƒ|k rZ||  |t|ƒ ¡ }q6| j| | _|S )NzRead data at wrong timer   r-   )rK   rJ   r   ÚminrG   r7   ru   )r   Únrm   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)rK   rJ   r   rG   ru   rw   r[   ©r   Zdummyr   r   r	   r\   ¦  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   )rK   rJ   r\   r[   r   r‚   rH   ru   )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 5 d | _ | j ¡  X d S r)   )rK   ra   r/   rH   r…   rw   r„   r   r   r	   r/   »  s    
zHexBin.closeN)r   r   r   r   ru   rw   rt   r   r\   r…   r/   r   r   r   r	   rr   ^  s   
rr   c              	   C   s¦   t | ƒ}|j}|s|j}t |d¡"}| d¡}|s6qB| |¡ q&W 5 Q R X | ¡  | d¡}|ršt	|dƒ}| |¡ | d¡}|s†q’| |¡ qv| 
¡  | 
¡  dS )z6hexbin(infilename, outfilename) - Decode binhexed filerC   r^   N)rr   r   r~   r   r   r   r.   r\   r…   r(   r/   )r_   r`   ra   r"   r1   rV   r   r   r	   r   Æ  s(    
 



 )r=   r   r   rQ   r8   Ú__all__Ú	Exceptionr   rJ   r[   r?   r3   rq   r   r'   r(   r0   r>   rB   r   rb   ri   rr   r   r   r   r   r	   Ú<module>   s,   
&^*6h