76 # define _CLOG_ATTR_NONNULL(args...) __attribute__((nonnull(args)))
78 # define _CLOG_ATTR_NONNULL(...)
82 # define _CLOG_ATTR_PRINTF_FORMAT(format_param, dots_param) \
83 __attribute__((format(printf, format_param, dots_param)))
85 # define _CLOG_ATTR_PRINTF_FORMAT(format_param, dots_param)
88 #define STRINGIFY_ARG(x) "" #x
89 #define STRINGIFY_APPEND(a, b) "" a #b
90 #define STRINGIFY(x) STRINGIFY_APPEND("", x)
105 #define CLG_SEVERITY_LEN (CLG_SEVERITY_FATAL + 1)
126 const char *file_line,
131 const char *file_line,
157 #define CLG_LOGREF_DECLARE_GLOBAL(var, id) \
158 static CLG_LogRef _static_##var = {id}; \
159 CLG_LogRef *var = &_static_##var
162 #define CLOG_ENSURE(clg_ref) \
163 ((clg_ref)->type ? (clg_ref)->type : (CLG_logref_init(clg_ref), (clg_ref)->type))
165 #define CLOG_CHECK(clg_ref, verbose_level, ...) \
166 ((void)CLOG_ENSURE(clg_ref), \
167 ((clg_ref)->type->flag & CLG_FLAG_USE) && ((clg_ref)->type->level >= verbose_level))
169 #define CLOG_AT_SEVERITY(clg_ref, severity, verbose_level, ...) \
171 CLG_LogType *_lg_ty = CLOG_ENSURE(clg_ref); \
172 if (((_lg_ty->flag & CLG_FLAG_USE) && (_lg_ty->level >= verbose_level)) || \
173 (severity >= CLG_SEVERITY_WARN)) { \
174 CLG_logf(_lg_ty, severity, __FILE__ ":" STRINGIFY(__LINE__), __func__, __VA_ARGS__); \
179 #define CLOG_STR_AT_SEVERITY(clg_ref, severity, verbose_level, str) \
181 CLG_LogType *_lg_ty = CLOG_ENSURE(clg_ref); \
182 if (((_lg_ty->flag & CLG_FLAG_USE) && (_lg_ty->level >= verbose_level)) || \
183 (severity >= CLG_SEVERITY_WARN)) { \
184 CLG_log_str(_lg_ty, severity, __FILE__ ":" STRINGIFY(__LINE__), __func__, str); \
189 #define CLOG_STR_AT_SEVERITY_N(clg_ref, severity, verbose_level, str) \
191 CLG_LogType *_lg_ty = CLOG_ENSURE(clg_ref); \
192 if (((_lg_ty->flag & CLG_FLAG_USE) && (_lg_ty->level >= verbose_level)) || \
193 (severity >= CLG_SEVERITY_WARN)) { \
194 const char *_str = str; \
195 CLG_log_str(_lg_ty, severity, __FILE__ ":" STRINGIFY(__LINE__), __func__, _str); \
196 MEM_freeN((void *)_str); \
201 #define CLOG_INFO(clg_ref, level, ...) \
202 CLOG_AT_SEVERITY(clg_ref, CLG_SEVERITY_INFO, level, __VA_ARGS__)
203 #define CLOG_WARN(clg_ref, ...) CLOG_AT_SEVERITY(clg_ref, CLG_SEVERITY_WARN, 0, __VA_ARGS__)
204 #define CLOG_ERROR(clg_ref, ...) CLOG_AT_SEVERITY(clg_ref, CLG_SEVERITY_ERROR, 0, __VA_ARGS__)
205 #define CLOG_FATAL(clg_ref, ...) CLOG_AT_SEVERITY(clg_ref, CLG_SEVERITY_FATAL, 0, __VA_ARGS__)
207 #define CLOG_STR_INFO(clg_ref, level, str) \
208 CLOG_STR_AT_SEVERITY(clg_ref, CLG_SEVERITY_INFO, level, str)
209 #define CLOG_STR_WARN(clg_ref, str) CLOG_STR_AT_SEVERITY(clg_ref, CLG_SEVERITY_WARN, 0, str)
210 #define CLOG_STR_ERROR(clg_ref, str) CLOG_STR_AT_SEVERITY(clg_ref, CLG_SEVERITY_ERROR, 0, str)
211 #define CLOG_STR_FATAL(clg_ref, str) CLOG_STR_AT_SEVERITY(clg_ref, CLG_SEVERITY_FATAL, 0, str)
214 #define CLOG_STR_INFO_N(clg_ref, level, str) \
215 CLOG_STR_AT_SEVERITY_N(clg_ref, CLG_SEVERITY_INFO, level, str)
216 #define CLOG_STR_WARN_N(clg_ref, str) CLOG_STR_AT_SEVERITY_N(clg_ref, CLG_SEVERITY_WARN, 0, str)
217 #define CLOG_STR_ERROR_N(clg_ref, str) CLOG_STR_AT_SEVERITY_N(clg_ref, CLG_SEVERITY_ERROR, 0, str)
218 #define CLOG_STR_FATAL_N(clg_ref, str) CLOG_STR_AT_SEVERITY_N(clg_ref, CLG_SEVERITY_FATAL, 0, str)
void void CLG_logf(CLG_LogType *lg, enum CLG_Severity severity, const char *file_line, const char *fn, const char *format,...) _CLOG_ATTR_NONNULL(1
void CLG_type_filter_include(const char *type_filter, int type_filter_len)
void CLG_output_set(void *file_handle)
void CLG_output_use_basename_set(int value)
void CLG_error_fn_set(void(*error_fn)(void *file_handle))
struct CLG_LogRef CLG_LogRef
void CLG_log_str(CLG_LogType *lg, enum CLG_Severity severity, const char *file_line, const char *fn, const char *message) _CLOG_ATTR_NONNULL(1
void CLG_backtrace_fn_set(void(*fatal_fn)(void *file_handle))
#define _CLOG_ATTR_NONNULL(...)
struct CLG_LogType CLG_LogType
void CLG_type_filter_exclude(const char *type_filter, int type_filter_len)
void CLG_fatal_fn_set(void(*fatal_fn)(void *file_handle))
void CLG_logref_init(CLG_LogRef *clg_ref)
#define _CLOG_ATTR_PRINTF_FORMAT(format_param, dots_param)
void CLG_level_set(int level)
void CLG_output_use_timestamp_set(int value)
int CLG_color_support_get(CLG_LogRef *clg_ref)
struct CLG_LogType * next