1
0
Fork 0
2022-untitled-game/code/src/engine/logger.c

66 lines
1.7 KiB
C

enum {
LOG_TYPE_DEBUG = 0,
LOG_TYPE_INFO,
LOG_TYPE_WARN,
LOG_TYPE_ERROR,
LOG_TYPE_COUNT
};
#ifdef BUILD_RELEASE
#define LOG_ASSERT(condition, ...)
#define LOG_DEBUG(...)
#define LOG_INFO(...)
#define LOG_WARN(...)
#define LOG_ERROR(...) logger_write(LOG_TYPE_ERROR, __VA_ARGS__)
#else
#define LOG_ASSERT(condition, ...) \
do { if (!(condition)) { logger_write(LOG_TYPE_ERROR, __VA_ARGS__); fflush(stdout); abort(); } } while (0)
#define LOG_DEBUG(...) logger_write(LOG_TYPE_DEBUG, __VA_ARGS__)
#define LOG_INFO(...) logger_write(LOG_TYPE_INFO, __VA_ARGS__)
#define LOG_WARN(...) logger_write(LOG_TYPE_WARN, __VA_ARGS__)
#define LOG_ERROR(...) logger_write(LOG_TYPE_ERROR, __VA_ARGS__)
#endif
void
logger_write(int verbosity, char const* format, ...)
{
time_t raw_time = time(NULL);
struct tm* separated_time = localtime(&raw_time);
char text_buf[128];
char* text_buf_ptr = text_buf;
text_buf_ptr += snprintf(
text_buf_ptr,
sizeof(text_buf),
"[%02d:%02d:%02d] ",
separated_time->tm_hour,
separated_time->tm_min,
separated_time->tm_sec);
FILE* io_stream = stdout;
switch (verbosity)
{
case LOG_TYPE_DEBUG: {
text_buf_ptr += snprintf(text_buf_ptr, sizeof(text_buf), " [debug] ");
} break;
case LOG_TYPE_INFO: {
text_buf_ptr += snprintf(text_buf_ptr, sizeof(text_buf), " [info] ");
} break;
case LOG_TYPE_WARN: {
text_buf_ptr += snprintf(text_buf_ptr, sizeof(text_buf), " [warn] ");
} break;
case LOG_TYPE_ERROR: {
io_stream = stderr;
text_buf_ptr += snprintf(text_buf_ptr, sizeof(text_buf), " [error] ");
} break;
default: break;
}
va_list args;
va_start(args, format);
text_buf_ptr += snprintf(text_buf_ptr, sizeof(text_buf), "%s\n", format);
vfprintf(io_stream, text_buf, args);
va_end(args);
}