From bee2c2b4fefa6a027caeca1287ac46e854e6ee23 Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Tue, 7 Nov 2023 18:15:53 +0100 Subject: [PATCH] Fix va_list bug in logger --- engine/breeze/core/logger.c | 22 +++++++++++----------- engine/breeze/core/logger.h | 8 +++++--- engine/breeze/game.h | 2 +- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/engine/breeze/core/logger.c b/engine/breeze/core/logger.c index 8d4e06c..06dfc1e 100644 --- a/engine/breeze/core/logger.c +++ b/engine/breeze/core/logger.c @@ -60,36 +60,34 @@ static const char *LEVEL_COLORS[] = { }; static void bzLoggerStdOutCallback(BzLoggerEvent *ev) { - va_list *ap = ev->vaList; fprintf(stderr, "%s %s%-5s\x1b[0m ",ev->time, LEVEL_COLORS[ev->level], LEVEL_STRINGS[ev->level]); if (ev->file) { fprintf(stderr, "\x1b[90m(%s:%d)\x1b[0m ", ev->file, ev->line); } - vfprintf(stderr, ev->fmt, *ap); + vfprintf(stderr, ev->fmt, ev->va); fprintf(stderr, "\n"); fflush(stderr); } static void bzLoggerFileCallback(BzLoggerEvent *ev) { FILE *fp = ev->userData; - va_list *ap = ev->vaList; fprintf(fp, "%s %-5s ", ev->time, LEVEL_STRINGS[ev->level]); if (ev->file) { fprintf(fp, "(%s:%d): ", ev->file, ev->line); } - vfprintf(fp, ev->fmt, *ap); + vfprintf(fp, ev->fmt, ev->va); fflush(fp); } void bzLoggerLog(BzLoggerLevel level, const char *file, int line, const char *fmt, ...) { va_list args; va_start(args, fmt); - bzLoggerLogV(level, file, line, fmt, &args); + bzLoggerLogV(level, file, line, fmt, args); va_end(args); } -void bzLoggerLogV(BzLoggerLevel level, const char *file, int line, const char *fmt, void *va_list) { +void bzLoggerLogV(BzLoggerLevel level, const char *file, int line, const char *fmt, va_list va) { BzLoggerEvent event = {NULL, NULL, level, file, line, fmt}; const int loggerLevel = bzLoggerGetLevel(); @@ -103,8 +101,9 @@ void bzLoggerLogV(BzLoggerLevel level, const char *file, int line, const char *f if (!BZ_GET_LOGGER_MODULE()->silent && level <= loggerLevel) { event.userData = stderr; - event.vaList = va_list; + va_copy(event.va, va); bzLoggerStdOutCallback(&event); + va_end(event.va); } for (int i = 0; i < BZ_LOGGER_MAX_CALLBACKS; ++i) { @@ -113,19 +112,20 @@ void bzLoggerLogV(BzLoggerLevel level, const char *file, int line, const char *f if (level <= cb.level) { event.userData = cb.userData; - event.vaList = va_list; + va_copy(event.va, va); cb.callback(&event); + va_end(event.va); } } } void bzLoggerOnlyLog(BzLoggerLevel level, const char *fmt, ...) { va_list args; va_start(args, fmt); - bzLoggerOnlyLogV(level, fmt, &args); + bzLoggerOnlyLogV(level, fmt, args); va_end(args); } -void bzLoggerOnlyLogV(BzLoggerLevel level, const char *fmt, void *va_list) { - bzLoggerLogV(level, NULL, -1, fmt, va_list); +void bzLoggerOnlyLogV(BzLoggerLevel level, const char *fmt, va_list va) { + bzLoggerLogV(level, NULL, -1, fmt, va); } diff --git a/engine/breeze/core/logger.h b/engine/breeze/core/logger.h index bc9d301..4ec05ff 100644 --- a/engine/breeze/core/logger.h +++ b/engine/breeze/core/logger.h @@ -3,6 +3,8 @@ #include "../defines.h" +#include + typedef enum BzLoggerLevel { BZ_LOG_TRACE, BZ_LOG_DEBUG, @@ -21,7 +23,7 @@ typedef struct BzLoggerEvent { int line; const char *fmt; - void *vaList; + va_list va; } BzLoggerEvent; typedef struct BzLoggerCallback { @@ -39,9 +41,9 @@ void bzLoggerSetLevel(BzLoggerLevel level); BzLoggerLevel bzLoggerGetLevel(); void bzLoggerLog(BzLoggerLevel level, const char *file, int line, const char *fmt, ...); -void bzLoggerLogV(BzLoggerLevel level, const char *file, int line, const char *fmt, void *va_list); +void bzLoggerLogV(BzLoggerLevel level, const char *file, int line, const char *fmt, va_list va); void bzLoggerOnlyLog(BzLoggerLevel level, const char *fmt, ...); -void bzLoggerOnlyLogV(BzLoggerLevel level, const char *fmt, void *va_list); +void bzLoggerOnlyLogV(BzLoggerLevel level, const char *fmt, va_list va); bool bzLoggerAddFP(void *fp, BzLoggerLevel level); diff --git a/engine/breeze/game.h b/engine/breeze/game.h index 39a1932..28077ad 100644 --- a/engine/breeze/game.h +++ b/engine/breeze/game.h @@ -53,7 +53,7 @@ static void bzRaylibLogger(int msgType, const char *text, va_list args) { default:; } - bzLoggerOnlyLog(level, text, args); + bzLoggerOnlyLogV(level, text, args); } int main(int argc, const char **argv) {