diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2024-03-15 15:26:38 +1100 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2024-03-15 15:26:38 +1100 |
commit | 6208636d69b5fde1d01d9361748c565d35816e20 (patch) | |
tree | 9d6022a5463b099b899bf36184e57127b81dd70b /source/core/StarZSTDCompression.cpp | |
parent | 662b83ff92cc2316fb962ff1608359f6d705a5f0 (diff) |
Fixes
Diffstat (limited to 'source/core/StarZSTDCompression.cpp')
-rw-r--r-- | source/core/StarZSTDCompression.cpp | 88 |
1 files changed, 39 insertions, 49 deletions
diff --git a/source/core/StarZSTDCompression.cpp b/source/core/StarZSTDCompression.cpp index 733b182..5c66c9a 100644 --- a/source/core/StarZSTDCompression.cpp +++ b/source/core/StarZSTDCompression.cpp @@ -7,6 +7,7 @@ CompressionStream::CompressionStream() : m_cStream(ZSTD_createCStream()) { ZSTD_CCtx_setParameter(m_cStream, ZSTD_c_enableLongDistanceMatching, 1); ZSTD_CCtx_setParameter(m_cStream, ZSTD_c_windowLog, 24); ZSTD_initCStream(m_cStream, 2); + m_output.resize(ZSTD_CStreamOutSize()); } CompressionStream::~CompressionStream() { ZSTD_freeCStream(m_cStream); } @@ -14,39 +15,33 @@ CompressionStream::~CompressionStream() { ZSTD_freeCStream(m_cStream); } ByteArray CompressionStream::compress(const char* in, size_t inLen) { size_t const cInSize = ZSTD_CStreamInSize (); size_t const cOutSize = ZSTD_CStreamOutSize(); - ByteArray output(cOutSize, 0); - size_t written = 0, read = 0; - while (read < inLen) { - ZSTD_inBuffer inBuffer = {in + read, min(cInSize, inLen - read), 0}; - ZSTD_outBuffer outBuffer = {output.ptr() + written, output.size() - written, 0}; - bool finished = false; - do { - size_t ret = ZSTD_compressStream2(m_cStream, &outBuffer, &inBuffer, ZSTD_e_flush); - if (ZSTD_isError(ret)) { - throw IOException(strf("ZSTD compression error {}", ZSTD_getErrorName(ret))); - break; - } + ZSTD_inBuffer inBuffer = {in, inLen, 0}; + size_t written = 0; + bool finished = false; + do { + ZSTD_outBuffer outBuffer = {m_output.ptr() + written, min(cOutSize, m_output.size() - written), 0}; + size_t ret = ZSTD_compressStream2(m_cStream, &outBuffer, &inBuffer, ZSTD_e_flush); + if (ZSTD_isError(ret)) { + throw IOException(strf("ZSTD compression error {}", ZSTD_getErrorName(ret))); + break; + } - if (outBuffer.pos == outBuffer.size) { - output.resize(output.size() * 2); - outBuffer.dst = output.ptr(); - outBuffer.size = output.size(); - continue; - } - - finished = ret == 0 && inBuffer.pos == inBuffer.size; - } while (!finished); - - read += inBuffer.pos; written += outBuffer.pos; - } - output.resize(written); - return output; + if (outBuffer.pos == outBuffer.size) { + if (written >= m_output.size()) + m_output.resize(m_output.size() * 2); + continue; + } + + finished = ret == 0 && inBuffer.pos == inBuffer.size; + } while (!finished); + return ByteArray(m_output.ptr(), written); } DecompressionStream::DecompressionStream() : m_dStream(ZSTD_createDStream()) { ZSTD_DCtx_setParameter(m_dStream, ZSTD_d_windowLogMax, 25); ZSTD_initDStream(m_dStream); + m_output.resize(ZSTD_DStreamOutSize()); } DecompressionStream::~DecompressionStream() { ZSTD_freeDStream(m_dStream); } @@ -54,31 +49,26 @@ DecompressionStream::~DecompressionStream() { ZSTD_freeDStream(m_dStream); } ByteArray DecompressionStream::decompress(const char* in, size_t inLen) { size_t const dInSize = ZSTD_DStreamInSize (); size_t const dOutSize = ZSTD_DStreamOutSize(); - ByteArray output(dOutSize, 0); - size_t written = 0, read = 0; - while (read < inLen) { - ZSTD_inBuffer inBuffer = {in + read, min(dInSize, inLen - read), 0}; - ZSTD_outBuffer outBuffer = {output.ptr() + written, output.size() - written, 0}; - do { - size_t ret = ZSTD_decompressStream(m_dStream, &outBuffer, &inBuffer); - if (ZSTD_isError(ret)) { - throw IOException(strf("ZSTD decompression error {}", ZSTD_getErrorName(ret))); - break; - } - - if (outBuffer.pos == outBuffer.size) { - output.resize(output.size() * 2); - outBuffer.dst = output.ptr(); - outBuffer.size = output.size(); - continue; - } - } while (inBuffer.pos < inBuffer.size); + ZSTD_inBuffer inBuffer = {in, inLen, 0}; + size_t written = 0; + bool finished = false; + do { + ZSTD_outBuffer outBuffer = {m_output.ptr() + written, min(dOutSize, m_output.size() - written), 0}; + size_t ret = ZSTD_decompressStream(m_dStream, &outBuffer, &inBuffer); + if (ZSTD_isError(ret)) { + throw IOException(strf("ZSTD decompression error {}", ZSTD_getErrorName(ret))); + break; + } - read += inBuffer.pos; written += outBuffer.pos; - } - output.resize(written); - return output; + if (outBuffer.pos == outBuffer.size) { + if (written >= m_output.size()) + m_output.resize(m_output.size() * 2); + continue; + } + finished = inBuffer.pos == inBuffer.size; + } while (!finished); + return ByteArray(m_output.ptr(), written); } }
\ No newline at end of file |