diff options
Diffstat (limited to 'hostTools/lzma/compress/7zlzma.cpp')
-rw-r--r-- | hostTools/lzma/compress/7zlzma.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/hostTools/lzma/compress/7zlzma.cpp b/hostTools/lzma/compress/7zlzma.cpp new file mode 100644 index 0000000..35468c1 --- /dev/null +++ b/hostTools/lzma/compress/7zlzma.cpp @@ -0,0 +1,79 @@ +#include "7z.h" + +#include "LZMAEncoder.h" +#include "LZMADecoder.h" + +bool compress_lzma_7z(const unsigned char* in_data, + unsigned in_size, + unsigned char* out_data, + unsigned& out_size, + unsigned algo, + unsigned dictionary_size, + unsigned num_fast_bytes) throw () { + try { + NCompress::NLZMA::CEncoder cc; + + // reduce the dictionary size if the file is small + while (dictionary_size > 8 && dictionary_size / 2 >= out_size) + dictionary_size /= 2; + + if (cc.SetDictionarySize(dictionary_size) != S_OK) + return false; + + if (cc.SetEncoderNumFastBytes(num_fast_bytes) != S_OK) + return false; + + if (cc.SetEncoderAlgorithm(algo) != S_OK) + return false; + + ISequentialInStream in(reinterpret_cast<const char*>(in_data), in_size); + ISequentialOutStream out(reinterpret_cast<char*>(out_data), out_size); + + UINT64 in_size_l = in_size; + + if (cc.WriteCoderProperties(&out) != S_OK) + return false; + + if (cc.Code(&in, &out, &in_size_l) != S_OK) + return false; + + out_size = out.size_get(); + + if (out.overflow_get()) + return false; + + return true; + } catch (...) { + return false; + } +} +#if 0 +bool decompress_lzma_7z(const unsigned char* in_data, + unsigned in_size, + unsigned char* out_data, + unsigned out_size) throw () { + try { + NCompress::NLZMA::CDecoder cc; + + ISequentialInStream in(reinterpret_cast<const char*>(in_data), in_size); + ISequentialOutStream out(reinterpret_cast<char*>(out_data), out_size); + + 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; + } +} +#endif + |