From 236528e6c34606004d591cd9f4860f3f9fe18008 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Tue, 21 Jul 2020 19:56:12 +0200
Subject: [PATCH] WIP: Change log macro, to be able to pass a single string and
 not a stupid format

As an example:
BEFORE: LOG_ERROR("FOO", "%s", "BAR");
AFTER: LOG_ERROR("FOO", "BAR");
---
 inc/lektor/macro.h | 22 ++++++----------------
 src/base/common.c  | 16 ++++++++++++++++
 2 files changed, 22 insertions(+), 16 deletions(-)

diff --git a/inc/lektor/macro.h b/inc/lektor/macro.h
index 7938570b..6340969f 100644
--- a/inc/lektor/macro.h
+++ b/inc/lektor/macro.h
@@ -13,8 +13,6 @@
 
 /* Macros */
 
-#define BRACKETS_THAT(that) (that)
-
 #ifndef MAX
 #define MAX(a, b) ((a) < (b) ? (b) : (a))
 #endif /* MAX */
@@ -54,19 +52,11 @@ enum log_level {
     DEBUG   = 4,
 };
 
-#define LOG(format, level, section, ...)                                                \
-    {                                                                                   \
-        if (level <= log_level)                                                         \
-            fprintf(stderr, " %c %s%s: " format "\n",                                   \
-                level == ERROR ? '!' : level == WARN ? '*' : level == INFO ? '.' : ' ', \
-                sizeof(section) > sizeof("") ? ("[" section "] ") : "",                 \
-                __func__,                                                               \
-                __VA_ARGS__);                                                           \
-    }
-#define LOG_INFO(section, format, ...)  LOG(format, INFO, section, __VA_ARGS__)
-#define LOG_WARN(section, format, ...)  LOG(format, WARN, section, __VA_ARGS__)
-#define LOG_ERROR(section, format, ...) LOG(format, ERROR, section, __VA_ARGS__)
-#define LOG_DEBUG(section, format, ...) LOG(format, DEBUG, section, __VA_ARGS__)
+void __lkt_log(enum log_level, const char *section, const char *func, const char *format, ...);
+#define LOG_INFO( section, ...) __lkt_log(INFO,  section, __func__, __VA_ARGS__)
+#define LOG_WARN( section, ...) __lkt_log(WARN,  section, __func__, __VA_ARGS__)
+#define LOG_ERROR(section, ...) __lkt_log(ERROR, section, __func__, __VA_ARGS__)
+#define LOG_DEBUG(section, ...) __lkt_log(DEBUG, section, __func__, __VA_ARGS__)
 
 /* Defines for lektor */
 
@@ -174,7 +164,7 @@ typedef volatile enum {
 #define STR_MATCH(str1, str2)           (! strcasecmp(str1, str2))
 #define STR_NMATCH(str1, str2, n)       (! strncasecmp(str1, str2, n))
 
-#define sqlite3_column_chars BRACKETS_THAT(const char *) sqlite3_column_text
+#define sqlite3_column_chars (const char *) sqlite3_column_text
 
 #define GET_VA_COUNT(...)   PP_NARG_(__VA_ARGS__,PP_RSEQ_N())
 #define PP_NARG_(...)       PP_ARG_N(__VA_ARGS__)
diff --git a/src/base/common.c b/src/base/common.c
index f46e6146..d1a7694b 100644
--- a/src/base/common.c
+++ b/src/base/common.c
@@ -10,6 +10,22 @@
 
 int log_level = 0; /* None by default */
 
+void
+__lkt_log(enum log_level level, const char *section, const char *func, const char *format, ...)
+{
+    char line[LKT_MESSAGE_MAX];
+    va_list ap;
+
+    if (level <= log_level) {
+        safe_snprintf(line, LKT_MESSAGE_MAX, " %c [%s] %s: %s\n",
+                      level == ERROR ? '!' : level == WARN ? '*' : level == INFO ? '.' : ' ',
+                      section, __func__, format);
+        va_start(ap, format);
+        vfprintf(stderr, line, ap);
+        va_end(ap);
+    }
+}
+
 void
 __not_implemented(const char *func, char *file, int line)
 {
-- 
GitLab