1*2b54f0dbSXin Li #pragma once 2*2b54f0dbSXin Li 3*2b54f0dbSXin Li #include <stdarg.h> 4*2b54f0dbSXin Li #include <stdlib.h> 5*2b54f0dbSXin Li #include <inttypes.h> 6*2b54f0dbSXin Li 7*2b54f0dbSXin Li #define CLOG_NONE 0 8*2b54f0dbSXin Li #define CLOG_FATAL 1 9*2b54f0dbSXin Li #define CLOG_ERROR 2 10*2b54f0dbSXin Li #define CLOG_WARNING 3 11*2b54f0dbSXin Li #define CLOG_INFO 4 12*2b54f0dbSXin Li #define CLOG_DEBUG 5 13*2b54f0dbSXin Li 14*2b54f0dbSXin Li #ifndef CLOG_VISIBILITY 15*2b54f0dbSXin Li #if defined(__ELF__) 16*2b54f0dbSXin Li #define CLOG_VISIBILITY __attribute__((__visibility__("internal"))) 17*2b54f0dbSXin Li #elif defined(__MACH__) 18*2b54f0dbSXin Li #define CLOG_VISIBILITY __attribute__((__visibility__("hidden"))) 19*2b54f0dbSXin Li #else 20*2b54f0dbSXin Li #define CLOG_VISIBILITY 21*2b54f0dbSXin Li #endif 22*2b54f0dbSXin Li #endif 23*2b54f0dbSXin Li 24*2b54f0dbSXin Li #ifndef CLOG_ARGUMENTS_FORMAT 25*2b54f0dbSXin Li #if defined(__GNUC__) 26*2b54f0dbSXin Li #define CLOG_ARGUMENTS_FORMAT __attribute__((__format__(__printf__, 1, 2))) 27*2b54f0dbSXin Li #else 28*2b54f0dbSXin Li #define CLOG_ARGUMENTS_FORMAT 29*2b54f0dbSXin Li #endif 30*2b54f0dbSXin Li #endif 31*2b54f0dbSXin Li 32*2b54f0dbSXin Li #ifdef __cplusplus 33*2b54f0dbSXin Li extern "C" { 34*2b54f0dbSXin Li #endif 35*2b54f0dbSXin Li 36*2b54f0dbSXin Li CLOG_VISIBILITY void clog_vlog_debug(const char* module, const char* format, va_list args); 37*2b54f0dbSXin Li CLOG_VISIBILITY void clog_vlog_info(const char* module, const char* format, va_list args); 38*2b54f0dbSXin Li CLOG_VISIBILITY void clog_vlog_warning(const char* module, const char* format, va_list args); 39*2b54f0dbSXin Li CLOG_VISIBILITY void clog_vlog_error(const char* module, const char* format, va_list args); 40*2b54f0dbSXin Li CLOG_VISIBILITY void clog_vlog_fatal(const char* module, const char* format, va_list args); 41*2b54f0dbSXin Li 42*2b54f0dbSXin Li #define CLOG_DEFINE_LOG_DEBUG(log_debug_function_name, module, level) \ 43*2b54f0dbSXin Li CLOG_ARGUMENTS_FORMAT \ 44*2b54f0dbSXin Li inline static void log_debug_function_name(const char* format, ...) { \ 45*2b54f0dbSXin Li if (level >= CLOG_DEBUG) { \ 46*2b54f0dbSXin Li va_list args; \ 47*2b54f0dbSXin Li va_start(args, format); \ 48*2b54f0dbSXin Li clog_vlog_debug(module, format, args); \ 49*2b54f0dbSXin Li va_end(args); \ 50*2b54f0dbSXin Li } \ 51*2b54f0dbSXin Li } 52*2b54f0dbSXin Li 53*2b54f0dbSXin Li #define CLOG_DEFINE_LOG_INFO(log_info_function_name, module, level) \ 54*2b54f0dbSXin Li CLOG_ARGUMENTS_FORMAT \ 55*2b54f0dbSXin Li inline static void log_info_function_name(const char* format, ...) { \ 56*2b54f0dbSXin Li if (level >= CLOG_INFO) { \ 57*2b54f0dbSXin Li va_list args; \ 58*2b54f0dbSXin Li va_start(args, format); \ 59*2b54f0dbSXin Li clog_vlog_info(module, format, args); \ 60*2b54f0dbSXin Li va_end(args); \ 61*2b54f0dbSXin Li } \ 62*2b54f0dbSXin Li } 63*2b54f0dbSXin Li 64*2b54f0dbSXin Li #define CLOG_DEFINE_LOG_WARNING(log_warning_function_name, module, level) \ 65*2b54f0dbSXin Li CLOG_ARGUMENTS_FORMAT \ 66*2b54f0dbSXin Li inline static void log_warning_function_name(const char* format, ...) { \ 67*2b54f0dbSXin Li if (level >= CLOG_WARNING) { \ 68*2b54f0dbSXin Li va_list args; \ 69*2b54f0dbSXin Li va_start(args, format); \ 70*2b54f0dbSXin Li clog_vlog_warning(module, format, args); \ 71*2b54f0dbSXin Li va_end(args); \ 72*2b54f0dbSXin Li } \ 73*2b54f0dbSXin Li } 74*2b54f0dbSXin Li 75*2b54f0dbSXin Li #define CLOG_DEFINE_LOG_ERROR(log_error_function_name, module, level) \ 76*2b54f0dbSXin Li CLOG_ARGUMENTS_FORMAT \ 77*2b54f0dbSXin Li inline static void log_error_function_name(const char* format, ...) { \ 78*2b54f0dbSXin Li if (level >= CLOG_ERROR) { \ 79*2b54f0dbSXin Li va_list args; \ 80*2b54f0dbSXin Li va_start(args, format); \ 81*2b54f0dbSXin Li clog_vlog_error(module, format, args); \ 82*2b54f0dbSXin Li va_end(args); \ 83*2b54f0dbSXin Li } \ 84*2b54f0dbSXin Li } 85*2b54f0dbSXin Li 86*2b54f0dbSXin Li #define CLOG_DEFINE_LOG_FATAL(log_fatal_function_name, module, level) \ 87*2b54f0dbSXin Li CLOG_ARGUMENTS_FORMAT \ 88*2b54f0dbSXin Li inline static void log_fatal_function_name(const char* format, ...) { \ 89*2b54f0dbSXin Li if (level >= CLOG_FATAL) { \ 90*2b54f0dbSXin Li va_list args; \ 91*2b54f0dbSXin Li va_start(args, format); \ 92*2b54f0dbSXin Li clog_vlog_fatal(module, format, args); \ 93*2b54f0dbSXin Li va_end(args); \ 94*2b54f0dbSXin Li } \ 95*2b54f0dbSXin Li abort(); \ 96*2b54f0dbSXin Li } 97*2b54f0dbSXin Li 98*2b54f0dbSXin Li #ifdef __cplusplus 99*2b54f0dbSXin Li } /* extern "C" */ 100*2b54f0dbSXin Li #endif 101