#ifndef UTIL_H #define UTIL_H #include #include #include // utility for errors #if !DEBUG void die(const char* format, ...) __attribute__((format(printf, 1, 2))); void* emalloc(size_t size, char* alloc_reason); #define assert(condition) ((void)0) #else #define die(fmt, ...) _die(__FILE__, __LINE__, fmt, ##__VA_ARGS__) void _die(const char* file, int line, const char* format, ...) __attribute__((format(printf, 3, 4))); #define emalloc(size, alloc_reason) _emalloc(__FILE__, __LINE__, size, alloc_reason) void* _emalloc(const char* file, int line, size_t size, char* alloc_reason); #define assert(condition) do { if (!(condition)) _failassert(__FILE__, __LINE__, #condition); } while(0) void _failassert(const char* file, int line, char* contents); #endif // functions for outputting and displaying text, log is used for nonroutine bad things void printout(const char* format, ...) __attribute__((format(printf, 1, 2))); void print(const char* format, ...) __attribute__((format(printf, 1, 2))); // string functions #define vastrcat(...) vastrcat_(0, __VA_ARGS__, NULL) char* vastrcat_(int dummy, ...); // posix path functions #define join_path(...) join_path_(0, __VA_ARGS__, NULL) char* join_path_(int dummy, ...); #endif