3 \6@sdZddlZddlZddlZddlZdddgZGdddeZdZdZ dZ d Z d Z Gd d d Z d dZGdddZGdddZGdddZGdddZddZGdddZGdddZGdddZddZdS)zMacintosh binhex compression/decompression. easy interface: binhex(inputfilename, outputfilename) hexbin(inputfilename, outputfilename) NbinhexhexbinErrorc@s eZdZdS)rN)__name__ __module__ __qualname__rr/usr/lib64/python3.6/binhex.pyrsi@c@seZdZddZdS)FInfocCsd|_d|_d|_dS)Nz????r)TypeCreatorFlags)selfrrr __init__0szFInfo.__init__N)rrrrrrrr r /sr c Cstt}tj|d2}|jd}d|kr,d|_|jdd|j}WdQRXtjj |\}}|j ddd}|||dfS) NrbirZTEXT:-r ) r ioopenreadrseektellospathsplitreplace)namefinfofpdataZdsizedirfilerrr getfileinfo5s  r&c@s,eZdZddZddZddZddZd S) openrsrccGsdS)Nr)rargsrrr rCszopenrsrc.__init__cGsdS)Nr)rr(rrr rFsz openrsrc.readcGsdS)Nr)rr(rrr writeIszopenrsrc.writecCsdS)Nr)rrrr closeLszopenrsrc.closeN)rrrrrr*r+rrrr r'Bsr'c@s0eZdZdZddZddZddZdd Zd S) _Hqxcoderenginez(Write data to the coder in 3-byte chunkscCs ||_d|_d|_td|_dS)Nr)r )ofpr#hqxdataLINELENlinelen)rr-rrr rRsz_Hqxcoderengine.__init__cCsh|j||_t|j}|dd}|jd|}|j|d|_|sHdS|jtj||_|jddS)Nr)r#lenr.binasciib2a_hqx_flush)rr#ZdatalenZtodorrr r*Xs   z_Hqxcoderengine.writecCsvd}xF|t|j|jkrJ||j}|jj|j||dt|_|}qW|j|d|_|rr|jj|jddS)Nr s: )r2r.r0r-r*r/)rforcefirstZlastrrr r5cs z_Hqxcoderengine._flushcCs6|jr|jtj|j|_|jd|jj|`dS)Nr )r#r.r3r4r5r-r+)rrrr r+ns   z_Hqxcoderengine.closeN)rrr__doc__rr*r5r+rrrr r,Os   r,c@s(eZdZdZddZddZddZdS) _Rlecoderenginez4Write data to the RLE-coder in suitably large chunkscCs||_d|_dS)Nr))r-r#)rr-rrr rxsz_Rlecoderengine.__init__cCs@|j||_t|jtkrdStj|j}|jj|d|_dS)Nr))r#r2REASONABLY_LARGEr3 rlecode_hqxr-r*)rr#rledatarrr r*|s    z_Rlecoderengine.writecCs0|jrtj|j}|jj||jj|`dS)N)r#r3r<r-r*r+)rr=rrr r+s    z_Rlecoderengine.closeN)rrrr9rr*r+rrrr r:usr:c@sLeZdZddZddZddZddZd d Zd d Zd dZ ddZ dS)BinHexc Cs|\}}}}d}t|tr.|}tj|d}d}yR|jdt|} t| |_d|_|dkr`t }||_ ||_ |j ||t |_Wn|r|jYnXdS)NFwbTs0(This file must be converted with BinHex 4.0) :r) isinstancestrrrr*r,r:r-crcr dlenrlen _writeinfo _DID_HEADERstater+) rZname_finfo_dlen_rlenr-r r!rCrDZclose_on_errorZofnameZhqxerrrr rs*       zBinHex.__init__c Cst|}|dkrtdt|g|jdd}|j|j}}t|trR|jd}t|trf|jd}||}tj d|j }tj d|j |j } |||| } |j | |jdS)N?zFilename too longzlatin-1z>hz>ii)r2rbytesencoderrr@rAstructpackrrCrD_write _writecrc) rr r!nldtpZcrZd2Zd3Zd4inforrr rEs     zBinHex._writeinfocCs tj||j|_|jj|dS)N)r3crc_hqxrBr-r*)rr#rrr rNsz BinHex._writecCs4|jdkrd}nd}|jjtj||jd|_dS)Nrz>hz>H)rBr-r*rLrM)rZfmtrrr rOs  zBinHex._writecrccCs0|jtkrtd|jt||_|j|dS)NzWriting data at the wrong time)rGrFrrCr2rN)rr#rrr r*s z BinHex.writecCs,|jdkrtd|jf|jt|_dS)NrzIncorrect data size, diff=%r)rCrrDrO _DID_DATArG)rrrr close_datas zBinHex.close_datacCsB|jtkr|j|jtkr$td|jt||_|j|dS)Nz'Writing resource data at the wrong time)rGrUrVrrDr2rN)rr#rrr write_rsrcs   zBinHex.write_rsrcc Csx|jdkrdSzJ|jtkr"|j|jtkr4td|jdkrNtd|jf|jWdd|_|j}|`|jXdS)NzClose at the wrong timerz$Incorrect resource-datasize, diff=%r)rGrUrVrrDrOr-r+)rr-rrr r+s     z BinHex.closeN) rrrrrErNrOr*rVrWr+rrrr r>s r>c Cst|}t||}tj|d.}x|jd}|s2P|j|q"W|jWdQRXt|d}x|jd}|snP|j|q^W|j |j dS)zEbinhex(infilename, outfilename): create binhex-encoded copy of a fileriN) r&r>rrrr*rVr'rWr+)inpoutr!r-ifprQrrr rs"    c@s(eZdZdZddZddZddZdS) _Hqxdecoderenginez*Read data via the decoder in 4-byte chunkscCs||_d|_dS)Nr)rZeof)rrZrrr rsz_Hqxdecoderengine.__init__c Csd}|}x|dkr|jr|S|ddd}|jj|}xRytj|\}|_PWntjk rfYnX|jjd}|std||}q:W||}|t|}| r |j r tdq W|S)z&Read at least wtd bytes (or until EOF)r)rrr1r zPremature EOF on binhex file)r\rZrr3Za2b_hqxZ Incompleterr2)rZtotalwtdZdecdatawtdr#Z decdatacurnewdatarrr rs,      z_Hqxdecoderengine.readcCs|jjdS)N)rZr+)rrrr r+%sz_Hqxdecoderengine.closeN)rrrr9rrr+rrrr r[s r[c@s0eZdZdZddZddZddZdd Zd S) _RledecoderenginezRead data via the RLE-codercCs||_d|_d|_d|_dS)Nr)r)rZ pre_buffer post_bufferr\)rrZrrr r+sz_Rledecoderengine.__init__cCsD|t|jkr"|j|t|j|jd|}|j|d|_|S)N)r2rb_fill)rr^rvrrr r1s z_Rledecoderengine.readcCs|j|jj|d|_|jjr>|jtj|j|_d|_dSt|j}|jddtdtkrl|d}nX|jddtkr|d}n<|jd dtdkr|d}n|jd d tkrn|d}|jtj|jd||_|j|d|_dS) Nr]r)r1rIr rrgrf) rarZrr\rbr3Z rledecode_hqxr2RUNCHAR)rr^Zmarkrrr rc8s&    z_Rledecoderengine._fillcCs|jjdS)N)rZr+)rrrr r+[sz_Rledecoderengine.closeN)rrrr9rrrcr+rrrr r`(s #r`c@sLeZdZddZddZddZddZd d Zd d Zd dZ ddZ dS)HexBincCsjt|trtj|d}x.|jd}|s.td|dkr8q|dkrPqWt|}t||_d|_ |j dS)Nrr zNo binhex data found :r) r@rArrrrr[r`rZrB _readheader)rrZZchZhqxifprrr r_s    zHexBin.__init__cCs |jj|}tj||j|_|S)N)rZrr3rTrB)rr2r#rrr _readus z HexBin._readcCsNtjd|jjddd@}|jd@|_||jkrDtd|j|fd|_dS)Nz>hrrizCRC error, computed %x, read %x)rLunpackrZrrBr)rZfilecrcrrr _checkcrczs   zHexBin._checkcrccCs|jd}|jt|}|jd}|j|dd}|dd}tjd|ddd}tjd |dd d|_tjd |d d d|_||_t|_||j_ ||j_ ||j_ t |_ dS)Nr r]r z>h rz>lrprqrrrsrt)rmordrorLrnrCrDFNamer rrrrFrG)rr2ZfnameresttypeZcreatorflagsrrr rls    zHexBin._readheadercGsn|jtkrtd|r,|d}t||j}n|j}d}x&t||kr\||j|t|}q8W|j||_|S)NzRead data at wrong timerr))rGrFrminrCr2rm)rnrdrrr rs  z HexBin.readcCs6|jtkrtd|jr$|j|j}|jt|_dS)Nzclose_data at wrong time)rGrFrrCrmrorU)rdummyrrr rVs   zHexBin.close_datacGsZ|jtkr|j|jtkr$td|r>|d}t||j}n|j}|j||_|j|S)Nz Read resource data at wrong timer)rGrFrVrUrrzrDrm)rr{rrr read_rsrcs   zHexBin.read_rsrcc CsD|jdkrdSz|jr"|j|j}|jWdd|_|jjXdS)N)rGrDr}rorZr+)rr|rrr r+s   z HexBin.closeN) rrrrrmrorlrrVr}r+rrrr ri^s  ric Cst|}|j}|s|j}tj|d&}x|jd}|s8P|j|q(WWdQRX|j|jd}|rt |d}|j|x|jd}|sP|j|q|W|j |j dS)z6hexbin(infilename, outfilename) - Decode binhexed filer?iN) rir rvrrrr*rVr}r'r+)rXrYrZr!r-rQrrr rs,     )r9rrrLr3__all__ ExceptionrrFrUr;r/rhr r&r'r,r:r>rr[r`rirrrrr s,   &^*6h