#include #include #include #include #include #include "log.h" #include "macros.h" #include "misc.h" typedef enum colour colour; enum colour { BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, NUM_COLOURS, RESET = NUM_COLOURS, }; static const char *print_ansi_colour(colour colour, int is_bg, int is_bright) { if (colour < NUM_COLOURS) { static char str[const_strlen("\x1B[100m")+1] = {0}; int colour_code = colour + 30; if (is_bg) { colour_code += 10; } if (is_bright) { colour_code += 60; } snprintf(str, sizeof(str)-1, "\x1B[%dm", colour_code); return str; } else { return "\x1B[0m"; } } static const char *print_priority_colour(int priority) { colour colour = RESET; int is_bg = 0; int is_bright = 0; switch (priority) { case LOG_ERR : colour = RED; break; case LOG_WARNING: colour = YELLOW; is_bright = 1; break; case LOG_NOTICE : colour = CYAN; break; case LOG_INFO : colour = MAGENTA; break; case LOG_DEBUG : colour = GREEN; break; default : break; } return print_ansi_colour(colour, is_bg, is_bright); } static const char *priority_to_str(int priority) { switch (priority) { case LOG_ERR : return "ERROR"; case LOG_WARNING: return "WARNING"; case LOG_NOTICE : return "NOTICE"; case LOG_INFO : return "INFO"; case LOG_DEBUG : return "DEBUG"; default : return "UNKNOWN"; } } void vprintlog(log_output output_type, int priority, const char *fmt, va_list args) { const char *priority_str = priority_to_str(priority); char *buf = calloc(vformat_len_copy(fmt, args)+1, sizeof(char)); vsprintf(buf, fmt, args); switch (output_type) { case LOG_OUT_SYSLOG: { syslog(priority, "%s: %s", priority_str, buf); break; } case LOG_OUT_STDERR: case LOG_OUT_STDOUT: { FILE *output = (output_type == LOG_OUT_STDOUT) ? stdout : stderr; fprintf(output, "%s%s: %s\x1B[0m\n", print_priority_colour(priority), priority_str, buf); break; } default: break; } free(buf); } void printlog(log_output output_type, int priority, const char *fmt, ...) { va_list args; va_start(args, fmt); vprintlog(output_type, priority, fmt, args); va_end(args); }