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