52 void *
const dst,
const size_t dst_size,
53 const void *
const src,
const size_t src_size,
54 size_t *
const actual_size,
59 if (dst_size < src_size) {
60 if (actual_size) *actual_size = src_size;
64 memcpy(dst, src, src_size);
65 if (actual_size) *actual_size = src_size;
69 if (!ctx->libdeflate_decompressor) {
70 struct libdeflate_options opts = {0};
71 opts.sizeof_options =
sizeof(opts);
72 opts.malloc_func = ctx->malloc_func;
73 opts.free_func = ctx->free_func;
75 ctx->libdeflate_decompressor = libdeflate_alloc_decompressor_ex(&opts);
76 if (!ctx->libdeflate_decompressor) {
81 const enum libdeflate_result res = libdeflate_gzip_decompress(ctx->libdeflate_decompressor,
87 if (res == LIBDEFLATE_INSUFFICIENT_SPACE) {
88 if (actual_size) *actual_size = 0;
100 if (!ctx->libdeflate_decompressor) {
101 struct libdeflate_options opts = {0};
102 opts.sizeof_options =
sizeof(opts);
103 opts.malloc_func = ctx->malloc_func;
104 opts.free_func = ctx->free_func;
106 ctx->libdeflate_decompressor = libdeflate_alloc_decompressor_ex(&opts);
107 if (!ctx->libdeflate_decompressor) {
112 const enum libdeflate_result res = libdeflate_zlib_decompress(ctx->libdeflate_decompressor,
118 if (res == LIBDEFLATE_INSUFFICIENT_SPACE) {
119 if (actual_size) *actual_size = 0;
131 if (!ctx->libdeflate_decompressor) {
132 struct libdeflate_options opts = {0};
133 opts.sizeof_options =
sizeof(opts);
134 opts.malloc_func = ctx->malloc_func;
135 opts.free_func = ctx->free_func;
137 ctx->libdeflate_decompressor = libdeflate_alloc_decompressor_ex(&opts);
138 if (!ctx->libdeflate_decompressor) {
143 const enum libdeflate_result res = libdeflate_deflate_decompress(ctx->libdeflate_decompressor,
149 if (res == LIBDEFLATE_INSUFFICIENT_SPACE) {
150 if (actual_size) *actual_size = 0;
162 if (src_size < LZ4F_MIN_SIZE_TO_KNOW_HEADER_LENGTH) {
166 const size_t header_size = LZ4F_headerSize(src, src_size);
167 if (LZ4F_isError(header_size) || header_size > src_size) {
172 const LZ4F_errorCode_t err = LZ4F_createDecompressionContext(&ctx->lz4_ctx, LZ4F_VERSION);
173 if (LZ4F_isError(err) || !ctx->lz4_ctx) {
178 size_t src_offset = 0, dst_offset = 0;
180 LZ4F_frameInfo_t info;
181 src_offset = src_size;
182 size_t res = LZ4F_getFrameInfo(ctx->lz4_ctx, &info, src, &src_offset);
184 if (LZ4F_isError(res)) {
185 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
189 if (info.contentSize > dst_size) {
190 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
191 if (actual_size) *actual_size = info.contentSize;
195 if (!actual_size && info.contentSize > 0 && info.contentSize < dst_size) {
196 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
201 size_t dst_chunk_size = dst_size - dst_offset;
202 size_t src_chunk_size = src_size - src_offset;
204 res = LZ4F_decompress(ctx->lz4_ctx,
205 (
char*)dst + dst_offset, &dst_chunk_size,
206 (
const char*)src + src_offset, &src_chunk_size,
209 if (LZ4F_isError(res)) {
210 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
214 dst_offset += dst_chunk_size;
215 src_offset += src_chunk_size;
218 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
220 if (actual_size) *actual_size = dst_offset;
224 if (src_offset >= src_size) {
225 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
229 if (dst_offset >= dst_size) {
230 LZ4F_resetDecompressionContext(ctx->lz4_ctx);
231 if (actual_size) *actual_size = info.contentSize > 0 ? info.contentSize : 0;
237 const lzma_allocator allocator = {
238 .alloc = decompressor_lzma_malloc,
239 .free = decompressor_lzma_free,
243 lzma_stream stream = LZMA_STREAM_INIT;
244 stream.allocator = &allocator;
246 lzma_ret ret = lzma_stream_decoder(&stream, UINT64_MAX, 0);
247 if (ret != LZMA_OK) {
251 stream.next_in = (uint8_t *)src;
252 stream.avail_in = src_size;
253 stream.next_out = (uint8_t *)dst;
254 stream.avail_out = dst_size;
257 ret = lzma_code(&stream, LZMA_FINISH);
258 }
while (ret == LZMA_OK);
263 case LZMA_STREAM_END:
265 if (actual_size) *actual_size = stream.total_out;
268 if (stream.avail_out == 0) {
269 if (actual_size) *actual_size = 0;
273 case LZMA_MEM_ERROR:
case LZMA_MEMLIMIT_ERROR:
275 case LZMA_FORMAT_ERROR:
case LZMA_OPTIONS_ERROR:
case LZMA_DATA_ERROR:
282 if (!ctx->zstd_dctx) {
283 ctx->zstd_dctx = ZSTD_createDCtx();
287 ZSTD_inBuffer in = {src, src_size, 0};
288 ZSTD_outBuffer out = {dst, dst_size, 0};
291 while (in.pos < in.size && ret != 0) {
292 ret = ZSTD_decompressStream(ctx->zstd_dctx, &out, &in);
293 if (ZSTD_isError(ret)) {
294 ZSTD_DCtx_reset(ctx->zstd_dctx, ZSTD_reset_session_only);
295 if (ZSTD_getErrorCode(ret) == ZSTD_error_noForwardProgress_destFull) {
297 auto const frame_size = ZSTD_getFrameContentSize(src, src_size);
298 if (frame_size == ZSTD_CONTENTSIZE_UNKNOWN || frame_size == ZSTD_CONTENTSIZE_ERROR)
301 *actual_size = frame_size;
311 if (actual_size) *actual_size = out.pos;