#pragma once #include #define CLOG_MSG_MAX 0x1000 typedef enum { CLOG_FMT_JSONL = 0, CLOG_FMT_TEXT = 1, CLOG_FMT_TEXT_COLOR = 2, } ClogFmt; typedef enum { CLOG_INF = 0, CLOG_DBG = 1, CLOG_WRN = 2, CLOG_ERR = 3, } ClogLevel; typedef struct ClogEntry { ClogLevel level; char ts[26]; /* ctime() output, newline stripped */ const char *file; /* points to __FILE__ string literal */ unsigned int line; /* __LINE__ */ const char *func; /* points to __func__ string literal */ char msg[CLOG_MSG_MAX]; } ClogEntry; typedef ClogEntry *CLog; void clog_set_fmt(ClogFmt fmt); CLog clog_log_init(void); void clog_log_free(CLog log); void clog_log_print(const CLog log); /* internal — do not call directly */ void _clog_write_imm(ClogLevel level, const char *file, unsigned int line, const char *func, const char *msg); void _clog_write_log(CLog *log, ClogLevel level, const char *file, unsigned int line, const char *func, const char *msg); /* imperative */ #define clog(lvl, msg) _clog_write_imm((lvl), __FILE__, __LINE__, __func__, (msg)) /* monoid */ #define clogm(lvl, log, msg) _clog_write_log(&(log), (lvl), __FILE__, __LINE__, __func__, (msg))