bool decompress_lzma_7z(ISequentialInStream& in, unsigned in_size, ISequentialOutStream& out, unsigned out_size) throw () { try { NCompress::NLZMA::CDecoder cc; UINT64 in_size_l = in_size; UINT64 out_size_l = out_size; if (cc.ReadCoderProperties(&in) != S_OK) { return(false); } if (cc.Code(&in, &out, &in_size_l, &out_size_l) != S_OK) { return(false); } if (out.size_get() != out_size || out.overflow_get()) { return(false); } return(true); } catch (...) { return(false); } }
int lzma_decompress( int dictionarySize, int hashSize, int algorithm, int numFastBytes, int matchFinder, int matchFinderCycles, int posStateBits, int litContextBits, int litPosBits, CALLBACK_FUNC *callback, void *auxdata ) { CallbackInStream inStream (callback, auxdata); CallbackOutStream outStream (callback, auxdata); NCompress::NLZMA::CDecoder* decoder = new NCompress::NLZMA::CDecoder; if (decoder->SetupProperties(dictionarySize, posStateBits, litContextBits, litPosBits) != S_OK) { delete decoder; return 1; } UInt64 fileSize = (UInt64)-1; HRESULT result = decoder->Code(&inStream, &outStream, 0, &fileSize, 0); delete decoder; if (inStream.errcode) return inStream.errcode; if (outStream.errcode) return outStream.errcode; if (result == E_OUTOFMEMORY) { return FREEARC_ERRCODE_NOT_ENOUGH_MEMORY; } if (result != S_OK) { //fprintf(stderr, "\nDecoder error = %X\n", (unsigned int)result); return FREEARC_ERRCODE_GENERAL; } return 0; }