Mercurial > sci
diff util.c @ 3:215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 14 Jun 2021 22:08:24 +0200 |
parents | 5fa3d2f479b2 |
children |
line wrap: on
line diff
--- a/util.c Thu Jun 10 10:39:21 2021 +0200 +++ b/util.c Mon Jun 14 22:08:24 2021 +0200 @@ -16,18 +16,18 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include <sys/stat.h> #include <assert.h> #include <err.h> +#include <fcntl.h> #include <libgen.h> #include <limits.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> -#include <zstd.h> - -#include "base64.h" #include "util.h" void * @@ -122,28 +122,15 @@ return ret; } -size_t -util_split(char *line, const char **args, size_t max, char delim) +FILE * +util_fmemopen(void *buf, size_t size, const char *mode) { - size_t idx; - - if (!*line) - return 0; - - for (idx = 0; idx < max; ++idx) { - char *sp = strchr(line, delim); + FILE *fp; - if (!sp || idx + 1 >= max) { - args[idx++] = line; - break; - } + if (!(fp = fmemopen(buf, size, mode))) + err(1, "fmemopen"); - *sp = '\0'; - args[idx] = line; - line = sp + 1; - } - - return idx; + return fp; } char * @@ -163,67 +150,27 @@ } char * -util_zbase64_enc(const char *src) +util_read(const char *path) { - assert(src); - - char *zstd, *b64; - size_t zstdsz, b64sz, len; + int fd; + struct stat st; + char *ret; - len = strlen(src); - zstdsz = ZSTD_compressBound(len); - zstd = util_malloc(zstdsz); + if ((fd = open(path, O_RDONLY)) < 0) + return NULL; + if (fstat(fd, &st) < 0) + return close(fd), NULL; - if (ZSTD_isError(zstdsz = ZSTD_compress(zstd, zstdsz, src, len, 18))) { - free(zstd); - return NULL; + ret = util_calloc(1, st.st_size + 1); + + if (read(fd, ret, st.st_size) != st.st_size) { + free(ret); + ret = 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); + close(fd); - 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; + return ret; } const char *