34# define _CLOG_ATTR_NONNULL(args...) __attribute__((nonnull(args)))
36# define _CLOG_ATTR_NONNULL(...)
40# define _CLOG_ATTR_PRINTF_FORMAT(format_param, dots_param) \
41 __attribute__((format(printf, format_param, dots_param)))
43# define _CLOG_ATTR_PRINTF_FORMAT(format_param, dots_param)
46#define STRINGIFY_ARG(x) "" #x
47#define STRINGIFY_APPEND(a, b) "" a #b
48#define STRINGIFY(x) STRINGIFY_APPEND("", x)
66#define CLG_LEVEL_LEN (CLG_LEVEL_TRACE + 1)
88 const char *file_line,
93 const char *file_line,
139#define CLG_LOGREF_DECLARE_GLOBAL(var, id) \
140 static CLG_LogRef _static_##var = {id}; \
141 CLG_LogRef *var = &_static_##var
144#define CLOG_ENSURE(clg_ref) \
145 ((clg_ref)->type ? (clg_ref)->type : (CLG_logref_init(clg_ref), (clg_ref)->type))
147#define CLOG_CHECK(clg_ref, verbose_level, ...) \
148 ((void)CLOG_ENSURE(clg_ref), ((clg_ref)->type->level >= verbose_level))
150#define CLOG_AT_LEVEL(clg_ref, verbose_level, ...) \
152 const CLG_LogType *_lg_ty = CLOG_ENSURE(clg_ref); \
153 if (_lg_ty->level >= verbose_level) { \
154 CLG_logf(_lg_ty, verbose_level, __FILE__ ":" STRINGIFY(__LINE__), __func__, __VA_ARGS__); \
159#define CLOG_AT_LEVEL_NOCHECK(clg_ref, verbose_level, ...) \
161 const CLG_LogType *_lg_ty = CLOG_ENSURE(clg_ref); \
162 if (!CLG_quiet_get() || _lg_ty->level >= verbose_level) { \
163 CLG_logf(_lg_ty, verbose_level, __FILE__ ":" STRINGIFY(__LINE__), __func__, __VA_ARGS__); \
168#define CLOG_STR_AT_LEVEL(clg_ref, verbose_level, str) \
170 const CLG_LogType *_lg_ty = CLOG_ENSURE(clg_ref); \
171 if (_lg_ty->level >= verbose_level) { \
172 CLG_log_str(_lg_ty, verbose_level, __FILE__ ":" STRINGIFY(__LINE__), __func__, str); \
177#define CLOG_STR_AT_LEVEL_NOCHECK(clg_ref, verbose_level, str) \
179 const CLG_LogType *_lg_ty = CLOG_ENSURE(clg_ref); \
180 if (!CLG_quiet_get() || _lg_ty->level >= verbose_level) { \
181 CLG_log_str(_lg_ty, verbose_level, __FILE__ ":" STRINGIFY(__LINE__), __func__, str); \
187#define CLOG_FATAL(clg_ref, ...) CLOG_AT_LEVEL(clg_ref, CLG_LEVEL_FATAL, __VA_ARGS__)
188#define CLOG_ERROR(clg_ref, ...) CLOG_AT_LEVEL(clg_ref, CLG_LEVEL_ERROR, __VA_ARGS__)
189#define CLOG_WARN(clg_ref, ...) CLOG_AT_LEVEL(clg_ref, CLG_LEVEL_WARN, __VA_ARGS__)
190#define CLOG_INFO(clg_ref, ...) CLOG_AT_LEVEL(clg_ref, CLG_LEVEL_INFO, __VA_ARGS__)
191#define CLOG_DEBUG(clg_ref, ...) CLOG_AT_LEVEL(clg_ref, CLG_LEVEL_DEBUG, __VA_ARGS__)
192#define CLOG_TRACE(clg_ref, ...) CLOG_AT_LEVEL(clg_ref, CLG_LEVEL_TRACE, __VA_ARGS__)
195#define CLOG_STR_FATAL(clg_ref, str) CLOG_STR_AT_LEVEL(clg_ref, CLG_LEVEL_FATAL, str)
196#define CLOG_STR_ERROR(clg_ref, str) CLOG_STR_AT_LEVEL(clg_ref, CLG_LEVEL_ERROR, str)
197#define CLOG_STR_WARN(clg_ref, str) CLOG_STR_AT_LEVEL(clg_ref, CLG_LEVEL_WARN, str)
198#define CLOG_STR_INFO(clg_ref, str) CLOG_STR_AT_LEVEL(clg_ref, CLG_LEVEL_INFO, str)
199#define CLOG_STR_DEBUG(clg_ref, str) CLOG_STR_AT_LEVEL(clg_ref, CLG_LEVEL_DEBUG, str)
200#define CLOG_STR_TRACE(clg_ref, str) CLOG_STR_AT_LEVEL(clg_ref, CLG_LEVEL_TRACE, str)
204#define CLOG_INFO_NOCHECK(clg_ref, format, ...) \
205 CLOG_AT_LEVEL_NOCHECK(clg_ref, CLG_LEVEL_INFO, format, __VA_ARGS__)
206#define CLOG_STR_INFO_NOCHECK(clg_ref, str) CLOG_STR_AT_LEVEL_NOCHECK(clg_ref, CLG_LEVEL_INFO, str)
void CLG_type_filter_exclude(const char *type_match, int type_match_len)
void CLG_output_set(void *file_handle)
void CLG_output_use_basename_set(int value)
void void CLG_logf(const CLG_LogType *lg, enum CLG_Level level, const char *file_line, const char *fn, const char *format,...) _CLOG_ATTR_NONNULL(1
void CLG_output_use_memory_set(int value)
void CLG_log_raw(const CLG_LogType *lg, const char *message)
void CLG_log_str(const CLG_LogType *lg, enum CLG_Level level, const char *file_line, const char *fn, const char *message) _CLOG_ATTR_NONNULL(1
void CLG_error_fn_set(void(*error_fn)(void *file_handle))
void CLG_level_set(CLG_Level level)
void CLG_output_use_source_set(int value)
void CLG_backtrace_fn_set(void(*fatal_fn)(void *file_handle))
#define _CLOG_ATTR_NONNULL(...)
void CLG_fatal_fn_set(void(*fatal_fn)(void *file_handle))
void CLG_logref_list_all(void(*callback)(const char *identifier, void *user_data), void *user_data)
void CLG_logref_register(CLG_LogRef *clg_ref)
void CLG_type_filter_include(const char *type_match, int type_match_len)
void CLG_logref_init(CLG_LogRef *clg_ref)
#define _CLOG_ATTR_PRINTF_FORMAT(format_param, dots_param)
void CLG_output_use_timestamp_set(int value)
void CLG_quiet_set(bool quiet)
int CLG_color_support_get(CLG_LogRef *clg_ref)
CLG_LogRef(const char *identifier)
struct CLG_LogType * next