diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-02-15 21:45:56 +0100 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-02-15 21:45:56 +0100 |
commit | eff5021eaa6dc69f65ea1a8abe8f3ab11ef5eb0a (patch) | |
tree | 014068ef94f3aae867e035c0c30ba5e721555c09 /src/libutil/compression.cc | |
parent | bfdacb712c9a95b5c61857b2b3a7dd3cfd0faf3b (diff) |
Add xz compression function
This is used by the Hydra queue runner, but since it may also be
useful for the C++ rewrite of nix-push, I'm putting it here.
Diffstat (limited to 'src/libutil/compression.cc')
-rw-r--r-- | src/libutil/compression.cc | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/libutil/compression.cc b/src/libutil/compression.cc index eaaaf246b..a3fa0dab7 100644 --- a/src/libutil/compression.cc +++ b/src/libutil/compression.cc @@ -15,6 +15,46 @@ struct LzmaStream lzma_stream & operator()() { return strm; } }; +std::string compressXZ(const std::string & in) +{ + LzmaStream strm; + + // FIXME: apply the x86 BCJ filter? + + lzma_ret ret = lzma_easy_encoder( + &strm(), 6, LZMA_CHECK_CRC64); + if (ret != LZMA_OK) + throw Error("unable to initialise lzma encoder"); + + lzma_action action = LZMA_RUN; + uint8_t outbuf[BUFSIZ]; + string res; + strm().next_in = (uint8_t *) in.c_str(); + strm().avail_in = in.size(); + strm().next_out = outbuf; + strm().avail_out = sizeof(outbuf); + + while (true) { + + if (strm().avail_in == 0) + action = LZMA_FINISH; + + lzma_ret ret = lzma_code(&strm(), action); + + if (strm().avail_out == 0 || ret == LZMA_STREAM_END) { + res.append((char *) outbuf, sizeof(outbuf) - strm().avail_out); + strm().next_out = outbuf; + strm().avail_out = sizeof(outbuf); + } + + if (ret == LZMA_STREAM_END) + return res; + + if (ret != LZMA_OK) + throw Error("error while decompressing xz file"); + } +} + std::string decompressXZ(const std::string & in) { LzmaStream strm; |