#pragma once #include #define LOG #ifdef LOG typedef enum { DEBUG, TRACE, INFO, WARN, ERROR, } LogLevel; #define BUF_LENGTH 256 #define INIT_LOG_BUFFER(name) char name[BUF_LENGTH]; #define INIT_LOG_BOUNDS int t = 0; #define APPEND(buffer, msg, ...) t += snprintf(buffer + t, BUF_LENGTH - t, msg, ##__VA_ARGS__); #define LOGONLY(code) code void logmsg(LogLevel level, const char* msg, ...) __attribute__ ((__format__(printf, 2, 3))); #define DEBUG(msg, ...) logmsg(DEBUG, msg, ##__VA_ARGS__) #define TRACE(msg, ...) logmsg(TRACE, msg, ##__VA_ARGS__) #define INFO(msg, ...) logmsg(INFO, msg, ##__VA_ARGS__) #define WARN(msg, ...) logmsg(WARN, msg, ##__VA_ARGS__) #define ERROR(msg, ...) logmsg(ERROR, msg, ##__VA_ARGS__) #else #define BUF_LENGTH #define INIT_LOG_BUFFER(name) #define INIT_LOG_BOUNDS #define APPEND(buffer, msg, ...) #define LOGONLY(code) #define DEBUG(msg, ...) #define TRACE(msg, ...) #define INFO(msg, ...) #define WARN(msg, ...) #define ERROR(msg, ...) #endif