#include #include #include #include "util.h" #if DEBUG void _log(int line, const char* file, const char* format, ...) { fprintf(stderr, "%s:%d: info: ", file, line); #else void _log(const char* format, ...) { #endif va_list args; va_start(args, format); vfprintf(stderr, format, args); va_end(args); } #if DEBUG void _die(int line, const char* file, const char* format, ...) { fprintf(stderr, "%s:%d: error: ", file, line); #else void _die(const char* format, ...) { #endif va_list args; va_start(args, format); vfprintf(stderr, format, args); va_end(args); exit(1); } void* emalloc(size_t size, char* alloc_reason) { void* d = malloc(size); if (d == NULL) die("Failed to allocate %s", alloc_reason); return d; } 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; }