aboutsummaryrefslogtreecommitdiffstats
path: root/service/src/util.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2021-04-29 17:54:54 +0200
committerLouis Burda <quent.burda@gmail.com>2021-04-29 17:54:54 +0200
commita50aacd30adb87698eb775ef5c7615c65e57a11d (patch)
tree6088cc031eb204c7c1e75a49cf92aef003557433 /service/src/util.c
parent008b5f74235a7fd04852e6f640429269f1ec4845 (diff)
downloadenowars5-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.c74
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;
+}
+
+