15 int compression_level) {
16 if (!input || input_size == 0 || !output || !output_size) {
18 input, input_size, output, output_size);
22 if (compression_level < 1 || compression_level > 9) {
27 size_t compressed_size = ZSTD_compressBound(input_size);
31 if (compressed_size == 0 || compressed_size > 256 * 1024 * 1024) {
33 compressed_size, input_size);
36 unsigned char *compressed_data = NULL;
37 compressed_data =
SAFE_MALLOC(compressed_size,
unsigned char *);
39 if (!compressed_data) {
44 size_t ret = ZSTD_compress(compressed_data, compressed_size, input, input_size, compression_level);
46 if (ZSTD_isError(ret)) {
51 *output = compressed_data;
59 if (!input || input_size == 0 || !output || output_size == 0) {
61 input, input_size, output, output_size);
64 size_t ret = ZSTD_decompress(output, output_size, input, input_size);
66 if (ZSTD_isError(ret)) {
75 if (original_size == 0)
78 float ratio = (float)compressed_size / (
float)original_size;
⚠️‼️ Error and/or exit() when things go bad.
📦 Network Packet Compression Utilities
#define SAFE_MALLOC(size, cast)
asciichat_error_t decompress_data(const void *input, size_t input_size, void *output, size_t output_size)
Decompress data using zstd.
bool should_compress(size_t original_size, size_t compressed_size)
Determine if compression should be used for given data sizes.
asciichat_error_t compress_data(const void *input, size_t input_size, void **output, size_t *output_size, int compression_level)
Compress data using zstd with configurable compression level.
#define COMPRESSION_RATIO_THRESHOLD
Compression ratio threshold - only use if <80% original size.
#define SET_ERRNO(code, context_msg,...)
Set error code with custom context message and log it.
asciichat_error_t
Error and exit codes - unified status values (0-255)