summaryrefslogtreecommitdiff
path: root/core/logger.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/logger.c')
-rw-r--r--core/logger.c133
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);
+}