U e5d�6 � @ s� d Z ddlZddlZddlZddlZdddgZG dd� de�ZdZdZ dZ d Zd ZG dd� d�Z d d� ZG dd� d�ZG dd� d�ZG dd� d�ZG dd� d�Zdd� ZG dd� d�ZG dd� d�ZG dd� d�Zdd� ZdS )z�Macintosh binhex compression/decompression. easy interface: binhex(inputfilename, outputfilename) hexbin(inputfilename, outputfilename) � N�binhex�hexbin�Errorc @ s e Zd ZdS )r N)�__name__� __module__�__qualname__� r r �/usr/lib64/python3.8/binhex.pyr s � i � �@ � �c @ s e Zd Zdd� ZdS )�FInfoc C s d| _ d| _d| _d S )Nz????r )�Type�Creator�Flags��selfr r r �__init__0 s zFInfo.__init__N)r r r r r r r r r / s r c C st t � }t�| d��2}|�d�}d|kr,d|_|�dd� |�� }W 5 Q R X tj� | �\}}|� ddd�}|||dfS ) N�rbi r ZTEXT� �:�-r )r �io�open�readr �seek�tell�os�path�split�replace)�name�finfo�fp�dataZdsize�dir�filer r r �getfileinfo5 s r' c @ s, e Zd Zdd� Zdd� Zdd� Zdd� Zd S ) �openrsrcc G s d S �Nr �r �argsr r r r C s zopenrsrc.__init__c G s dS �N� r r* r r r r F s z openrsrc.readc G s d S r) r r* r r r �writeI s zopenrsrc.writec C s d S r) r r r r r �closeL s zopenrsrc.closeN)r r r r r r. r/ r r r r r( B s r( c @ s0 e Zd ZdZdd� Zdd� Zdd� Zdd � Zd S )�_Hqxcoderenginez(Write data to the coder in 3-byte chunksc C s || _ d| _d| _td | _d S )Nr- r )�ofpr$ �hqxdata�LINELEN�linelen�r r1 r r r r R s z_Hqxcoderengine.__init__c C sh | j | | _ t| j �}|d d }| j d |� }| j |d � | _ |sHd S | jt�|� | _| �d� d S )N� r )r$ �lenr2 �binascii�b2a_hqx�_flush)r r$ ZdatalenZtodor r r r. X s z_Hqxcoderengine.writec C sr d}|t | j�| j krH|| j }| j�| j||� d � t| _|}q| j|d � | _|rn| j�| jd � d S )Nr � s : )r7 r2 r4 r1 r. r3 )r Zforce�firstZlastr r r r: c s z_Hqxcoderengine._flushc C s6 | j r| jt�| j � | _| �d� | j�� | `d S )Nr )r$ r2 r8 r9 r: r1 r/ r r r r r/ n s z_Hqxcoderengine.closeN)r r r �__doc__r r. r: r/ r r r r r0 O s r0 c @ s( e Zd ZdZdd� Zdd� Zdd� ZdS ) �_Rlecoderenginez4Write data to the RLE-coder in suitably large chunksc C s || _ d| _d S r, )r1 r$ r5 r r r r x s z_Rlecoderengine.__init__c C s@ | j | | _ t| j �tk rd S t�| j �}| j�|� d| _ d S r, )r$ r7 �REASONABLY_LARGEr8 �rlecode_hqxr1 r. )r r$ �rledatar r r r. | s z_Rlecoderengine.writec C s0 | j rt�| j �}| j�|� | j�� | `d S r) )r$ r8 r@ r1 r. r/ )r rA r r r r/ � s z_Rlecoderengine.closeN)r r r r= r r. r/ r r r r r> u s r> c @ sL e Zd Zdd� Zdd� Zdd� Zdd� Zd d � Zdd� Zd d� Z dd� Z dS )�BinHexc C s� |\}}}}d}t |t�r.|}t�|d�}d}zR|�d� t|�} t| �| _d| _|d kr`t � }|| _ || _| �||� t | _W n |r�|�� � Y nX d S )NF�wbTs0 (This file must be converted with BinHex 4.0) :r )� isinstance�strr r r. r0 r> r1 �crcr �dlen�rlen� _writeinfo�_DID_HEADER�stater/ ) r Zname_finfo_dlen_rlenr1 r! r" rG rH Zclose_on_errorZofnameZhqxerr r r r � s* zBinHex.__init__c C s� t |�}|dkrtd��t|g�|�d� d }|j|j }}t|t�rR|�d�}t|t�rf|�d�}|| }t� d|j �}t� d| j| j�} || | | } | � | � | �� d S )N�? zFilename too longzlatin-1� �>hz>ii)r7 r �bytes�encoder r rD rE �struct�packr rG rH �_write� _writecrc)r r! r" �nl�d�tpZcrZd2Zd3Zd4�infor r r rI � s zBinHex._writeinfoc C s t �|| j�| _| j�|� d S r) )r8 �crc_hqxrF r1 r. �r r$ r r r rS � s z BinHex._writec C s4 | j dk rd}nd}| j�t�|| j �� d| _ d S )Nr rN z>H)rF r1 r. rQ rR )r Zfmtr r r rT � s zBinHex._writecrcc C s0 | j tkrtd��| jt|� | _| �|� d S )NzWriting data at the wrong time)rK rJ r rG r7 rS rZ r r r r. � s zBinHex.writec C s, | j dkrtd| jf ��| �� t| _d S )Nr zIncorrect data size, diff=%r)rG r rH rT � _DID_DATArK r r r r � close_data� s zBinHex.close_datac C sB | j tk r| �� | j tkr$td��| jt|� | _| �|� d S )Nz'Writing resource data at the wrong time)rK r[ r\ r rH r7 rS rZ r r r � write_rsrc� s zBinHex.write_rsrcc C sx | j d krd S zJ| j tk r"| �� | j tkr4td��| jdkrNtd| jf ��| �� W 5 d | _ | j}| `|�� X d S )NzClose at the wrong timer z$Incorrect resource-datasize, diff=%r)rK r1 r/ r[ r\ r rH rT r5 r r r r/ � s zBinHex.closeN)r r r r rI rS rT r. r\ r] r/ r r r r rB � s rB c C s� t | �}t||�}t�| d��*}|�d�}|s0q<|�|� q |�� W 5 Q R X t| d�}|�d�}|shqt|�|� qX|� � |� � dS )zEbinhex(infilename, outfilename): create binhex-encoded copy of a filer � � N) r' rB r r r r. r\ r( r] r/ )�inp�outr" r1 �ifprV r r r r � s c @ s( e Zd ZdZdd� Zdd� Zdd� ZdS ) �_Hqxdecoderenginez*Read data via the decoder in 4-byte chunksc C s || _ d| _d S )Nr )ra �eof�r ra r r r r s z_Hqxdecoderengine.__init__c C s� d}|}|dkr�| j r|S |d d d }| j�|�}zt�|�\}| _ W q�W n tjk rd Y nX | j�d�}|s~td��|| }q6|| }|t|� }|s| j std��q|S )z&Read at least wtd bytes (or until EOF)r- r r r6 � r zPremature EOF on binhex file)rc ra r r8 Za2b_hqxZ Incompleter r7 )r ZtotalwtdZdecdata�wtdr$ Z decdatacur�newdatar r r r s* z_Hqxdecoderengine.readc C s | j �� d S r) �ra r/ r r r r r/ % s z_Hqxdecoderengine.closeN)r r r r= r r r/ r r r r rb � s rb c @ s0 e Zd ZdZdd� Zdd� Zdd� Zdd � Zd S )�_RledecoderenginezRead data via the RLE-coderc C s || _ d| _d| _d| _d S )Nr- r )ra � pre_buffer�post_bufferrc rd r r r r + s z_Rledecoderengine.__init__c C sD |t | j�kr"| �|t | j� � | jd |� }| j|d � | _|S r) )r7 rk �_fill)r rf �rvr r r r 1 s z_Rledecoderengine.readc C s� | j | j�|d � | _ | jjr>| jt�| j � | _d| _ d S t| j �}| j dd � td t krl|d }nX| j dd � tkr�|d }n<| j dd � td kr�|d }n| j dd� tkr�n|d }| jt�| j d |� � | _| j |d � | _ d S ) Nre r- �����rM r6 �����r �����r ) rj ra r rc rk r8 Z rledecode_hqxr7 �RUNCHAR)r rf Zmarkr r r rl 8 s* � �z_Rledecoderengine._fillc C s | j �� d S r) rh r r r r r/ [ s z_Rledecoderengine.closeN)r r r r= r r rl r/ r r r r ri ( s #ri c @ sL e Zd Zdd� Zdd� Zdd� Zdd� Zd d � Zdd� Zd d� Z dd� Z dS )�HexBinc C sf t |t�rt�|d�}|�d�}|s,td��|dkr6q|dkrqBqt|�}t|�| _d| _ | � � d S )Nr r zNo binhex data foundr; � :r )rD rE r r r r rb ri ra rF �_readheader)r ra ZchZhqxifpr r r r _ s zHexBin.__init__c C s | j �|�}t�|| j�| _|S r) )ra r r8 rY rF )r r7 r$ r r r �_readu s zHexBin._readc C sN t �d| j�d��d d@ }| jd@ | _|| jkrDtd| j|f ��d| _d S )NrN r r i�� zCRC error, computed %x, read %x)rQ �unpackra r rF r )r Zfilecrcr r r � _checkcrcz s �zHexBin._checkcrcc C s� | � d�}| � t|��}| � d�}| �� |dd� }|dd� }t�d|dd� �d }t�d|dd � �d | _t�d|d d� �d | _|| _t� | _|| j_ || j_ || j_t| _ d S ) Nr � � � rN � r z>l� )ru �ordrw rQ rv rG rH �FNamer r r r rJ rK )r r7 Zfname�rest�typeZcreator�flagsr r r rt � s zHexBin._readheaderc G sj | j tkrtd��|r,|d }t|| j�}n| j}d}t|�|k rZ|| �|t|� � }q6| j| | _|S )NzRead data at wrong timer r- )rK rJ r �minrG r7 ru )r �nrm r r r r � s zHexBin.readc C s6 | j tkrtd��| jr$| �| j�}| �� t| _ d S )Nzclose_data at wrong time)rK rJ r rG ru rw r[ �r Zdummyr r r r\ � s zHexBin.close_datac G sZ | j tkr| �� | j tkr$td��|r>|d }t|| j�}n| j}| j| | _| �|�S )Nz Read resource data at wrong timer )rK rJ r\ r[ r r� rH ru )r r� r r r � read_rsrc� s zHexBin.read_rsrcc C sD | j d krd S z| jr"| �| j�}| �� W 5 d | _ | j�� X d S r) )rK ra r/ rH r� rw r� r r r r/ � s zHexBin.closeN)r r r r ru rw rt r r\ r� r/ r r r r rr ^ s rr c C s� t | �}|j}|s|j}t�|d��"}|�d�}|s6qB|�|� q&W