e fh6@s9dZddlZddlZddlZddlZdddgZGdddeZdZdZ dZ d Z d Z Gd d d Z d dZGdddZGdddZGdddZGdddZddZGdddZGdddZGdddZddZdS)zMacintosh binhex compression/decompression. easy interface: binhex(inputfilename, outputfilename) hexbin(inputfilename, outputfilename) NbinhexhexbinErrorc@seZdZdS)rN)__name__ __module__ __qualname__rr+/opt/alt/python34/lib64/python3.4/binhex.pyrs i@sc@seZdZddZdS)FInfocCsd|_d|_d|_dS)Nz????r)TypeCreatorFlags)selfrrr __init__0s  zFInfo.__init__N)rrrrrrrr r /s r c Cst}tj|dJ}|jd}d|krEd|_n|jdd|j}WdQXtjj |\}}|j ddd}|||dfS) NrbirZTEXT:-r ) r ioopenreadr seektellospathsplitreplace)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&Bs    r&c@sFeZdZdZddZddZddZdd Zd S) _Hqxcoderenginez(Write data to the coder in 3-byte chunkscCs,||_d|_d|_td|_dS)Nr(r )ofpr"hqxdataLINELENlinelen)rr,rrr rRs   z_Hqxcoderengine.__init__cCs|j||_t|j}|dd}|jd|}|j|d|_|s`dS|jtj||_|jddS)Nr)r"lenr-binasciib2a_hqx_flush)rr"ZdatalenZtodorrr r)Xsz_Hqxcoderengine.writecCsd}x]|t|j|jkre||j}|jj|j||dt|_|}q W|j|d|_|r|jj|jdndS)Nrs s: )r1r-r/r,r)r.)rZforcefirstlastrrr r4cs !  z_Hqxcoderengine._flushcCsL|jr(|jtj|j|_n|jd|jj|`dS)Nr )r"r-r2r3r4r,r*)rrrr r*ns    z_Hqxcoderengine.closeN)rrr__doc__rr)r4r*rrrr r+Os   r+c@s:eZdZdZddZddZddZdS) _Rlecoderenginez4Write data to the RLE-coder in suitably large chunkscCs||_d|_dS)Nr()r,r")rr,rrr rxs z_Rlecoderengine.__init__cCsX|j||_t|jtkr)dStj|j}|jj|d|_dS)Nr()r"r1REASONABLY_LARGEr2 rlecode_hqxr,r))rr"rledatarrr r)|s z_Rlecoderengine.writecCsE|jr.tj|j}|jj|n|jj|`dS)N)r"r2r:r,r)r*)rr;rrr r*s   z_Rlecoderengine.closeN)rrrr7rr)r*rrrr r8us   r8c@speZdZddZddZddZddZd d Zd d Zd dZ ddZ dS)BinHexc Cs|\}}}}d}t|trH|}tj|d}d}nyx|jdt|} t| |_d|_|dkrt }n||_ ||_ |j ||t |_Wn|r|jnYnXdS)NFwbTs0(This file must be converted with BinHex 4.0) :r) isinstancestrrrr)r+r8r,crcr dlenrlen _writeinfo _DID_HEADERstater*) rZname_finfo_dlen_rlenr,rr rArBZclose_on_errorZofnameZhqxerrrr rs*          zBinHex.__init__c Cst|}|dkr'tdnt|g|jdd}|j|j}}t|tr{|jd}nt|tr|jd}n||}tj d|j }tj d|j |j } |||| } |j | |jdS)N?zFilename too longzlatin-1sz>hz>ii)r1rbytesencoder rr>r?structpackrrArB_write _writecrc) rrr nldZtpZcrZd2Zd3Zd4inforrr rCs     zBinHex._writeinfocCs,tj||j|_|jj|dS)N)r2crc_hqxr@r,r))rr"rrr rKsz BinHex._writecCsJ|jdkrd}nd}|jjtj||jd|_dS)Nrz>hz>H)r@r,r)rIrJ)rZfmtrrr rLs  zBinHex._writecrccCsE|jtkrtdn|jt||_|j|dS)NzWriting data at the wrong time)rErDrrAr1rK)rr"rrr r)sz BinHex.writecCs?|jdkr(td|jfn|jt|_dS)NrzIncorrect data size, diff=%r)rArrBrL _DID_DATArE)rrrr close_datas zBinHex.close_datacCsa|jtkr|jn|jtkr:tdn|jt||_|j|dS)Nz'Writing resource data at the wrong time)rErQrRrrBr1rK)rr"rrr write_rsrcs  zBinHex.write_rsrcc Cs|jdkrdSzp|jtkr2|jn|jtkrPtdn|jdkrxtd|jfn|jWdd|_|j}|`|jXdS)NzClose at the wrong timerz$Incorrect resource-datasize, diff=%r)rErQrRrrBrLr,r*)rr,rrr r*s   z BinHex.closeN) rrrrrCrKrLr)rRrSr*rrrr r<s       r<cCst|}t||}tj|d}x*|jd}|sIPn|j|q0W|j|jt|d}x*|jd}|sPn|j |qW|j|jdS)zEbinhex(infilename, outfilename): create binhex-encoded copy of a fileriN) r%r<rrrr)rRr*r&rS)inpoutr r,ifprNrrr rs$    c@s:eZdZdZddZddZddZdS) _Hqxdecoderenginez*Read data via the decoder in 4-byte chunkscCs||_d|_dS)Nr)rVeof)rrVrrr rs z_Hqxdecoderengine.__init__c Csd}|}x|dkr|jr(|S|ddd}|jj|}xjytj|\}|_PWntjk rYnX|jjd}|stdn||}qOW||}|t|}| r|j rtdqqW|S)z&Read at least wtd bytes (or until EOF)r(rrr0r zPremature EOF on binhex file)rXrVrr2Za2b_hqxZ Incompleterr1)rZtotalwtdZdecdatawtdr"Z decdatacurnewdatarrr rs,  z_Hqxdecoderengine.readcCs|jjdS)N)rVr*)rrrr r*&sz_Hqxdecoderengine.closeN)rrrr7rrr*rrrr rWs   rWc@sFeZdZdZddZddZddZdd Zd S) _RledecoderenginezRead data via the RLE-codercCs(||_d|_d|_d|_dS)Nr(r)rV pre_buffer post_bufferrX)rrVrrr r,s   z_Rledecoderengine.__init__cCs_|t|jkr2|j|t|jn|jd|}|j|d|_|S)N)r1r^_fill)rrZrvrrr r2s z_Rledecoderengine.readcCsH|j|jj|d|_|jjrU|jtj|j|_d|_dSt|j}|jddtdtkr|d}nv|jddtkr|d}nP|jd dtdkr|d}n&|jd d tkrn |d}|jtj|jd||_|j|d|_dS) NrYr(r0sr rrcrb) r]rVrrXr^r2Z rledecode_hqxr1RUNCHAR)rrZmarkrrr r_9s&    !     z_Rledecoderengine._fillcCs|jjdS)N)rVr*)rrrr r*\sz_Rledecoderengine.closeN)rrrr7rrr_r*rrrr r\)s    #r\c@speZdZddZddZddZddZd d Zd d Zd dZ ddZ dS)HexBincCst|tr$tj|d}nxJ|jd}|sKtdn|dkr]q'n|dkr'Pq'q'Wt|}t||_d|_ |j dS)Nrr zNo binhex data founds :r) r>r?rrrrrWr\rVr@ _readheader)rrVZchZhqxifprrr r`s    zHexBin.__init__cCs.|jj|}tj||j|_|S)N)rVrr2rPr@)rr1r"rrr _readvsz HexBin._readcCsntjd|jjddd@}|jd@|_||jkratd|j|fnd|_dS)Nz>hrrizCRC error, computed %x, read %x)rIunpackrVrr@r)rZfilecrcrrr _checkcrc{s &zHexBin._checkcrccCs |jd}|jt|}|jd}|j|dd}|dd}tjd|ddd}tjd |dd d|_tjd |d d d|_||_t|_||j_ ||j_ ||j_ t |_ dS)Nr rYr z>h rz>lrlrmrnrorp)riordrkrIrjrArBFNamer rr rrDrE)rr1ZfnameresttypeZcreatorflagsrrr rhs  ##     zHexBin._readheadercGs|jtkrtdn|rC|d}t||j}n |j}d}x3t||kr||j|t|}qUW|j||_|S)NzRead data at wrong timerr()rErDrminrAr1ri)rnr`rrr rs  !z HexBin.readcCsS|jtkrtdn|jr<|j|j}n|jt|_dS)Nzclose_data at wrong time)rErDrrArirkrQ)rdummyrrr rRs   zHexBin.close_datacGs|jtkr|jn|jtkr:tdn|r_|d}t||j}n |j}|j||_|j|S)Nz Read resource data at wrong timer)rErDrRrQrrvrBri)rrwrrr read_rsrcs   zHexBin.read_rsrcc Cs]|jdkrdSz,|jr4|j|j}n|jWdd|_|jjXdS)N)rErBryrkrVr*)rrxrrr r*s  z HexBin.closeN) rrrrrirkrhrrRryr*rrrr rf_s       rfcCst|}|j}|s'|j}ntj|d}x*|jd}|sUPn|j|q<W|j|j|j d}|rt |d}|j|x*|j d}|sPn|j|qW|jn|jdS)z6hexbin(infilename, outfilename) - Decode binhexed filer=iN) rfr rrrrrr)r*rRryr&)rTrUrVr r,rNrrr rs.       )r7rrrIr2__all__ ExceptionrrDrQr9r.rdr r%r&r+r8r<rrWr\rfrrrrr s,      &^ *6h