From d516ffdda0f8fb0419dd2ab9d340068cf8aa8304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 17 Dec 2018 20:25:18 +0100 Subject: [PATCH] log: initial framework for logging things --- CMakeLists.txt | 1 + log.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ log.h | 16 ++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 log.c create mode 100644 log.h diff --git a/CMakeLists.txt b/CMakeLists.txt index be5aead..54d5c63 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,7 @@ add_executable(f00bar bar.c bar.h config.c config.h font.c font.h + log.c log.h main.c module.c module.h particle.c particle.h diff --git a/log.c b/log.c new file mode 100644 index 0000000..e71302f --- /dev/null +++ b/log.c @@ -0,0 +1,45 @@ +#include "log.h" + +#include +#include +#include + +static void +_log(enum log_class log_class, const char *module, const char *file, int lineno, + const char *fmt, va_list va) +{ + bool colorize = true; + + const char *class; + int class_clr; + switch (log_class) { + case LOG_CLASS_ERROR: class = "error"; class_clr = 31; break; + case LOG_CLASS_WARNING: class = "warning"; class_clr = 33; break; + case LOG_CLASS_INFO: class = "info"; class_clr = 97; break; + case LOG_CLASS_DEBUG: class = "debug"; class_clr = 36; break; + } + + char clr[16]; + snprintf(clr, sizeof(clr), "\e[%dm", class_clr); + printf("%s%s%s: ", colorize ? clr : "", class, colorize ? "\e[0m" : ""); + +#if defined(_DEBUG) + printf("%s:%d: ", file, lineno); +#else + printf("%s: ", module); +#endif + + //printf("%%s\n", buf); + vprintf(fmt, va); + printf("\n"); +} + +void +log_class(enum log_class log_class, const char *module, + const char *file, int lineno, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + _log(log_class, module, file, lineno, fmt, ap); + va_end(ap); +} diff --git a/log.h b/log.h new file mode 100644 index 0000000..7df59c9 --- /dev/null +++ b/log.h @@ -0,0 +1,16 @@ +#pragma once + +enum log_class { LOG_CLASS_ERROR, LOG_CLASS_WARNING, LOG_CLASS_INFO, LOG_CLASS_DEBUG }; + +void log_class(enum log_class log_class, const char *module, + const char *file, int lineno, + const char *fmt, ...) __attribute__((format (printf, 5, 6))); + +#define LOG_ERR(fmt, ...) \ + log_class(LOG_CLASS_ERROR, LOG_MODULE, __FILE__, __LINE__, fmt, __VA_ARGS__) +#define LOG_WARN(fmt, ...) \ + log_class(LOG_CLASS_WARNING, LOG_MODULE, __FILE__, __LINE__, fmt, __VA_ARGS__) +#define LOG_INFO(fmt, ...) \ + log_class(LOG_CLASS_INFO, LOG_MODULE, __FILE__, __LINE__, fmt, __VA_ARGS__) +#define LOG_DBG(fmt, ...) \ + log_class(LOG_CLASS_DEBUG, LOG_MODULE, __FILE__, __LINE__, fmt, __VA_ARGS__)