o
    f9                     @   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   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 sw   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