o
    …9jÀ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.10/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 s*w   Y  tj 	| ¡\}}| 
ddd¡}|||dfS )	NÚrbi   r   ÚTEXTr   ú:ú-r   )r   ÚioÚopenÚreadr   ÚseekÚtellÚosÚpathÚsplitÚreplace)ÚnameÚfinfoÚfpÚdataÚ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   ó   d S ©Nr
   ©r   Úargsr
   r
   r   r   I   ó   zopenrsrc.__init__c                 G   s   dS ©Nó    r
   r.   r
   r
   r   r   L   r0   zopenrsrc.readc                 G   r,   r-   r
   r.   r
   r
   r   ÚwriteO   r0   zopenrsrc.writec                 C   r,   r-   r
   r   r
   r
   r   ÚcloseR   r0   zopenrsrc.closeN)r   r   r	   r   r   r3   r4   r
   r
   r
   r   r+   H   s
    r+   c                   c   sD   � t  ¡ � t  ddt¡ d V  W d   ƒ d S 1 sw   Y  d S )NÚignoreÚ )ÚwarningsÚcatch_warningsÚfilterwarningsÚDeprecationWarningr
   r
   r
   r   Ú_ignore_deprecation_warningX   s
   €
"þr;   c                   @   ó0   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 )Nr2   r   )Úofpr&   ÚhqxdataÚLINELENÚlinelen©r   r>   r
   r
   r   r   b   s   z_Hqxcoderengine.__init__c                 C   sŽ   | j | | _ t| j ƒ}|d d }| j d |… }| j |d … | _ |s$d S tƒ � | jt |¡ | _W d   ƒ n1 s;w   Y  |  d¡ d S )Né   r   )r&   Úlenr;   r?   ÚbinasciiÚb2a_hqxÚ_flush)r   r&   ÚdatalenÚtodor
   r
   r   r3   h   s   
ÿz_Hqxcoderengine.writec                 C   sˆ   d}|t | jƒ| j kr-|| j }| j | j||… d ¡ t| _|}|t | jƒ| j ks| j|d … | _|rB| j | jd ¡ d S d S )Nr   ó   s   :)rD   r?   rA   r>   r3   r@   )r   ÚforceÚfirstÚlastr
   r
   r   rG   t   s   
üÿz_Hqxcoderengine._flushc                 C   s\   | j r tƒ � | jt | j ¡ | _W d   ƒ n1 sw   Y  |  d¡ | j ¡  | `d S )Nr   )r&   r;   r?   rE   rF   rG   r>   r4   r   r
   r
   r   r4      s   ÿ

z_Hqxcoderengine.closeN)r   r   r	   Ú__doc__r   r3   rG   r4   r
   r
   r
   r   r=   _   s    r=   c                   @   ó(   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   ó   || _ d| _d S r1   )r>   r&   rB   r
   r
   r   r   Š   ó   
z_Rlecoderengine.__init__c                 C   sf   | j | | _ t| j ƒtk rd S tƒ � t | j ¡}W d   ƒ n1 s#w   Y  | j |¡ d| _ d S r1   )r&   rD   ÚREASONABLY_LARGEr;   rE   Úrlecode_hqxr>   r3   )r   r&   Úrledatar
   r
   r   r3   Ž   s   ÿ
z_Rlecoderengine.writec                 C   sV   | j r"tƒ � t | j ¡}W d   ƒ n1 sw   Y  | j |¡ | j ¡  | `d S r-   )r&   r;   rE   rT   r>   r3   r4   )r   rU   r
   r
   r   r4   —   s   ÿ
z_Rlecoderengine.closeN)r   r   r	   rN   r   r3   r4   r
   r
   r
   r   rP   ‡   s
    	rP   c                   @   óL   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}z*| d¡ t|ƒ}	t|	ƒ| _d| _|d u r0t	ƒ }|| _
|| _|  ||¡ t| _W d S    |rK| ¡  ‚ )NFÚwbTs0   (This file must be converted with BinHex 4.0):r   )Ú
isinstanceÚstrr   r   r3   r=   rP   r>   Úcrcr   ÚdlenÚrlenÚ
_writeinfoÚ_DID_HEADERÚstater4   )
r   Úname_finfo_dlen_rlenr>   r#   r$   r\   r]   Úclose_on_errorÚofnameÚ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ƒr)| d¡}t|tƒr3| d¡}|| }t 	d|j
¡}t 	d| j| j¡}	|| | |	 }
|  |
¡ |  ¡  d S )Né?   zFilename too longzlatin-1ó    ú>hz>ii)rD   r   ÚbytesÚencoder   r   rY   rZ   ÚstructÚpackr   r\   r]   Ú_writeÚ	_writecrc)r   r#   r$   ÚnlÚdÚtpÚcrÚd2Úd3Úd4Úinfor
   r
   r   r^   ·   s   




