added generic logging functions (not used yet)
authorHolger Schemel <info@artsoft.org>
Wed, 16 Sep 2020 14:17:15 +0000 (16:17 +0200)
committerHolger Schemel <info@artsoft.org>
Wed, 16 Sep 2020 14:17:15 +0000 (16:17 +0200)
src/libgame/misc.c
src/libgame/misc.h

index 79b1635ff12adccea7b570845ac5fb432128f664..17072d87cf249b43c38bbd21ebe0b27783dbef21 100644 (file)
@@ -251,6 +251,110 @@ void PrintLineWithPrefix(char *prefix, char *line_chars, int line_length)
 }
 
 
+// ----------------------------------------------------------------------------
+// generic logging functions
+// ----------------------------------------------------------------------------
+
+enum log_levels
+{
+  LOG_UNKNOWN = 0,
+  LOG_DEBUG,
+  LOG_INFO,
+  LOG_WARN,
+  LOG_ERROR,
+  LOG_FATAL
+};
+
+static char *log_tokens[] =
+{
+  "UNKNOWN",
+  "DEBUG",
+  "INFO",
+  "WARN",
+  "ERROR",
+  "FATAL"
+};
+
+static void printf_log_prefix(int log_level, char *mode)
+{
+  if (log_level < 0 || log_level > LOG_FATAL)
+    return;
+
+  char *log_token = log_tokens[log_level];
+
+  if (log_level == LOG_DEBUG)
+    printf_log_nonewline("[%s] [%s] ", log_token, mode);
+  else
+    printf_log_nonewline("[%s] ", log_token);
+}
+
+static void Log(int log_level, char *mode, char *format, va_list ap)
+{
+  if (log_level < 0 || log_level > LOG_FATAL)
+    return;
+
+  static boolean last_line_was_separator = FALSE;
+  char *log_token = log_tokens[log_level];
+
+  if (strEqual(format, "===") ||
+      strEqual(format, "---"))
+  {
+    static char *mode_last = NULL;
+    char line_char[2] = { format[0], '\0' };
+    int line_length = 80 - strlen(log_token) - 3;
+
+    if (log_level == LOG_DEBUG)
+      line_length -= strlen(mode) + 3;
+
+    if (last_line_was_separator && strEqual(mode, mode_last))
+      return;
+
+    printf_log_prefix(log_level, mode);
+    printf_log_line(line_char, line_length);
+
+    if (!strEqual(mode, mode_last))
+      setString(&mode_last, mode);
+
+    last_line_was_separator = TRUE;
+
+    return;
+  }
+
+  last_line_was_separator = FALSE;
+
+  printf_log_prefix(log_level, mode);
+
+  vprintf_log(format, ap);
+}
+
+void Debug(char *mode, char *format, ...)
+{
+  va_list ap;
+
+  va_start(ap, format);
+  Log(LOG_DEBUG, mode, format, ap);
+  va_end(ap);
+}
+
+void Info(char *format, ...)
+{
+  va_list ap;
+
+  va_start(ap, format);
+  Log(LOG_INFO, NULL, format, ap);
+  va_end(ap);
+}
+
+void Warn(char *format, ...)
+{
+  va_list ap;
+
+  va_start(ap, format);
+  Log(LOG_WARN, NULL, format, ap);
+  va_end(ap);
+}
+
+
 // ----------------------------------------------------------------------------
 // string functions
 // ----------------------------------------------------------------------------
index 15ff017c156b8357e5c51013a1b645a3c1e6fcba..ba82dad42a4a495530cdba153eb7872085ea5522 100644 (file)
@@ -123,6 +123,10 @@ void PrintNoLog(char *, ...);
 void PrintLine(char *, int);
 void PrintLineWithPrefix(char *, char *, int);
 
+void Debug(char *, char *, ...);
+void Info(char *, ...);
+void Warn(char *, ...);
+
 char *int2str(int, int);
 char *i_to_a(unsigned int);
 int log_2(unsigned int);