o
    IAf9                     @   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
   /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   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      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   r.   zopenrsrc.readc                 G   r*   r+   r
   r,   r
   r
   r   writeO   r.   zopenrsrc.writec                 C   r*   r+   r
   r   r
   r
   r   closeR   r.   zopenrsrc.closeN)r   r   r	   r   r   r1   r2   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
   
"r9   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 )Nr0   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%   lenr9   r=   binasciib2a_hqx_flush)r   r%   ZdatalenZtodor
   r
   r   r1   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   :)rB   r=   r?   r<   r1   r>   )r   forcefirstZlastr
   r
   r   rE   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%   r9   r=   rC   rD   rE   r<   r2   r   r
   r
   r   r2      s   

z_Hqxcoderengine.closeN)r   r   r	   __doc__r   r1   rE   r2   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 r/   )r<   r%   r@   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 r/   )r%   rB   REASONABLY_LARGEr9   rC   rlecode_hqxr<   r1   )r   r%   rledatar
   r
   r   r1      s   
z_Rlecoderengine.writec                 C   sV   | j r"t  t| j }W d    n1 sw   Y  | j| | j  | `d S r+   )r%   r9   rC   rO   r<   r1   r2   )r   rP   r
   r
   r   r2      s   
z_Rlecoderengine.closeN)r   r   r	   rI   r   r1   r2   r
   r
   r
   r   rK      s
    	rK   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   r1   r;   rK   r<   crcr   dlenrlen
_writeinfo_DID_HEADERstater2   )
r   Zname_finfo_dlen_rlenr<   r"   r#   rW   rX   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r)|d}t|tr3|d}|| }t	d|j
}t	d| j| j}	|| | |	 }
| |
 |   d S )N?   zFilename too longzlatin-1    >hz>ii)rB   r   bytesencoder   r   rT   rU   structpackr   rW   rX   _write	_writecrc)r   r"   r#   nldtpZcrZd2Zd3Zd4infor
   r
   r   rY      s   




zBinHex._writeinfoc                 C   s    t || j| _| j| d S r+   )rC   crc_hqxrV   r<   r1   r   r%   r
   r
   r   rc      s   zBinHex._writec                 C   s4   | j dk rd}nd}| jt|| j  d| _ d S )Nr   r^   z>H)rV   r<   r1   ra   rb   )r   fmtr
   r
   r   rd      s
   

zBinHex._writecrcc                 C   s0   | j tkr	td| jt| | _| | d S )NzWriting data at the wrong time)r[   rZ   r   rW   rB   rc   rj   r
   r
   r   r1      s   
zBinHex.writec                 C   s,   | j dkrtd| jf |   t| _d S )Nr   zIncorrect data size, diff=%r)rW   r   rX   rd   	_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[   rl   rm   r   rX   rB   rc   rj   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[   rl   rm   r   rX   rd   r<   r2   r@   r
   r
   r   r2      s$   





zBinHex.closeN)r   r   r	   r   rY   rc   rd   r1   rm   rn   r2   r
   r
   r
   r   rR      s    
rR   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(   rR   r   r   r   r1   rm   r)   rn   r2   )inpoutr#   r<   ifprf   r
   r
   r   r      s$   






r   c                   @   rJ   )	_Hqxdecoderenginez*Read data via the decoder in 4-byte chunksc                 C   rL   )Nr   )rr   eofr   rr   r
   r
   r   r     rM   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)r0   r   r   rA      TNr   zPremature EOF on binhex file)	rt   rr   r   r9   rC   Za2b_hqxZ
Incompleter   rB   )r   ZtotalwtdZdecdatawtdr%   Z
decdatacurnewdatar
   r
   r   r     s4   

z_Hqxdecoderengine.readc                 C      | j   d S r+   rr   r2   r   r
   r
   r   r2   :     z_Hqxdecoderengine.closeN)r   r   r	   rI   r   r   r2   r
   r
   r
   r   rs     s
    !rs   c                   @   r:   )_RledecoderenginezRead data via the RLE-coderc                 C   s   || _ d| _d| _d| _d S )Nr0   r   )rr   
pre_bufferpost_bufferrt   ru   r
   r
   r   r   @  s   
z_Rledecoderengine.__init__c                 C   sD   |t | jkr| |t | j  | jd | }| j|d  | _|S r+   )rB   r~   _fill)r   rw   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 sw   Y  | j |d  | _ d S )
Nrv   r0   r]   rA   r   r   )
r}   rr   r   rt   r9   r~   rC   Zrledecode_hqxrB   RUNCHAR)r   rw   Zmarkr
   r
   r   r   M  s2   




z_Rledecoderengine._fillc                 C   ry   r+   rz   r   r
   r
   r   r2   r  r{   z_Rledecoderengine.closeN)r   r   r	   rI   r   r   r   r2   r
   r
   r
   r   r|   =  s    %r|   c                   @   rQ   )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 foundrF      :r   )rT   rU   r   r   r   r   rs   r|   rr   rV   _readheader)r   rr   ZchZhqxifpr
   r
   r   r   v  s   


zHexBin.__init__c                 C   s    | j |}t|| j| _|S r+   )rr   r   rC   ri   rV   )r   rB   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 )Nr^   r   r   i  zCRC error, computed %x, read %x)ra   unpackrr   r   rV   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         	   r^      r   z>l   )r   ordr   ra   r   rW   rX   FNamer   r   r   r   rZ   r[   )r   rB   ZfnameresttypeZ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   r0   )r[   rZ   r   minrW   rB   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[   rZ   r   rW   r   r   rl   r   Zdummyr
   r
   r   rm     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[   rZ   rm   rl   r   r   rX   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[   rX   r   r   rr   r2   r   r
   r
   r   r2     s   

zHexBin.closeN)r   r   r	   r   r   r   r   r   rm   r   r2   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 filerS   Tro   N)r   r   r   r   r   r   r1   rm   r   r)   r2   )rp   rq   rr   r#   r<   rf   r
   r
   r   r     s0   






r   )rI   rC   
contextlibr   r   ra   r5   warnr8   __all__	Exceptionr   rZ   rl   rN   r>   r   r   r(   r)   contextmanagerr9   r;   rK   rR   r   rs   r|   r   r   r
   r
   r
   r   <module>   s<    
(^+8h