#include "log.h" #ifdef APPLOG_ENABLED #include #include #include #include static pthread_mutex_t cmtx = PTHREAD_MUTEX_INITIALIZER; /* Replicates pFname: strips return type and parameters from __PRETTY_FUNCTION__ * "void myFunc(int x)" → "myFunc" * "int other_func(void)" → "other_func" */ static void fmt_funcname(const char *pretty, char *out, size_t outsz) { const char *start = pretty; const char *space = strchr(pretty, ' '); if (space) start = space + 1; const char *paren = strrchr(start, '('); size_t len = paren ? (size_t)(paren - start) : strlen(start); if (len >= outsz) len = outsz - 1; memcpy(out, start, len); out[len] = '\0'; } void log_write(const log_level_t level, const char *func, const char *fmt, ...) { static const char *reset = "\033[0m"; const char *color; switch (level) { case LOG_INF: color = "\033[1;32m"; break; /* bold green */ case LOG_WRN: color = "\033[1;33m"; break; /* bold yellow */ case LOG_ERR: color = "\033[1;31m"; break; /* bold red */ case LOG_DBG: color = ""; break; case LOG_START: color = "\033[1;3;36m"; break; /* bold italic cyan */ default: color = ""; break; } char funcname[128]; fmt_funcname(func, funcname, sizeof(funcname)); /* ── console ─────────────────────────────────────────────────────── */ { va_list ap; va_start(ap, fmt); pthread_mutex_lock(&cmtx); fprintf(stderr, "[%s%s%s] ", color, funcname, reset); vfprintf(stderr, fmt, ap); fputc('\n', stderr); pthread_mutex_unlock(&cmtx); va_end(ap); } } #endif /* APPLOG_ENABLED */