a
    ãzeÀ9  ã                   @   s
  d Z ddlZddlZddlZddlZddlZddlZejdedd g d¢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ej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)
é    Nzthe binhex module is deprecatedé   )Ú
stacklevel)ÚbinhexÚhexbinÚErrorc                   @   s   e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__© r
   r
   ú/usr/lib/python3.9/binhex.pyr   %   s   r   é   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__6   s    zFInfo.__init__N)r   r   r	   r   r
   r
   r
   r   r   5   s   r   c                 C   sˆ   t ƒ }t | d¡<}| d¡}d|vr,d|_| dd¡ | ¡ }W d   ƒ n1 sT0    Y  tj 	| ¡\}}| 
ddd¡}|||dfS )	NÚrbi   r   ZTEXTr   ú:ú-r   )r   ÚioÚopenÚreadr   ÚseekÚtellÚosÚpathÚsplitÚreplace)ÚnameÚfinfoÚfpÚdataZdsizeÚdirÚfiler
   r
   r   Úgetfileinfo;   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   I   s    zopenrsrc.__init__c                 G   s   dS ©Nó    r
   r+   r
   r
   r   r   L   s    zopenrsrc.readc                 G   s   d S r*   r
   r+   r
   r
   r   ÚwriteO   s    zopenrsrc.writec                 C   s   d S r*   r
   r   r
   r
   r   ÚcloseR   s    zopenrsrc.closeN)r   r   r	   r   r   r/   r0   r
   r
   r
   r   r)   H   s   r)   c                   c   s@   t  ¡ $ t  ddt¡ d V  W d   ƒ n1 s20    Y  d S )NÚignoreÚ )ÚwarningsÚcatch_warningsÚfilterwarningsÚDeprecationWarningr
   r
   r
   r   Ú_ignore_deprecation_warningX   s    
r7   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   r9   r
   r
   r   r   b   s    z_Hqxcoderengine.__init__c                 C   sŽ   | j | | _ t| j ƒ}|d d }| j d |… }| j |d … | _ |sHd S tƒ " | jt |¡ | _W d   ƒ n1 sv0    Y  |  d¡ d S )Né   r   )r%   Úlenr7   r:   ÚbinasciiÚb2a_hqxÚ_flush)r   r%   ZdatalenZtodor
   r
   r   r/   h   s    
0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   :)r?   r:   r<   r9   r/   r;   )r   ÚforceÚfirstZlastr
   r
   r   rB   t   s    
z_Hqxcoderengine._flushc                 C   s\   | j r@tƒ $ | jt | j ¡ | _W d   ƒ n1 s60    Y  |  d¡ | j ¡  | `d S )Nr   )r%   r7   r:   r@   rA   rB   r9   r0   r   r
   r
   r   r0      s    2

z_Hqxcoderengine.closeN)r   r   r	   Ú__doc__r   r/   rB   r0   r
   r
   r
   r   r8   _   s
   r8   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-   )r9   r%   r=   r
   r
   r   r   Š   s    z_Rlecoderengine.__init__c                 C   sf   | j | | _ t| j ƒtk rd S tƒ  t | j ¡}W d   ƒ n1 sF0    Y  | j |¡ d| _ d S r-   )r%   r?   ÚREASONABLY_LARGEr7   r@   Úrlecode_hqxr9   r/   )r   r%   Úrledatar
   r
   r   r/   Ž   s    *z_Rlecoderengine.writec                 C   sV   | j rDtƒ  t | j ¡}W d   ƒ n1 s.0    Y  | j |¡ | j ¡  | `d S r*   )r%   r7   r@   rI   r9   r/   r0   )r   rJ   r
   r
   r   r0   —   s    *