zBinHex._writeinfoc                 C   s    t  || j¡| _| j |¡ d S r-   )rE   Úcrc_hqxr[   r>   r3   ©r   r&   r
   r
   r   rl   Ê   s   zBinHex._writec                 C   s4   | j dk rd}nd}| j t || j ¡¡ d| _ d S )Nr   rg   z>H)r[   r>   r3   rj   rk   )r   Úfmtr
   r
   r   rm   Î   s
   

zBinHex._writecrcc                 C   s0   | j tkr	tdƒ‚| jt|ƒ | _|  |¡ d S )NzWriting data at the wrong time)r`   r_   r   r\   rD   rl   rw   r
   r
   r   r3   Ø   s   
zBinHex.writec                 C   s,   | j dkrtd| jf ƒ‚|  ¡  t| _d S )Nr   zIncorrect data size, diff=%r)r\   r   r]   rm   Ú	_DID_DATAr`   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)r`   ry   rz   r   r]   rD   rl   rw   r
   r
   r   Ú
write_rsrcä   s   

zBinHex.write_rsrcc                 C   sŽ   | j d u rd S z2| j tk r|  ¡  | j tkrtdƒ‚| jdkr'td| jf ƒ‚|  ¡  W d | _ | j}| `| ¡  d S d | _ | j}| `| ¡  w )NzClose at the wrong timer   z$Incorrect resource-datasize, diff=%r)r`   ry   rz   r   r]   rm   r>   r4   rB   r
   r
   r   r4   ì   s$   




ý
zBinHex.closeN)r   r   r	   r   r^   rl   rm   r3   rz   r{   r4   r
   r
   r
   r   rW   Ÿ   s    
rW   c                 C   s    t | ƒ}t||ƒ}t | d¡�}	 | d¡}|sn| |¡ q| ¡  W d  ƒ n1 s-w   Y  t| dƒ}	 | d¡}|s@n| |¡ q8| 	¡  | 	¡  dS )zEbinhex(infilename, outfilename): create binhex-encoded copy of a filer   Té ô N)
r*   rW   r   r   r   r3   rz   r+   r{   r4   )ÚinpÚoutr$   r>   Úifpro   r
   r
   r   r   ý   s$   


ý
ú


ýr   c                   @   rO   )	Ú_Hqxdecoderenginez*Read data via the decoder in 4-byte chunksc                 C   rQ   )Nr   )r   Úeof©r   r   r
   r
   r   r     rR   z_Hqxdecoderengine.__init__c                 C   sÜ   d}|}|dkrl| j r|S |d d d }| j |¡}	 ztƒ � t |¡\}| _ W d  ƒ n1 s3w   Y  W n tjyC   Y nw | j d¡}|sPtd	ƒ‚|| }q|| }|t|ƒ }|sh| j shtd	ƒ‚|dks|S )
z&Read at least wtd bytes (or until EOF)r2   r   r   rC   é   TNr   zPremature EOF on binhex file)	r�   r   r   r;   rE   Úa2b_hqxÚ
Incompleter   rD   )r   ÚtotalwtdÚdecdataÚwtdr&   Ú
decdatacurÚnewdatar
   r
   r   r     s4   
ÿÿö
éz_Hqxdecoderengine.readc                 C   ó   | j  ¡  d S r-   ©r   r4   r   r
   r
   r   r4   :  ó   z_Hqxdecoderengine.closeN)r   r   r	   rN   r   r   r4   r
   r
   r
   r   r€     s
    !r€   c                   @   r<   )Ú_RledecoderenginezRead data via the RLE-coderc                 C   s   || _ d| _d| _d| _d S )Nr2   r   )r   Ú
pre_bufferÚpost_bufferr�   r‚   r
   r
   r   r   @  s   
