terom@21: terom@21: #include "log.h" terom@21: terom@21: #include terom@21: #include terom@21: terom@21: #define _LOG_LEVEL_NAME(ll) case LOG_ ## ll: return #ll; terom@21: const char *log_level_name (enum log_level level) terom@21: { terom@21: switch (level) { terom@21: _LOG_LEVEL_NAME(DEBUG) terom@21: _LOG_LEVEL_NAME(INFO) terom@21: _LOG_LEVEL_NAME(WARN) terom@21: _LOG_LEVEL_NAME(ERROR) terom@21: _LOG_LEVEL_NAME(FATAL) terom@21: default: return "???"; terom@21: } terom@21: } terom@21: terom@21: /* terom@21: * Output the "[TYPE] FUNC: " header terom@21: */ terom@21: void _log_header (enum log_level level, const char *func) terom@21: { terom@22: printf("[%5s] %20s : ", log_level_name(level), func); terom@21: } terom@21: terom@21: void log_msg (enum log_level level, const char *func, const char *format, ...) terom@21: { terom@21: va_list vargs; terom@21: terom@21: _log_header(level, func); terom@21: terom@21: // formatted output terom@21: va_start(vargs, format); terom@21: vprintf(format, vargs); terom@21: va_end(vargs); terom@21: terom@21: // newline terom@21: printf("\n"); terom@21: } terom@21: terom@22: void _log_err (enum log_level level, err_t err, const char *func, const char *format, ...) terom@21: { terom@21: va_list vargs; terom@21: terom@21: // header terom@22: _log_header(level, func); terom@21: terom@21: // formatted output terom@21: va_start(vargs, format); terom@21: vprintf(format, vargs); terom@21: va_end(vargs); terom@21: terom@21: // err_code and newline terom@21: printf(": %s\n", error_name(err)); terom@21: } terom@21: terom@22: void _log_err_info (enum log_level level, struct error_info *err, const char *func, const char *format, ...) terom@21: { terom@21: va_list vargs; terom@21: terom@21: // header terom@22: _log_header(level, func); terom@21: terom@21: // formatted output terom@21: va_start(vargs, format); terom@21: vprintf(format, vargs); terom@21: va_end(vargs); terom@21: terom@21: // err_code and newline terom@21: printf(": %s\n", error_msg(err)); terom@21: }