#include #include #include #include #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 void printout(const char* format, ...) { va_list args; va_start(args, format); vfprintf(stdout, format, args); va_end(args); } void print(const char* format, ...) { va_list args; va_start(args, format); vfprintf(stderr, format, args); va_end(args); } 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(args2, char*))) { size_t alen = strlen(arg); memcpy(p, arg, alen); p += alen; } output[len] = '\0'; va_end(args2); return output; } char* join_path_(int dummy, ...) { va_list args; va_list args2; va_start(args, dummy); va_copy(args2, args); // note(jqj): some path joining libraries reset if they encounter an // absolute path, we could implement that easily, but I'm not // sure about it // get len of output path size_t len = 0; char* arg = NULL; int i = 0; while ((arg = va_arg(args, char*))) { if (i > 0) len += 1; len += strlen(arg) + 1; ++i; } va_end(args); // allocate and build output char* output = malloc(len + 1); if (!output) return NULL; char* p = output; while ((arg = va_arg(args2, char*))) { if (p != output) { // add slash before every part except the first *p = '/'; ++p; } size_t alen = strlen(arg); memcpy(p, arg, alen); p += alen; } output[len] = '\0'; va_end(args2); return output; }