3 ^6c@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.pyrii@sc@seZdZddZdS)FInfocCsd|_d|_d|_dS)Nz????r)TypeCreatorFlagsselfrrr__init__0szFInfo.__init__N)rrrrrrrrr /r r c Cstt}tj|d2}|jd}d|kr,d|_|jdd|j}WdQRXtjj |\}}|j ddd}|||dfS) NrbirZTEXTz:z-r ) r ioopenreadr ZseekZtellosZpathZsplitZreplace)namefinfoZfpdataZdsizeZdirZfilerrr getfileinfo5s  rc@s,eZdZddZddZddZddZd S) openrsrccGdSNrrZargsrrrrCzopenrsrc.__init__cGsdSNrrrrrrFr z openrsrc.readcGrrrrrrrwriteIr zopenrsrc.writecCrrrrrrrcloseLr zopenrsrc.closeN)rrrrrr#r$rrrrrBsrc@0eZdZdZddZddZddZdd Zd S) _Hqxcoderenginez(Write data to the coder in 3-byte chunkscCs ||_d|_d|_td|_dS)Nr"r )ofprhqxdataLINELENlinelenrr'rrrrRz_Hqxcoderengine.__init__cCsh|j||_t|j}|dd}|jd|}|j|d|_|sHdS|jtj||_|jddS)Nr)rlenr(binasciib2a_hqx_flush)rrZdatalenZtodorrrr#Xs   z_Hqxcoderengine.writecCsvd}xF|t|j|jkrJ||j}|jj|j||dt|_|}qW|j|d|_|rr|jj|jddS)Nrs s: )r.r(r*r'r#r))rZforceZfirstZlastrrrr1cs z_Hqxcoderengine._flushcCs6|jr|jtj|j|_|jd|jj|`dS)Nr )rr(r/r0r1r'r$rrrrr$ns   z_Hqxcoderengine.closeN)rrr__doc__rr#r1r$rrrrr&Os   r&c@(eZdZdZddZddZddZdS) _Rlecoderenginez4Write data to the RLE-coder in suitably large chunkscC||_d|_dSr!)r'rr+rrrrxz_Rlecoderengine.__init__cCs@|j||_t|jtkrdStj|j}|jj|d|_dSr!)rr.REASONABLY_LARGEr/ rlecode_hqxr'r#)rrrledatarrrr#|s    z_Rlecoderengine.writecCs0|jrtj|j}|jj||jj|`dSr)rr/r8r'r#r$)rr9rrrr$s    z_Rlecoderengine.closeN)rrrr2rr#r$rrrrr4usr4c@LeZdZddZddZddZddZd 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&r4r'crcr dlenrlen _writeinfo _DID_HEADERstater$) rZname_finfo_dlen_rlenr'rrr@rAZclose_on_errorZofnameZhqxerrrrrs*       zBinHex.__init__c Cst|}|dkrtdt|g|jdd}|j|j}}t|trR|jd}t|trf|jd}||}tj d|j }tj d|j |j } |||| } |j | |jdS)Ni?zFilename too longzlatin-1>hz>ii)r.rZbytesZencoder r r=r>structpackrr@rA_write _writecrc) rrrZnldZtpZcrZd2Zd3Zd4ZinforrrrBs     zBinHex._writeinfocCs tj||j|_|jj|dSr)r/crc_hqxr?r'r#rrrrrrIsz BinHex._writecCs4|jdkrd}nd}|jjtj||jd|_dS)NrrFz>H)r?r'r#rGrH)rZfmtrrrrJs  zBinHex._writecrccCs0|jtkrtd|jt||_|j|dS)NzWriting data at the wrong time)rDrCrr@r.rIrMrrrr#s z BinHex.writecCs,|jdkrtd|jf|jt|_dS)NrzIncorrect data size, diff=%r)r@rrArJ _DID_DATArDrrrr close_datas zBinHex.close_datacCsB|jtkr|j|jtkr$td|jt||_|j|dS)Nz'Writing resource data at the wrong time)rDrNrOrrAr.rIrMrrr 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)rDrNrOrrArJr'r$r+rrrr$s     z BinHex.closeN) rrrrrBrIrJr#rOrPr$rrrrr;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 filerN) rr;rrrr#rOrrPr$)inpoutrr'ifprKrrrrs"    c@r3) _Hqxdecoderenginez*Read data via the decoder in 4-byte chunkscCr5)Nr)rTeofrrTrrrrr6z_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"rrr-r zPremature EOF on binhex file)rVrTrr/Za2b_hqxZ Incompleterr.)rZtotalwtdZdecdatawtdrZ decdatacurZnewdatarrrrs,      z_Hqxdecoderengine.readcC|jjdSrrTr$rrrrr$%r z_Hqxdecoderengine.closeN)rrrr2rrr$rrrrrUs rUc@r%) _RledecoderenginezRead data via the RLE-codercCs||_d|_d|_d|_dS)Nr"r)rT pre_buffer post_bufferrVrWrrrr+r,z_Rledecoderengine.__init__cCsD|t|jkr"|j|t|j|jd|}|j|d|_|Sr)r.r^_fill)rrYrvrrrr1s 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) NrXr"r-rEr rirbra) r]rTrrVr^r/Z rledecode_hqxr.RUNCHAR)rrYZmarkrrrr_8s&    z_Rledecoderengine._fillcCrZrr[rrrrr$[r z_Rledecoderengine.closeN)rrrr2rrr_r$rrrrr\(s #r\c@r:)HexBincCsjt|trtj|d}x.|jd}|s.td|dkr8q|dkrPqWt|}t||_d|_ |j dS)Nrr zNo binhex data founds s:r) r=r>rrrrrUr\rTr? _readheader)rrTZchZhqxifprrrr_s    zHexBin.__init__cCs |jj|}tj||j|_|Sr)rTrr/rLr?)rr.rrrr_readus z HexBin._readcCsNtjd|jjddd@}|jd@|_||jkrDtd|j|fd|_dS)NrFrrizCRC error, computed %x, read %x)rGunpackrTrr?r)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 rXr rF rz>lrirjrkrlrm)rfZordrhrGrgr@rAFNamer r r rrCrD)rr.ZfnameZrestZtypeZcreatorZflagsrrrres    zHexBin._readheadercGsn|jtkrtd|r,|d}t||j}n|j}d}x&t||kr\||j|t|}q8W|j||_|S)NzRead data at wrong timerr")rDrCrminr@r.rf)rnr`rrrrs  z HexBin.readcCs6|jtkrtd|jr$|j|j}|jt|_dS)Nzclose_data at wrong time)rDrCrr@rfrhrNrZdummyrrrrOs   zHexBin.close_datacGsZ|jtkr|j|jtkr$td|r>|d}t||j}n|j}|j||_|j|S)Nz Read resource data at wrong timer)rDrCrOrNrrorArf)rrprrr read_rsrcs   zHexBin.read_rsrcc CsD|jdkrdSz|jr"|j|j}|jWdd|_|jjXdSr)rDrArrrhrTr$rqrrrr$s   z HexBin.closeN) rrrrrfrhrerrOrrr$rrrrrd^s  rdc 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<rQN) rdr rnrrrr#rOrrrr$)rRrSrTrr'rKrrrrs,     )r2rrrGr/Z__all__Z ExceptionrrCrNr7r)rcr rrr&r4r;rrUr\rdrrrrrZs,   &^*6h