#include Log_Level un_current_log_level = UN_LOG_INFO; u8 log_buffer[UN_KB(4)]; void un_log_write_internal(Log_Level level, String format, va_list vaptr) { if (level < un_current_log_level) return; switch (level) { case UN_LOG_TRACE: fprintf(stderr, "[TRACE] "); break; case UN_LOG_DEBUG: fprintf(stderr, "[DEBUG] "); break; case UN_LOG_INFO: fprintf(stderr, "[INFO] "); break; case UN_LOG_WARNING: fprintf(stderr, "[WARNING] "); break; case UN_LOG_ERROR: fprintf(stderr, "[ERROR] "); break; case UN_LOG_FATAL: fprintf(stderr, "[FATAL] "); break; default: break; } sprintf(CSTR log_buffer, "%.*s", (int)format.size, format.data); vfprintf(stderr, CSTR log_buffer, vaptr); switch (level) { case UN_LOG_RAW: break; case UN_LOG_FATAL: fprintf(stderr, "\n"); assert(false); break; default: fprintf(stderr, "\n"); break; } } extern void un_log_write_cstring(Log_Level level, u8 *format, ...) { va_list vaptr; String temp; if (level < un_current_log_level) return; temp.size = un_string_get_length(format); temp.data = format; va_start(vaptr, format); un_log_write_internal(level, temp, vaptr); va_end(vaptr); } void un_log_write(Log_Level level, String format, ...) { va_list vaptr; if (level < un_current_log_level) return; va_start(vaptr, format); un_log_write_internal(level, format, vaptr); va_end(vaptr); }