terom@8: #ifndef LIB_LOG_H terom@8: #define LIB_LOG_H terom@1: terom@1: /* terom@1: * error handling terom@1: */ terom@1: terom@1: void _generic_err ( /*int level, */ int use_stderr, const char *func, int perr, const char *fmt, ...) terom@1: __attribute__ ((format (printf, 4, 5))); terom@1: terom@1: // needs to be defined as its own function for the noreturn attribute terom@1: void _generic_err_exit ( /* int level, */ int used_stderr, const char *func, int perr, const char *fmt, ...) terom@1: __attribute__ ((format (printf, 4, 5))) terom@1: __attribute__ ((noreturn)); terom@1: terom@1: enum _debug_level { terom@1: DEBUG_FATAL, terom@1: DEBUG_ERROR, terom@1: DEBUG_WARNING, terom@1: DEBUG_INFO, terom@1: DEBUG_DEBUG, terom@1: }; terom@1: terom@1: // not currently used terom@1: extern enum _debug_level _cur_debug_level; terom@1: terom@1: // various kinds of ways to handle an error, 2**3 of them, *g* terom@1: #define info(...) _generic_err( 0, NULL, 0, __VA_ARGS__ ) terom@1: #define error(...) _generic_err( 1, NULL, 0, __VA_ARGS__ ) terom@1: #define err_exit(...) _generic_err_exit( 1, NULL, 0, __VA_ARGS__ ) terom@1: #define perr(...) _generic_err( 1, NULL, 1, __VA_ARGS__ ) terom@1: #define perr_exit(...) _generic_err_exit( 1, NULL, 1, __VA_ARGS__ ) terom@1: #define err_func(func, ...) _generic_err( 1, func, 0, __VA_ARGS__ ) terom@1: #define err_func_exit(func, ...) _generic_err_exit( 1, func, 0, __VA_ARGS__ ) terom@1: #define perr_func(func, ...) _generic_err( 1, func, 1, __VA_ARGS__ ) terom@1: #define perr_func_exit(func, ...) _generic_err_exit( 1, func, 1, __VA_ARGS__ ) terom@2: #define eerr_func(func, err, ...) _generic_err( 1, func, err,__VA_ARGS__ ) terom@1: terom@2: /* terom@8: * Legacy... terom@2: */ terom@8: #include "error.h" terom@8: terom@1: #define WARNING(...) err_func(__func__, __VA_ARGS__) terom@1: #define PWARNING(...) perr_func(__func__, __VA_ARGS__) terom@2: #define EWARNING(err, ...) eerr_func(__func__, (err), __VA_ARGS__) terom@1: terom@1: #ifdef DEBUG_ENABLED terom@1: #define DEBUG(...) err_func(__func__, __VA_ARGS__) terom@1: #else terom@1: #define DEBUG(...) (void) (0) terom@1: #endif terom@1: terom@1: // default is to enable INFO terom@1: #ifdef INFO_DISABLED terom@1: #define INFO_ENABLED 0 terom@1: #else terom@1: #ifndef INFO_ENABLED terom@1: #define INFO_ENABLED 1 terom@1: #endif terom@1: #endif terom@1: terom@1: #if INFO_ENABLED terom@1: #define INFO(...) info(__VA_ARGS__) terom@1: #else terom@1: #define INFO(...) (void) (0) terom@1: #endif terom@1: terom@8: #endif /* LIB_LOG_H */