z_Rledecoderengine.__init__c                 C   sD   |t | jƒkr|  |t | jƒ ¡ | jd |… }| j|d … | _|S r-   )rD   r�   Ú_fill)r   rˆ   Úrvr
   r
   r   r   F  s
   z_Rledecoderengine.readc                 C   s@  | j | j |d ¡ | _ | jjr2tƒ � | jt | j ¡ | _W d   ƒ n1 s(w   Y  d| _ d S t| j ƒ}| j dd … t	d t	 krI|d }n,| j dd … t	krW|d }n| j dd … t	d krg|d }n| j dd… t	krqn|d	 }tƒ � | jt | j d |… ¡ | _W d   ƒ n1 s‘w   Y  | j |d … | _ d S )
Nrƒ   r2   éýÿÿÿrf   rC   éÿÿÿÿr   éþÿÿÿr   )
r�   r   r   r�   r;   r�   rE   Úrledecode_hqxrD   ÚRUNCHAR)r   rˆ   Úmarkr
   r
   r   r‘   M  s2   
ÿÿ



ÿÿz_Rledecoderengine._fillc                 C   r‹   r-   rŒ   r   r
   r
   r   r4   r  r�   z_Rledecoderengine.closeN)r   r   r	   rN   r   r   r‘   r4   r
   r
   r
   r   rŽ   =  s    %rŽ   c                   @   rV   )ÚHexBinc                 C   sh   t |tƒrt |d¡}	 | d¡}|stdƒ‚|dkrq|dkr!nqt|ƒ}t|ƒ| _d| _	|  
¡  d S )Nr   Tr   zNo binhex data foundrJ   ó   :r   )rY   rZ   r   r   r   r   r€   rŽ   r   r[   Ú_readheader)r   r   ÚchÚhqxifpr
   r
   r   r   v  s   

÷
zHexBin.__init__c                 C   s    | j  |¡}t || j¡| _|S r-   )r   r   rE   rv   r[   )r   rD   r&   r
   r
   r   Ú_readŒ  s   zHexBin._readc                 C   sN   t  d| j d¡¡d d@ }| jd@ | _|| jkr"td| j|f ƒ‚d| _d S )Nrg   r   r   iÿÿ  zCRC error, computed %x, read %x)rj   Úunpackr   r   r[   r   )r   Ú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   é   é   é	   rg   é   r   z>lé   )rž   Úordr¡   rj   rŸ   r\   r]   ÚFNamer   r   r   r   r_   r`   )r   rD   ÚfnameÚrestÚtypeÚcreatorÚflagsr
   r
   r   r›   ›  s   


zHexBin._readheaderc                 G   st   | j tkr	tdƒ‚|r|d }t|| jƒ}n| j}d}t|ƒ|k r2||  |t|ƒ ¡ }t|ƒ|k s!| j| | _|S )NzRead data at wrong timer   r2   )r`   r_   r   Úminr\   rD   rž   )r   Únr’   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)r`   r_   r   r\   rž   r¡   ry   ©r   Údummyr
   r
   r   rz   ½  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   )r`   r_   rz   ry   r   r®   r]   rž   )r   r¯   r
   r
   r   Ú	read_rsrcÅ  s   


zHexBin.read_rsrcc                 C   sR   | j d u rd S z| jr|  | j¡}|  ¡  W d | _ | j ¡  d S d | _ | j ¡  w r-   )r`   r]   r²   r¡   r   r4   r°   r
   r
   r   r4   Ò  s   

ÿzHexBin.closeN)r   r   r	   r   rž   r¡   r›   r   rz   r²   r4   r
   r
   r
   r   r™   u  s    
r™   c                 C   s¾   t | ƒ}|j}|s|j}t |d¡�}	 | d¡}|sn| |¡ qW d  ƒ n1 s,w   Y  | ¡  | d¡}|rYt	|dƒ}| |¡ 	 | d¡}|sOn| |¡ qG| 
¡  | 
¡  dS )z6hexbin(infilename, outfilename) - Decode binhexed filerX   Tr|   N)r™   r   r¨   r   r   r   r3   rz   r²   r+   r4   )r}   r~   r   r$   r>   ro   r
   r
   r   r   Ý  s0   

ýü




ýr   )rN   rE   Ú
contextlibr   r   rj   r7   Úwarnr:   Ú__all__Ú	Exceptionr   r_   ry   rS   r@   r—   r   r*   r+   Úcontextmanagerr;   r=   rP   rW   r   r€   rŽ   r™   r   r
   r
   r
   r   Ú<module>   s<    ÿ
(^+8h