From a50aacd30adb87698eb775ef5c7615c65e57a11d Mon Sep 17 00:00:00 2001 From: Louis Burda Date: Thu, 29 Apr 2021 17:54:54 +0200 Subject: very basic binary file parsing and skeleton for state-machine based parsing of ascii format --- service/src/util.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 service/src/util.c (limited to 'service/src/util.c') diff --git a/service/src/util.c b/service/src/util.c new file mode 100644 index 0000000..cb97816 --- /dev/null +++ b/service/src/util.c @@ -0,0 +1,74 @@ +#include "util.h" + +void* +checkp(void *p) +{ + if (!p) die("pointer assertion failed, OOM?\n"); + return p; +} + +void* +die(const char *fmtstr, ...) +{ + va_list ap; + + va_start(ap, fmtstr); + vfprintf(stderr, fmtstr, ap); + va_end(ap); + + exit(EXIT_FAILURE); +} + +char* +aprintf(const char *fmtstr, ...) +{ + va_list ap, cpy; + size_t nb; + char *str; + + va_copy(cpy, ap); + + va_start(cpy, fmtstr); + nb = vsnprintf(NULL, 0, fmtstr, ap); + va_end(cpy); + + if (nb <= 0) die("encountered invalid fmtstr!\n"); + + str = checkp(malloc(nb)); + va_start(ap, fmtstr); + nb = vsnprintf(str, nb, fmtstr, ap); + va_end(ap); + + return str; +} + +const char* +mhash(const char *filename, int len) +{ + static const char *hexalph = "0123456789ABCDEF"; + static char buf[33]; + int i, k; + + if (len == -1) len = strlen(filename); + + for (i = 0; i < MIN(32, len); i++) { + unsigned char v = 0; + for (k = i; k < len; k += 32) + v ^= filename[k]; + buf[i*2+0] = hexalph[(v >> 0) & 0x0f]; + buf[i*2+1] = hexalph[(v >> 4) & 0x0f]; + } + + if (i == 0) { + memset(buf, '0', 32); + } else if (i < 32) { + for (k = 0; k < 32; k++) + buf[k] = buf[k % i]; + } + + buf[32] = '\0'; + + return buf; +} + + -- cgit v1.2.3-71-gd317