#include Log_Level cyn_current_log_level = UN_LOG_INFO; void cyn_log_write_internal(Log_Level level, String format, va_list vaptr) { Allocator talloc; String output = { 0 }; if (level < cyn_current_log_level) return; talloc = un_allocator_get_temporary(); switch (level) { case UN_LOG_TRACE: output = UN_STR("[TRACE] "); break; case UN_LOG_DEBUG: output = UN_STR("[DEBUG] "); break; case UN_LOG_INFO: output = UN_STR("[INFO] "); break; case UN_LOG_WARNING: output = UN_STR("[WARNING] "); break; case UN_LOG_ERROR: output = UN_STR("[ERROR] "); break; case UN_LOG_FATAL: output = UN_STR("[FATAL] "); break; default: break; } output = un_string_concat(output, un_string_vformat(talloc, format, vaptr), talloc); switch (level) { case UN_LOG_RAW: break; case UN_LOG_FATAL: // @todo, logging should be part of Cynic. default: output = un_string_concat(output, UN_STR("\n"), talloc); break; } fprintf(stderr, CSTR un_string_to_cstring(output, talloc)); } extern void cyn_log_write_cstring(Log_Level level, u8 *format, ...) { va_list vaptr; String temp; if (level < cyn_current_log_level) return; temp.size = un_string_get_length(format); temp.data = format; va_start(vaptr, format); cyn_log_write_internal(level, temp, vaptr); va_end(vaptr); } void cyn_log_write(Log_Level level, String format, ...) { va_list vaptr; if (level < cyn_current_log_level) return; va_start(vaptr, format); cyn_log_write_internal(level, format, vaptr); va_end(vaptr); }