Mercurial > sci
diff util.c @ 1:5afdb14df924
sci: add support for storing results
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 08 Jun 2021 08:40:01 +0200 |
parents | f1de39079243 |
children | 5fa3d2f479b2 |
line wrap: on
line diff
--- a/util.c Mon Jun 07 09:41:37 2021 +0200 +++ b/util.c Tue Jun 08 08:40:01 2021 +0200 @@ -25,6 +25,9 @@ #include <stdlib.h> #include <string.h> +#include <zstd.h> + +#include "base64.h" #include "util.h" void * @@ -158,3 +161,67 @@ return buf; } + +char * +util_zbase64_enc(const char *src) +{ + assert(src); + + char *zstd, *b64; + size_t zstdsz, b64sz, len; + + len = strlen(src); + zstdsz = ZSTD_compressBound(len); + zstd = util_malloc(zstdsz); + + if (ZSTD_isError(zstdsz = ZSTD_compress(zstd, zstdsz, src, len, 18))) { + free(zstd); + return NULL; + } + + b64sz = B64_ENCODE_LENGTH(zstdsz); + b64 = util_calloc(1, b64sz + 1); + b64_encode(zstd, zstdsz, b64, b64sz); + free(zstd); + + return b64; +} + +char * +util_zbase64_dec(const char *src) +{ + assert(src); + + char *zstd, *text; + size_t zstdsz, textsz, len; + + len = strlen(src); + zstdsz = B64_DECODE_LENGTH(len) + 1; + zstd = util_calloc(1, zstdsz); + + if ((zstdsz = b64_decode(src, len, zstd, zstdsz)) == (size_t)-1) { + free(zstd); + return NULL; + } + + switch ((textsz = ZSTD_getFrameContentSize(zstd, zstdsz))) { + case ZSTD_CONTENTSIZE_UNKNOWN: + case ZSTD_CONTENTSIZE_ERROR: + free(zstd); + return NULL; + default: + break; + } + + text = util_calloc(1, textsz + 1); + + if (ZSTD_isError((textsz = ZSTD_decompress(text, textsz, zstd, zstdsz)))) { + free(zstd); + free(text); + return NULL; + } + + free(zstd); + + return text; +}