diff options
Diffstat (limited to 'snag/src/util.c')
| -rw-r--r-- | snag/src/util.c | 76 |
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; +} |