z_Rlecoderengine.closeN)r   r   r	   rF   r   r/   r0   r
   r
   r
   r   rG   ‡   s   	rG   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 u r`t	ƒ }|| _
|| _|  ||¡ t| _W n   |r”| ¡  ‚ Y n0 d S )NFÚwbTs0   (This file must be converted with BinHex 4.0):r   )Ú
isinstanceÚstrr   r   r/   r8   rG   r9   Úcrcr   ÚdlenÚrlenÚ
_writeinfoÚ_DID_HEADERÚstater0   )
r   Zname_finfo_dlen_rlenr9   r"   r#   rP   rQ   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)r?   r   ÚbytesÚencoder   r   rM   rN   ÚstructÚpackr   rP   rQ   Ú_writeÚ	_writecrc)r   r"   r#   ÚnlÚdÚtpZcrZd2Zd3Zd4Úinfor
   r
   r   rR   ·   s    




zBinHex._writeinfoc                 C   s    t  || j¡| _| j |¡ d S r*   )r@   Úcrc_hqxrO   r9   r/   ©r   r%   r
   r
   r   r\   Ê   s    zBinHex._writec                 C   s4   | j dk rd}nd}| j t || j ¡¡ d| _ d S )Nr   rW   z>H)rO   r9   r/   rZ   r[   )r   Úfmtr
   r
   r   r]   Î   s
    
zBinHex._writecrcc                 C   s0   | j tkrtdƒ‚| jt|ƒ | _|  |¡ d S )NzWriting data at the wrong time)rT   rS   r   rP   r?   r\   rc   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)rP   r   rQ   r]   Ú	_DID_DATArT   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)rT   re   rf   r   rQ   r?   r\   rc   r
   r
   r   Ú
write_rsrcä   s    

zBinHex.write_rsrcc                 C   s   | j d u rd S zb| j tk r"|  ¡  | j tkr4tdƒ‚| jdkrNtd| jf ƒ‚|  ¡  W d | _ | j}| `| ¡  nd | _ | j}| `| ¡  0 d S )NzClose at the wrong timer   z$Incorrect resource-datasize, diff=%r)rT   re   rf   r   rQ   r]   r9   r0   r=   r
   r
   r   r0   ì   s$    





ýzBinHex.closeN)r   r   r	   r   rR   r\   r]   r/   rf   rg   r0   r
   r
   r
   r   rK   Ÿ   s   
rK   c                 C   sœ   t | ƒ}t||ƒ}t | d¡4}| d¡}|s0q<| |¡ q | ¡  W d  ƒ n1 sX0    Y  t| dƒ}| d¡}|s|qˆ| |¡ ql| 	¡  | 	¡  dS )zEbinhex(infilename, outfilename): create binhex-encoded copy of a filer   é ô N)
r(   rK   r   r   r   r/   rf   r)   rg   r0   )ÚinpÚoutr#   r9   Úifpr_   r
   r
   r   r   ý   s    

&

r   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   )rk   Úeof©r   rk   r
   r
   r   r     s    z_Hqxdecoderengine.__init__c                 C   sØ   d}|}|dkrÔ| j r|S |d d d }| j |¡}z>tƒ   t |¡\}| _ W d  ƒ n1 sd0    Y  W q¬W n tjyˆ   Y n0 | 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   r>   é   Nr   zPremature EOF on binhex file)	rm   rk   r   r7   r@   Za2b_hqxZ
Incompleter   r?   )r   ZtotalwtdZdecdataÚwtdr%   Z
decdatacurÚnewdatar
   r
   r   r     s*    
.


z_Hqxdecoderengine.readc                 C   s   | j  ¡  d S r*   ©rk   r0   r   r
   r
   r   r0   :  s    z_Hqxdecoderengine.closeN)r   r   r	   rF   r   r   r0   r
   r
   r
   r   rl     s   !rl   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   )rk   Ú
pre_bufferÚpost_bufferrm   rn   r
   r
   r   r   @  s    z_Rledecoderengine.__init__c                 C   sD   |t | jƒkr"|  |t | jƒ ¡ | jd |… }| j|d … | _|S r*   )r?   ru   Ú_fill)r   rp   Úrvr
   r
   r   r   F  s
    z_Rledecoderengine.readc                 C   sB  | j | j |d ¡ | _ | jjrdtƒ $ | jt | j ¡ | _W d   ƒ n1 sP0    Y  d| _ d S t| j ƒ}| j dd … t	d t	 kr’|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	 }tƒ , | jt | j d |… ¡ | _W d   ƒ n1 s$0    Y  | j |d … | _ d S )
Nro   r.   éýÿÿÿrV   r>   éÿÿÿÿr   éþÿÿÿr   )
rt   rk   r   rm   r7   ru   r@   Zrledecode_hqxr?   ÚRUNCHAR)r   rp   Zmarkr
   r
   r   rv   M  s.    
ÿ$



ÿ&z_Rledecoderengine._fillc                 C   s   | j  ¡  d S r*   rr   r   r
   r
   r   r0   r  s    z_Rledecoderengine.closeN)r   r   r	   rF   r   r   rv   r0   r
   r
   r
   r   rs   =  s
   %rs   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 foundrC   ó   :r   )rM   rN   r   r   r   r   rl   rs   rk   rO   Ú_readheader)r   rk   ZchZhqxifpr
   r
   r   r   v  s    


zHexBin.__init__c                 C   s    | j  |¡}t || j¡| _|S r*   )rk   r   r@   rb   rO   )r   r?   r%   r
   r
   r   Ú_readŒ  s    zHexBin._readc                 C   sN   t  d| j d¡¡d d@ }| jd@ | _|| jkrDtd| j|f ƒ‚d| _d S )NrW   r   r   iÿÿ  zCRC error, computed %x, read %x)rZ   Úunpackrk   r   rO   r   )r   Zfilecrcr
   r
   r   Ú	_checkcrc‘  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   é   é   é	   rW   é   r   z>lé   )r   Úordr   rZ   r€   rP   rQ   ÚFNamer   r   r   r   rS   rT   )r   r?   ZfnameÚrestÚtypeZcreatorÚflagsr
   r
   r   r~   ›  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.   )rT   rS   r   ÚminrP   r?   r   )r   Únrw   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)rT   rS   r   rP   r   r   re   ©r   Údummyr
   r
   r   rf   ½  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   )rT   rS   rf   re   r   rŒ   rQ   r   )r   r   r
   r
   r   Ú	read_rsrcÅ  s    

zHexBin.read_rsrcc                 C   sT   | j d u rd S z.| jr"|  | j¡}|  ¡  W d | _ | j ¡  nd | _ | j ¡  0 d S r*   )rT   rQ   r   r   rk   r0   rŽ   r
   r
   r   r0   Ò  s    

ÿzHexBin.closeN)r   r   r	   r   r   r   r~   r   rf   r   r0   r
   r
   r
   r   r|   u  s   
r|   c                 C   sº   t | ƒ}|j}|s|j}t |d¡,}| d¡}|s6qB| |¡ q&W d  ƒ n1 sV0    Y  | ¡  | d¡}|r®t	|dƒ}| |¡ | d¡}|sšq¦| |¡ qŠ| 
¡  | 
¡  dS )z6hexbin(infilename, outfilename) - Decode binhexed filerL   rh   N)r|   r   rˆ   r   r   r   r/   rf   r   r)   r0   )ri   rj   rk   r#   r9   r_   r
   r
   r   r   Ý  s$    
*



r   )rF   r@   Ú
contextlibr   r   rZ   r3   Úwarnr6   Ú__all__Ú	Exceptionr   rS   re   rH   r;   r{   r   r(   r)   Úcontextmanagerr7   r8   rG   rK   r   rl   rs   r|   r   r
   r
   r
   r   Ú<module>   s:   ÿ
(^+8h