33#include "xtc_export.h"
41typedef enum xtc_log_level {
50typedef struct xtc_log xtc_log_t;
54typedef int (*xtc_log_sink_fn)(
void *user, xtc_log_level_t lvl,
55 const char *buf,
size_t len);
57typedef struct xtc_log_opts {
60 xtc_log_level_t floor;
66#define XTC_LOG_OPTS_DEFAULT { \
69 .floor = XTC_LOG_INFO, \
89XTC_API
int xtc_log_create(
const xtc_log_opts_t *opts, xtc_log_t **out);
90XTC_API
void xtc_log_destroy(xtc_log_t *log);
92XTC_API
int xtc_log_set_floor(xtc_log_t *log, xtc_log_level_t lvl);
97XTC_API
int xtc_log_set_default(xtc_log_t *log);
98XTC_API xtc_log_t *xtc_log_default(
void);
102#if defined(__GNUC__) || defined(__clang__)
103# define XTC_LOG_PRINTF_FMT __attribute__((format(printf, 3, 4)))
105# define XTC_LOG_PRINTF_FMT
107XTC_API
void xtc_log_write(xtc_log_t *log, xtc_log_level_t lvl,
108 const char *fmt, ...)
110XTC_API
void xtc_log_vwrite(xtc_log_t *log, xtc_log_level_t lvl,
111 const
char *fmt, va_list ap);
117XTC_API
int xtc_log_drain(xtc_log_t *log);
120XTC_API
int xtc_log_drop_count(const xtc_log_t *log);
125#define XTC_LOG(lvl, ...) \
126 xtc_log_write(xtc_log_default(), (lvl), __VA_ARGS__)
127#define XTC_LOG_TRACE_F(...) XTC_LOG(XTC_LOG_TRACE, __VA_ARGS__)
128#define XTC_LOG_DEBUG_F(...) XTC_LOG(XTC_LOG_DEBUG, __VA_ARGS__)
129#define XTC_LOG_INFO_F(...) XTC_LOG(XTC_LOG_INFO, __VA_ARGS__)
130#define XTC_LOG_WARN_F(...) XTC_LOG(XTC_LOG_WARN, __VA_ARGS__)
131#define XTC_LOG_ERROR_F(...) XTC_LOG(XTC_LOG_ERROR, __VA_ARGS__)
132#define XTC_LOG_FATAL_F(...) XTC_LOG(XTC_LOG_FATAL, __VA_ARGS__)