#include Log_Level cyn_current_log_level = CYN_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_alloc_temp_get(); switch (level) { case CYN_LOG_TRACE: output = UN_STR("[TRACE] "); break; case CYN_LOG_DEBUG: output = UN_STR("[DEBUG] "); break; case CYN_LOG_INFO: output = UN_STR("[INFO] "); break; case CYN_LOG_WARNING: output = UN_STR("[WARNING] "); break; case CYN_LOG_ERROR: output = UN_STR("[ERROR] "); break; case CYN_LOG_FATAL: output = UN_STR("[FATAL] "); break; default: break; } output = un_string_concat(output, un_string_vformat(talloc, format, vaptr), talloc); switch (level) { case CYN_LOG_RAW: break; case CYN_LOG_FATAL: // @todo, logging should be part of Cynic. default: output = un_string_concat(output, UN_STR("\n"), talloc); break; } fprintf(stderr, (const char *)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 = strlen((const char *)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); }