aboutsummaryrefslogtreecommitdiff
path: root/snag/src/util.c
diff options
context:
space:
mode:
authorJack Jamison <jackqjamison@gmail.com>2026-07-22 09:09:18 -0400
committerJack Jamison <jackqjamison@gmail.com>2026-07-22 09:09:18 -0400
commit5365f8fa8d6ebfbf3ba92816abe55a99feff6f25 (patch)
tree563605dabaf611ebb0c1ee1b65aa56690b01b4fd /snag/src/util.c
parent165816f7854340c3ca09287aee66968777af61ad (diff)
clean up
Diffstat (limited to 'snag/src/util.c')
-rw-r--r--snag/src/util.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/snag/src/util.c b/snag/src/util.c
new file mode 100644
index 0000000..8cc9b18
--- /dev/null
+++ b/snag/src/util.c
@@ -0,0 +1,76 @@
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "util.h"
+
+#if !DEBUG
+void log(const char* format, ...) {
+#else
+void _log(int line, const char* file, const char* format, ...) {
+ fprintf(stderr, "%s:%d: info: ", file, line);
+#endif
+ va_list args;
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
+}
+
+#if !DEBUG
+void die(const char* format, ...) {
+#else
+void _die(int line, const char* file, const char* format, ...) {
+ fprintf(stderr, "%s:%d: error: ", file, line);
+#endif
+ va_list args;
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
+ fprintf(stderr, "\n");
+ exit(1);
+}
+
+#if !DEBUG
+void* emalloc(size_t size, char* alloc_reason) {
+ void* d = malloc(size);
+ if (d == NULL) _die("failed to allocate '%s': %s", alloc_reason, strerror(errno));
+ return d;
+}
+#else
+void* _emalloc(int line, const char* file, size_t size, char* alloc_reason) {
+ void* d = malloc(size);
+ if (d == NULL) _die(line, file, "failed to allocate '%s': %s", alloc_reason, strerror(errno));
+ return d;
+}
+#endif
+
+char* vastrcat_(int dummy, ...) {
+
+ va_list args;
+ va_list args2;
+ va_start(args, dummy);
+ va_copy(args2, args);
+
+ // get len of output string
+ size_t len = 0;
+ char* arg = NULL;
+ while ((arg = va_arg(args, char*))) {
+ len += strlen(arg);
+ }
+ va_end(args);
+
+ // allocate and build output
+ char* output = malloc(len + 1);
+ if (!output) return NULL;
+ char* p = output;
+ while ((arg = va_arg(args, char*))) {
+ size_t alen = strlen(arg);
+ memcpy(p, arg, alen);
+ p += alen;
+ }
+ output[len] = '\0';
+ va_end(args2);
+
+ return output;
+}