a
    If9                     @   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 )%zMacintosh 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
   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   Z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@   rH   r9   r/   r0   )r   rI   r
   r
   r   r0      s    *
z_Rlecoderengine.closeN)r   r   r	   rE   r   r/   r0   r
   r
   r
   r   rF      s   	rF   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   rF   r9   crcr   dlenrlen
_writeinfo_DID_HEADERstater0   )
r   Zname_finfo_dlen_rlenr9   r"   r#   rO   rP   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   rL   rM   structpackr   rO   rP   _write	_writecrc)r   r"   r#   nldtpZcrZd2Zd3Zd4infor
   r
   r   rQ      s    




zBinHex._writeinfoc                 C   s    t || j| _| j| d S r*   )r@   crc_hqxrN   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   rV   z>H)rN   r9   r/   rY   rZ   )r   Z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)rS   rR   r   rO   r?   r[   rb   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)rO   r   rP   r\   	_DID_DATArS   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)rS   rc   rd   r   rP   r?   r[   rb   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)rS   rc   rd   r   rP   r\   r9   r0   r=   r
   r
   r   r0      s$    





zBinHex.closeN)r   r   r	   r   rQ   r[   r\   r/   rd   re   r0   r
   r
   r
   r   rJ      s   
rJ   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(   rJ   r   r   r   r/   rd   r)   re   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   )ri   eofr   ri   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 qW n tjy   Y n0 | jd}|st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)	rk   ri   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*   ri   r0   r   r
   r
   r   r0   :  s    z_Hqxdecoderengine.closeN)r   r   r	   rE   r   r   r0   r
   r
   r
   r   rj     s   !rj   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   )ri   
pre_bufferpost_bufferrk   rl   r
   r
   r   r   @  s    z_Rledecoderengine.__init__c                 C   sD   |t | jkr"| |t | j  | jd | }| j|d  | _|S r*   )r?   rs   _fill)r   rn   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rn|d	 }t , | jt| j d |  | _W d    n1 s$0    Y  | j |d  | _ d S )
Nrm   r.   rU   r>   r   r   )
rr   ri   r   rk   r7   rs   r@   Zrledecode_hqxr?   RUNCHAR)r   rn   Zmarkr
   r
   r   rt   M  s.    
$



&z_Rledecoderengine._fillc                 C   s   | j   d S r*   rp   r   r
   r
   r   r0   r  s    z_Rledecoderengine.closeN)r   r   r	   rE   r   r   rt   r0   r
   r
   r
   r   rq   =  s
   %rq   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   )rL   rM   r   r   r   r   rj   rq   ri   rN   _readheader)r   ri   ZchZhqxifpr
   r
   r   r   v  s    


zHexBin.__init__c                 C   s    | j |}t|| j| _|S r*   )ri   r   r@   ra   rN   )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 )NrV   r   r   i  zCRC error, computed %x, read %x)rY   unpackri   r   rN   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         	   rV      r   z>l   )r}   ordr   rY   r~   rO   rP   FNamer   r   r   r   rR   rS   )r   r?   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.   )rS   rR   r   minrO   r?   r}   )r   nru   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)rS   rR   r   rO   r}   r   rc   r   Zdummyr
   r
   r   rd     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   )rS   rR   rd   rc   r   r   rP   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*   )rS   rP   r   r   ri   r0   r   r
   r
   r   r0     s    

zHexBin.closeN)r   r   r	   r   r}   r   r|   r   rd   r   r0   r
   r
   r
   r   rz   u  s   
rz   c                 C   s   t | }|j}|s|j}t|d,}|d}|s6qB|| q&W d   n1 sV0    Y  |  |d}|rt	|d}|| |d}|sq|| q|
  |
  dS )z6hexbin(infilename, outfilename) - Decode binhexed filerK   rf   N)rz   r   r   r   r   r   r/   rd   r   r)   r0   )rg   rh   ri   r#   r9   r^   r
   r
   r   r     s$    
*



r   )rE   r@   
contextlibr   r   rY   r3   warnr6   __all__	Exceptionr   rR   rc   rG   r;   ry   r   r(   r)   contextmanagerr7   r8   rF   rJ   r   rj   rq   rz   r   r
   r
   r
   r   <module>   s:   
(^+8h