// file : core/logger.c // project : Salis-VM // author : Paul Oliver // index: // [section] includes // [section] macros // [section] extern globals // [section] definitions // ---------------------------------------------------------------------------- // [section] includes // ---------------------------------------------------------------------------- #include #include #include #include #include #include "logger.h" // ---------------------------------------------------------------------------- // [section] macros // ---------------------------------------------------------------------------- #define COLOR_CLEAR "\033[0m" #define COLOR_TRACE "\033[1;34m" #define COLOR_INFO "\033[1;32m" #define COLOR_ATTENTION "\033[1;33m" #define LEVEL_TRACE "TRACE" #define LEVEL_INFO "INFO" #define LEVEL_ATTENTION "ATTENTION" // ---------------------------------------------------------------------------- // [section] extern globals // ---------------------------------------------------------------------------- void (*log_trace)(const char *format, ...) = log_trace_to_stdout; void (*log_info)(const char *format, ...) = log_info_to_stdout; void (*log_attention)(const char *format, ...) = log_attention_to_stdout; // ---------------------------------------------------------------------------- // [section] definitions // ---------------------------------------------------------------------------- static void log_to_buffer(char buffer[LOG_BUFFER_SIZE], const char *color_code, const char *level, const char *format, va_list args) { assert(level); assert(format); struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); int msec = (int)(ts.tv_nsec / 1000000l); struct tm tm = *localtime(&ts.tv_sec); pid_t pid = getpid(); int rem = snprintf( buffer, LOG_BUFFER_SIZE, "\r%s%d-%02d-%02d %02d:%02d:%02d.%03d %07d [%s]%s ", color_code ? color_code : "", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, msec, pid, level, color_code ? COLOR_CLEAR : "" ); vsnprintf(buffer + rem, LOG_BUFFER_SIZE - rem, format, args); } void log_trace_to_stdout(const char *format, ...) { assert(format); (void)format; #if defined(LOG_TRACE) va_list args; va_start(args, format); char buffer[LOG_BUFFER_SIZE]; log_to_buffer(buffer, COLOR_TRACE, LEVEL_TRACE, format, args); printf("%s\n", buffer); fflush(stdout); va_end(args); #endif } void log_info_to_stdout(const char *format, ...) { assert(format); va_list args; va_start(args, format); char buffer[LOG_BUFFER_SIZE]; log_to_buffer(buffer, COLOR_INFO, LEVEL_INFO, format, args); printf("%s\n", buffer); fflush(stdout); va_end(args); } void log_attention_to_stdout(const char *format, ...) { assert(format); va_list args; va_start(args, format); char buffer[LOG_BUFFER_SIZE]; log_to_buffer(buffer, COLOR_ATTENTION, LEVEL_ATTENTION, format, args); printf("%s\n", buffer); fflush(stdout); va_end(args); } void log_trace_to_buffer(char buffer[LOG_BUFFER_SIZE], const char *format, ...) { assert(format); (void)format; #if defined(LOG_TRACE) va_list args; va_start(args, format); log_to_buffer(buffer, NULL, LEVEL_TRACE, format, args); va_end(args); #endif } void log_info_to_buffer(char buffer[LOG_BUFFER_SIZE], const char *format, ...) { assert(format); va_list args; va_start(args, format); log_to_buffer(buffer, NULL, LEVEL_INFO, format, args); va_end(args); } void log_attention_to_buffer(char buffer[LOG_BUFFER_SIZE], const char *format, ...) { assert(format); va_list args; va_start(args, format); log_to_buffer(buffer, NULL, LEVEL_ATTENTION, format, args); va_end(args); }