#include "lz.h" #include #include #include #include #include #include #include #include #include #include #include #include #ifndef OPENSOURCE #include "minilzo.h" #include "quicklz.h" #endif /* * FastLZ */ class TFastLZ { public: static const char signature[]; static inline size_t Hint(size_t len) noexcept { return Max((size_t)(len * 1.06), 100); } inline size_t Compress(const char* data, size_t len, char* ptr, size_t /*dstMaxSize*/) { return fastlz_compress(data, len, ptr); } inline size_t Decompress(const char* data, size_t len, char* ptr, size_t max) { return fastlz_decompress(data, len, ptr, max); } inline void InitFromStream(IInputStream*) const noexcept { } static inline bool SaveIncompressibleChunks() noexcept { return false; } }; const char TFastLZ::signature[] = "YLZF"; DEF_COMPRESSOR(TLzfCompress, TFastLZ) DEF_DECOMPRESSOR(TLzfDecompress, TFastLZ) template static TAutoPtr TryOpenLzDecompressorX(const TDecompressSignature& s, T input) { if (s.Check()) return new TLzDecompressInput(input); if (s.Check()) return new TLzDecompressInput(input); #ifndef OPENSOURCE if (auto result = TryOpenMiniLzoDecompressor(s, input)) return result; #endif if (s.Check()) return new TLzDecompressInput(input); #ifndef OPENSOURCE if (auto result = TryOpenQuickLzDecompressor(s, input)) return result; #endif return nullptr; } template static inline TAutoPtr TryOpenLzDecompressorImpl(const TStringBuf& signature, T input) { if (signature.size() == SIGNATURE_SIZE) { TMemoryInput mem(signature.data(), signature.size()); TDecompressSignature s(&mem); return TryOpenLzDecompressorX(s, input); } return nullptr; } template static inline TAutoPtr TryOpenLzDecompressorImpl(T input) { TDecompressSignature s(&*input); return TryOpenLzDecompressorX(s, input); } template static inline TAutoPtr OpenLzDecompressorImpl(T input) { TAutoPtr ret = TryOpenLzDecompressorImpl(input); if (!ret) { ythrow TDecompressorError() << "Unknown compression format"; } return ret; } TAutoPtr OpenLzDecompressor(IInputStream* input) { return OpenLzDecompressorImpl(input); } TAutoPtr TryOpenLzDecompressor(IInputStream* input) { return TryOpenLzDecompressorImpl(input); } TAutoPtr TryOpenLzDecompressor(const TStringBuf& signature, IInputStream* input) { return TryOpenLzDecompressorImpl(signature, input); } TAutoPtr OpenOwnedLzDecompressor(TAutoPtr input) { return OpenLzDecompressorImpl(input); } TAutoPtr TryOpenOwnedLzDecompressor(TAutoPtr input) { return TryOpenLzDecompressorImpl(input); } TAutoPtr TryOpenOwnedLzDecompressor(const TStringBuf& signature, TAutoPtr input) { return TryOpenLzDecompressorImpl(signature, input); }