Fix va_list bug in logger

This commit is contained in:
2023-11-07 18:15:53 +01:00
parent e66b313765
commit bee2c2b4fe
3 changed files with 17 additions and 15 deletions

View File

@@ -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);
}