diff options
| author | Paul Oliver <contact@pauloliver.dev> | 2026-07-14 17:29:02 +0200 |
|---|---|---|
| committer | Paul Oliver <contact@pauloliver.dev> | 2026-08-30 16:24:48 +0200 |
| commit | 1961b4b237083f4cfac9ca6b249c1d6cb665d149 (patch) | |
| tree | fd9fc8260360e2ac30be9747ca558bcfc824a4c4 /core/logger.c | |
Diffstat (limited to 'core/logger.c')
| -rw-r--r-- | core/logger.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/core/logger.c b/core/logger.c new file mode 100644 index 0000000..29f371e --- /dev/null +++ b/core/logger.c @@ -0,0 +1,133 @@ +// file : core/logger.c +// project : Salis-VM +// author : Paul Oliver <contact@pauloliver.dev> + +// index: +// [section] includes +// [section] macros +// [section] extern globals +// [section] definitions + +// ---------------------------------------------------------------------------- +// [section] includes +// ---------------------------------------------------------------------------- +#include <assert.h> +#include <stdarg.h> +#include <stdio.h> +#include <time.h> +#include <unistd.h> + +#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, + "%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("\r%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("\r%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("\r%s\n", buffer); + fflush(stdout); + va_end(args); +} + +void vlog_trace_to_buffer(char buffer[LOG_BUFFER_SIZE], const char *format, va_list args) { + assert(format); + assert(args); + (void)buffer; + (void)format; + (void)args; + +#if defined(LOG_TRACE) + log_to_buffer(buffer, NULL, LEVEL_TRACE, format, args); +#endif +} + +void vlog_info_to_buffer(char buffer[LOG_BUFFER_SIZE], const char *format, va_list args) { + assert(format); + assert(args); + log_to_buffer(buffer, NULL, LEVEL_INFO, format, args); +} + +void vlog_attention_to_buffer(char buffer[LOG_BUFFER_SIZE], const char *format, va_list args) { + assert(format); + assert(args); + log_to_buffer(buffer, NULL, LEVEL_ATTENTION, format, args); +} |
