96 void *
const dst,
const size_t dst_size,
97 const void *
const src,
const size_t src_size,
98 size_t *
const actual_size,
103 if (dst_size < src_size) {
104 if (actual_size) *actual_size = src_size;
108 memcpy(dst, src, src_size);
109 if (actual_size) *actual_size = src_size;
114 if (!ctx->libdeflate_decompressor) {
115 struct libdeflate_options opts = {0};
116 opts.sizeof_options =
sizeof(opts);
117 opts.malloc_func = ctx->malloc_func;
118 opts.free_func = ctx->free_func;
120 ctx->libdeflate_decompressor = libdeflate_alloc_decompressor_ex(&opts);
121 if (!ctx->libdeflate_decompressor) {
126 const enum libdeflate_result res = libdeflate_gzip_decompress(ctx->libdeflate_decompressor,
132 if (res == LIBDEFLATE_INSUFFICIENT_SPACE) {
133 if (actual_size) *actual_size = 0;
149 if (!ctx->libdeflate_decompressor) {
150 struct libdeflate_options opts = {0};
151 opts.sizeof_options =
sizeof(opts);
152 opts.malloc_func = ctx->malloc_func;
153 opts.free_func = ctx->free_func;
155 ctx->libdeflate_decompressor = libdeflate_alloc_decompressor_ex(&opts);
156 if (!ctx->libdeflate_decompressor) {
161 const enum libdeflate_result res = libdeflate_zlib_decompress(ctx->libdeflate_decompressor,
167 if (res == LIBDEFLATE_INSUFFICIENT_SPACE) {
168 if (actual_size) *actual_size = 0;
184 if (!ctx->libdeflate_decompressor) {
185 struct libdeflate_options opts = {0};
186 opts.sizeof_options =
sizeof(opts);
187 opts.malloc_func = ctx->malloc_func;
188 opts.free_func = ctx->free_func;
190 ctx->libdeflate_decompressor = libdeflate_alloc_decompressor_ex(&opts);
191 if (!ctx->libdeflate_decompressor) {
196 const enum libdeflate_result res = libdeflate_deflate_decompress(ctx->libdeflate_decompressor,
202 if (res == LIBDEFLATE_INSUFFICIENT_SPACE) {
203 if (actual_size) *actual_size = 0;
219 if (src_size < LZ4F_MIN_SIZE_TO_KNOW_HEADER_LENGTH) {
223 const size_t header_size = LZ4F_headerSize(src, src_size);
224 if (LZ4F_isError(header_size) || header_size > src_size) {
229 const LZ4F_errorCode_t err = LZ4F_createDecompressionContext(&ctx->lz4_ctx, LZ4F_VERSION);
230 if (LZ4F_isError(err) || !ctx->lz4_ctx) {
235 size_t src_offset = 0, dst_offset = 0;
237 LZ4F_frameInfo_t info;
238 src_offset = src_size;
239 size_t res = LZ4F_getFrameInfo(ctx->lz4_ctx, &info, src, &src_offset);
241 if (LZ4F_isError(res)) {
242 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
246 if (info.contentSize > dst_size) {
247 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
248 if (actual_size) *actual_size = info.contentSize;
252 if (!actual_size && info.contentSize > 0 && info.contentSize < dst_size) {
253 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
258 size_t dst_chunk_size = dst_size - dst_offset;
259 size_t src_chunk_size = src_size - src_offset;
261 res = LZ4F_decompress(ctx->lz4_ctx,
262 (
char*)dst + dst_offset, &dst_chunk_size,
263 (
const char*)src + src_offset, &src_chunk_size,
266 if (LZ4F_isError(res)) {
267 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
271 dst_offset += dst_chunk_size;
272 src_offset += src_chunk_size;
275 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
277 if (actual_size) *actual_size = dst_offset;
281 if (src_offset >= src_size) {
282 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
286 if (dst_offset >= dst_size) {
287 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
288 if (actual_size) *actual_size = info.contentSize > 0 ? info.contentSize : 0;
300 const lzma_allocator allocator = {
301 .alloc = decompressor_lzma_malloc,
302 .free = decompressor_lzma_free,
306 lzma_stream stream = LZMA_STREAM_INIT;
307 stream.allocator = &allocator;
309 lzma_ret ret = lzma_stream_decoder(&stream, UINT64_MAX, 0);
310 if (ret != LZMA_OK) {
314 stream.next_in = (uint8_t *)src;
315 stream.avail_in = src_size;
316 stream.next_out = (uint8_t *)dst;
317 stream.avail_out = dst_size;
320 ret = lzma_code(&stream, LZMA_FINISH);
321 }
while (ret == LZMA_OK);
326 case LZMA_STREAM_END:
328 if (actual_size) *actual_size = stream.total_out;
331 if (stream.avail_out == 0) {
332 if (actual_size) *actual_size = 0;
336 case LZMA_MEM_ERROR:
case LZMA_MEMLIMIT_ERROR:
338 case LZMA_FORMAT_ERROR:
case LZMA_OPTIONS_ERROR:
case LZMA_DATA_ERROR:
349 if (!ctx->zstd_dctx) {
350 ctx->zstd_dctx = ZSTD_createDCtx();
354 ZSTD_inBuffer in = {src, src_size, 0};
355 ZSTD_outBuffer out = {dst, dst_size, 0};
358 while (in.pos < in.size && ret != 0) {
359 ret = ZSTD_decompressStream(ctx->zstd_dctx, &out, &in);
360 if (ZSTD_isError(ret)) {
361 ZSTD_DCtx_reset(ctx->zstd_dctx, ZSTD_reset_session_only);
362 if (ZSTD_getErrorCode(ret) == ZSTD_error_noForwardProgress_destFull) {
364 auto const frame_size = ZSTD_getFrameContentSize(src, src_size);
365 if (frame_size == ZSTD_CONTENTSIZE_UNKNOWN || frame_size == ZSTD_CONTENTSIZE_ERROR)
368 *actual_size = frame_size;
378 if (actual_size) *actual_size = out.pos;
391 bz_stream stream = {0};
392 stream.next_in = (
char *)src;
393 stream.avail_in = (unsigned)src_size;
394 stream.next_out = (
char *)dst;
395 stream.avail_out = (unsigned)dst_size;
396 stream.bzalloc = decompressor_bz2_malloc;
397 stream.bzfree = decompressor_bz2_free;
402 stream.next_out = &dummy;
403 stream.avail_out = 1;
406 int res = BZ2_bzDecompressInit(&stream, 0, 0);
411 if (stream.avail_out == 0) {
412 BZ2_bzDecompressEnd(&stream);
413 if (actual_size) *actual_size = 0;
416 res = BZ2_bzDecompress(&stream);
417 }
while (res == BZ_OK);
419 BZ2_bzDecompressEnd(&stream);
428 if (actual_size) *actual_size = (size_t)stream.total_out_lo32 + ((
size_t)stream.total_out_hi32 << 32);
431 case BZ_DATA_ERROR_MAGIC: