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;
+}