diff options
| author | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 | 
|---|---|---|
| committer | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 | 
| commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
| tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/blockcodecs/codecs/bzip/bzip.cpp | |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/blockcodecs/codecs/bzip/bzip.cpp')
| -rw-r--r-- | library/cpp/blockcodecs/codecs/bzip/bzip.cpp | 62 | 
1 files changed, 62 insertions, 0 deletions
| diff --git a/library/cpp/blockcodecs/codecs/bzip/bzip.cpp b/library/cpp/blockcodecs/codecs/bzip/bzip.cpp new file mode 100644 index 00000000000..3a5cfdd0e9a --- /dev/null +++ b/library/cpp/blockcodecs/codecs/bzip/bzip.cpp @@ -0,0 +1,62 @@ +#include <library/cpp/blockcodecs/core/codecs.h> +#include <library/cpp/blockcodecs/core/common.h> +#include <library/cpp/blockcodecs/core/register.h> + +#include <contrib/libs/libbz2/bzlib.h> + +using namespace NBlockCodecs; + +namespace { +    struct TBZipCodec: public TAddLengthCodec<TBZipCodec> { +        inline TBZipCodec(int level) +            : Level(level) +            , MyName("bzip2-" + ToString(Level)) +        { +        } + +        static inline size_t DoMaxCompressedLength(size_t in) noexcept { +            // very strange +            return in * 2 + 128; +        } + +        TStringBuf Name() const noexcept override { +            return MyName; +        } + +        inline size_t DoCompress(const TData& in, void* buf) const { +            unsigned int ret = DoMaxCompressedLength(in.size()); +            const int res = BZ2_bzBuffToBuffCompress((char*)buf, &ret, (char*)in.data(), in.size(), Level, 0, 0); +            if (res != BZ_OK) { +                ythrow TCompressError(res); +            } + +            return ret; +        } + +        inline void DoDecompress(const TData& in, void* out, size_t len) const { +            unsigned int tmp = SafeIntegerCast<unsigned int>(len); +            const int res = BZ2_bzBuffToBuffDecompress((char*)out, &tmp, (char*)in.data(), in.size(), 0, 0); + +            if (res != BZ_OK) { +                ythrow TDecompressError(res); +            } + +            if (len != tmp) { +                ythrow TDecompressError(len, tmp); +            } +        } + +        const int Level; +        const TString MyName; +    }; + +    struct TBZipRegistrar { +        TBZipRegistrar() { +            for (int i = 1; i < 10; ++i) { +                RegisterCodec(MakeHolder<TBZipCodec>(i)); +            } +            RegisterAlias("bzip2", "bzip2-6"); +        } +    }; +    const TBZipRegistrar Registrar{}; +} | 
