14asciichat_error_t
compress_data(
const void *input,
size_t input_size,
void **output,
size_t *output_size,
15 int compression_level) {
16 if (!input || input_size == 0 || !output || !output_size) {
17 return SET_ERRNO(ERROR_INVALID_PARAM,
"Invalid parameters: input=%p, input_size=%zu, output=%p, output_size=%p",
18 input, input_size, output, output_size);
22 if (compression_level < 1 || compression_level > 9) {
23 return SET_ERRNO(ERROR_INVALID_PARAM,
"Invalid compression level %d: must be between 1 and 9", compression_level);
27 size_t compressed_size = ZSTD_compressBound(input_size);
31 if (compressed_size == 0 || compressed_size > 256 * 1024 * 1024) {
32 return SET_ERRNO(ERROR_INVALID_PARAM,
"ZSTD_compressBound returned unreasonable size: %zu for input %zu",
33 compressed_size, input_size);
36 unsigned char *compressed_data = NULL;
37 compressed_data = SAFE_MALLOC(compressed_size,
unsigned char *);
39 if (!compressed_data) {
40 return SET_ERRNO(ERROR_MEMORY,
"Failed to allocate compressed data buffer");
44 size_t ret = ZSTD_compress(compressed_data, compressed_size, input, input_size, compression_level);
46 if (ZSTD_isError(ret)) {
47 SAFE_FREE(compressed_data);
48 return SET_ERRNO(ERROR_GENERAL,
"zstd compression failed: %s", ZSTD_getErrorName(ret));
51 *output = compressed_data;
58asciichat_error_t
decompress_data(
const void *input,
size_t input_size,
void *output,
size_t output_size) {
59 if (!input || input_size == 0 || !output || output_size == 0) {
60 return SET_ERRNO(ERROR_INVALID_PARAM,
"Invalid parameters: input=%p, input_size=%zu, output=%p, output_size=%zu",
61 input, input_size, output, output_size);
64 size_t ret = ZSTD_decompress(output, output_size, input, input_size);
66 if (ZSTD_isError(ret)) {
67 return SET_ERRNO(ERROR_GENERAL,
"zstd decompression failed: %s", ZSTD_getErrorName(ret));
asciichat_error_t compress_data(const void *input, size_t input_size, void **output, size_t *output_size, int compression_level)