90 void *dst,
const size_t dst_max_size,
91 const void *src,
const size_t src_size,
98 if (dst_max_size < src_size) {
101 memcpy(dst, src, src_size);
102 *actual_size = src_size;
108 struct libdeflate_compressor *compressor = ctx->libdeflate_compressor[level];
110 const int libdeflate_level =
118 struct libdeflate_options opts = {0};
119 opts.sizeof_options =
sizeof(opts);
120 opts.free_func = ctx->free_func;
121 opts.malloc_func = ctx->malloc_func;
123 compressor = libdeflate_alloc_compressor_ex(libdeflate_level, &opts);
127 ctx->libdeflate_compressor[level] = compressor;
130 const size_t size = libdeflate_gzip_compress(compressor,
145 struct libdeflate_compressor *compressor = ctx->libdeflate_compressor[level];
147 const int libdeflate_level =
155 struct libdeflate_options opts = {0};
156 opts.sizeof_options =
sizeof(opts);
157 opts.free_func = ctx->free_func;
158 opts.malloc_func = ctx->malloc_func;
160 compressor = libdeflate_alloc_compressor_ex(libdeflate_level, &opts);
164 ctx->libdeflate_compressor[level] = compressor;
167 const size_t size = libdeflate_zlib_compress(compressor,
182 struct libdeflate_compressor *compressor = ctx->libdeflate_compressor[level];
184 const int libdeflate_level =
192 struct libdeflate_options opts = {0};
193 opts.sizeof_options =
sizeof(opts);
194 opts.free_func = ctx->free_func;
195 opts.malloc_func = ctx->malloc_func;
197 compressor = libdeflate_alloc_compressor_ex(libdeflate_level, &opts);
201 ctx->libdeflate_compressor[level] = compressor;
204 const size_t size = libdeflate_deflate_compress(compressor,
219 LZ4F_preferences_t prefs = LZ4F_INIT_PREFERENCES;
220 prefs.frameInfo.contentSize = src_size;
221 prefs.compressionLevel =
227 LZ4HC_CLEVEL_DEFAULT;
229 const size_t size = LZ4F_compressFrame(
234 if (LZ4F_isError(size)) {
248 const lzma_allocator allocator = {
249 .alloc = compressor_lzma_malloc,
250 .free = compressor_lzma_free,
254 lzma_stream stream = LZMA_STREAM_INIT;
255 stream.allocator = &allocator;
257 const uint32_t preset =
265 lzma_ret ret = lzma_easy_encoder(&stream, preset, LZMA_CHECK_CRC64);
266 if (ret != LZMA_OK) {
270 stream.next_in = (uint8_t *)src;
271 stream.avail_in = src_size;
272 stream.next_out = (uint8_t *)dst;
273 stream.avail_out = dst_max_size;
276 ret = lzma_code(&stream, LZMA_FINISH);
277 }
while (ret == LZMA_OK);
282 case LZMA_STREAM_END:
283 *actual_size = stream.total_out;
286 if (stream.avail_out == 0) {
301 if (!ctx->zstd_cctx) {
302 ctx->zstd_cctx = ZSTD_createCCtx();
306 const int compression_level =
314 const size_t size = ZSTD_compressCCtx(ctx->zstd_cctx,
319 switch (ZSTD_getErrorCode(size)) {
320 case ZSTD_error_no_error:
323 case ZSTD_error_dstSize_tooSmall:
325 case ZSTD_error_memory_allocation:
337 if (src_size > UINT_MAX)
340 bz_stream stream = {0};
341 stream.next_in = (
char *)src;
342 stream.avail_in = (unsigned)src_size;
343 stream.next_out = (
char *)dst;
344 stream.avail_out = (unsigned)dst_max_size;
345 stream.bzalloc = compressor_bz2_malloc;
346 stream.bzfree = compressor_bz2_free;
349 const int block_size =
357 int res = BZ2_bzCompressInit(&stream, block_size, 0, 0);
362 if (stream.avail_out == 0) {
363 BZ2_bzCompressEnd(&stream);
367 res = BZ2_bzCompress(&stream, BZ_FINISH);
368 }
while (res == BZ_FINISH_OK);
370 BZ2_bzCompressEnd(&stream);
374 *actual_size = (size_t)stream.total_out_lo32 + ((
size_t)stream.total_out_hi32 << 32);
enum clod_compression_result clod_compress(struct clod_compressor *ctx, void *dst, const size_t dst_max_size, const void *src, const size_t src_size, size_t *actual_size, const enum clod_compression_method method, const enum clod_compression_level level)