Files
minetestmapper/src/ZstdDecompressor.cpp
sfan5 9367e45e66 Fix broken buffer handling in ZlibDecompressor
40a5e16e21 added the broken reserve() call
and only by chance did 0a56b18cfb not break
it further because I forgot to remove the unconditional resize().

I should read my own code changes more often.
2025-04-07 23:20:08 +02:00

53 lines
1.1 KiB
C++

#include <zstd.h>
#include "ZstdDecompressor.h"
ZstdDecompressor::ZstdDecompressor():
m_data(nullptr),
m_seekPos(0),
m_size(0)
{
m_stream = ZSTD_createDStream();
}
ZstdDecompressor::~ZstdDecompressor()
{
ZSTD_freeDStream(reinterpret_cast<ZSTD_DStream*>(m_stream));
}
void ZstdDecompressor::setData(const u8 *data, size_t size, size_t seekPos)
{
m_data = data;
m_seekPos = seekPos;
m_size = size;
}
void ZstdDecompressor::decompress(ustring &buffer)
{
ZSTD_DStream *stream = reinterpret_cast<ZSTD_DStream*>(m_stream);
ZSTD_inBuffer inbuf = { m_data, m_size, m_seekPos };
// output space is extended in chunks of this size
constexpr size_t BUFSIZE = 8 * 1024;
if (buffer.empty())
buffer.resize(BUFSIZE);
ZSTD_outBuffer outbuf = { &buffer[0], buffer.size(), 0 };
ZSTD_initDStream(stream);
size_t ret;
do {
ret = ZSTD_decompressStream(stream, &outbuf, &inbuf);
if (ret && ZSTD_isError(ret))
throw DecompressError();
if (outbuf.size == outbuf.pos) {
outbuf.size += BUFSIZE;
buffer.resize(outbuf.size);
outbuf.dst = &buffer[0];
}
} while (ret != 0);
m_seekPos = inbuf.pos;
buffer.resize(outbuf.pos);
}