diff options
| author | Louis Burda <quent.burda@gmail.com> | 2021-04-29 17:54:54 +0200 |
|---|---|---|
| committer | Louis Burda <quent.burda@gmail.com> | 2021-04-29 17:54:54 +0200 |
| commit | a50aacd30adb87698eb775ef5c7615c65e57a11d (patch) | |
| tree | 6088cc031eb204c7c1e75a49cf92aef003557433 /service/src/util.c | |
| parent | 008b5f74235a7fd04852e6f640429269f1ec4845 (diff) | |
| download | enowars5-service-stldoctor-a50aacd30adb87698eb775ef5c7615c65e57a11d.tar.gz enowars5-service-stldoctor-a50aacd30adb87698eb775ef5c7615c65e57a11d.zip | |
very basic binary file parsing and skeleton for state-machine based parsing of ascii format
Diffstat (limited to 'service/src/util.c')
| -rw-r--r-- | service/src/util.c | 74 |
1 files changed, 74 insertions, 0 deletions
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; +} + + |
