From 61cd3a3b4f432992447f80e1cad967c09a1d5d38 Mon Sep 17 00:00:00 2001 From: FoxyHunter Date: Sun, 31 May 2026 09:34:09 +0200 Subject: [PATCH] Feat: add non-buffered logging functions --- src/log.c | 43 +++++++++++++++++++++++++++++++++++++++++++ src/log.h | 10 ++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/log.c create mode 100644 src/log.h diff --git a/src/log.c b/src/log.c new file mode 100644 index 0000000..fc97a05 --- /dev/null +++ b/src/log.c @@ -0,0 +1,43 @@ +#include "log.h" +#include +#include +#include +#include +#include + +void log_init(void) { + setvbuf(stdout, NULL, _IOLBF, 0); +} + +static void ts(char *out, size_t out_sz) { + time_t now = time(NULL); + struct tm tm; + localtime_r(&now, &tm); + strftime(out, out_sz, "%Y-%m-%d %H:%M:%S", &tm); +} + +static void vlog(FILE *f, const char *level, const char *fmt, va_list ap) { + char t[32]; + ts(t, sizeof(t)); + fprintf(f, "%s %s: ", t, level); + vfprintf(f, fmt, ap); + fputc('\n', f); + fflush(f); +} + +void log_info(const char *fmt, ...) { + va_list ap; va_start(ap, fmt); + vlog(stdout, "INFO", fmt, ap); + va_end(ap); +} +void log_warn(const char *fmt, ...) { + va_list ap; va_start(ap, fmt); + vlog(stderr, "WARN", fmt, ap); + va_end(ap); +} +void log_error(const char *fmt, ...) { + va_list ap; va_start(ap, fmt); + vlog(stderr, "ERROR", fmt, ap); + va_end(ap); +} + diff --git a/src/log.h b/src/log.h new file mode 100644 index 0000000..372def8 --- /dev/null +++ b/src/log.h @@ -0,0 +1,10 @@ +#ifndef LOG_H +#define LOG_H + +void log_init(void); + +void log_info(const char *fmt, ...); +void log_warn(const char *fmt, ...); +void log_error(const char *fmt, ...); + +#endif