diff options
Diffstat (limited to 'src/log.c')
| -rw-r--r-- | src/log.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/log.c b/src/log.c new file mode 100644 index 0000000..7a3bf3f --- /dev/null +++ b/src/log.c @@ -0,0 +1,104 @@ +#include "log.h" + +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <strings.h> +#include <unistd.h> +#include <ctype.h> + +static sk_log_level _sk_log_level = +#if DEBUG + SK_LOG_DEBUG; +#else + SK_LOG_INFO; +#endif +static sk_font_map _sk_log_font; /* defaults to NULL */ + +sk_font_map _SK_LOG_COLOURED = { + [SK_LOG_ERROR] = SK_FONT_FG_RED, + [SK_LOG_WARN] = SK_FONT_FG_YELLOW, + [SK_LOG_INFO] = SK_FONT_FG_BLUE, + [SK_LOG_DEBUG] = SK_FONT_FG_WHITE, + [SK_LOG_TRACE] = SK_FONT_FG_WHITE +}; +sk_font_map _SK_LOG_MONOCHROME = { + [SK_LOG_ERROR] = SK_FONT_FG_DEFAULT, + [SK_LOG_WARN] = SK_FONT_FG_DEFAULT, + [SK_LOG_INFO] = SK_FONT_FG_DEFAULT, + [SK_LOG_DEBUG] = SK_FONT_FG_DEFAULT, + [SK_LOG_TRACE] = SK_FONT_FG_DEFAULT +}; + +const char *sk_log_level_to_string(sk_log_level level) { + switch (level) { + /* case SK_LOG_OFF: + * return "off"; */ + case SK_LOG_ERROR: + return "error"; + case SK_LOG_WARN: + return "warning"; + case SK_LOG_INFO: + return "info"; + case SK_LOG_DEBUG: + return "debug"; + case SK_LOG_TRACE: + return "trace"; + default: + return NULL; + } +} + +sk_log_level sk_log_level_of_string(const char *s) { + for (sk_log_level l = SK_LOG_MIN; l <= SK_LOG_MAX; ++l) { + if (!strcasecmp(s, sk_log_level_to_string(l))) + return l; + } + return 0; +} + + +sk_log_level sk_log_level_get() { + return _sk_log_level; +} + +void sk_log_level_set(sk_log_level new) { + _sk_log_level = new; +} + +sk_font_map *sk_log_font_get() { + return &_sk_log_font; +} + +void sk_log_font_set(sk_font_map *restrict font) { + (void)memcpy(&_sk_log_font, font, sizeof(sk_font_map)); +} + +# define LOG_PREFIX_LEN 8 +int sk_log(sk_log_level level, const char *restrict format, ...) { + if (level <= _sk_log_level) { + FILE *stream = (level <= SK_LOG_WARN ? stderr : stdout); + + char prefix[LOG_PREFIX_LEN+1]; + (void)strncpy(prefix, sk_log_level_to_string(level), LOG_PREFIX_LEN); + for (int i = 0; i < LOG_PREFIX_LEN && prefix[i] != '\0'; ++i) + prefix[i] = toupper(prefix[i]); + prefix[LOG_PREFIX_LEN] = '\0'; + + fprintf(stream, "%s%s: ", + (NULL != _sk_log_font[level] ? _sk_log_font[level] : ""), + prefix); + + va_list ap; + va_start(ap, format); + int rv = vfprintf(stream, format, ap); + va_end(ap); + + fprintf(stream, SK_FONT_RESET "\n"); + + return rv; + } + + return 0; +} |
