00001
00002
00003
00004
00005
00006
00007
00008 #include "wvcolorlogconsole.h"
00009
00010 #include <termios.h>
00011
00012 bool WvColorLogConsole::is_tty(int fd)
00013 {
00014 struct termios termios;
00015 return tcgetattr(fd, &termios) == 0;
00016 }
00017
00018
00019 bool WvColorLogConsole::can_colorize(int fd, const char *TERM)
00020 {
00021 return is_tty(fd)
00022 && TERM != NULL
00023 && (strcmp(TERM, "linux") == 0
00024 || strcmp(TERM, "ansi") == 0
00025 || strcmp(TERM, "xterm") == 0
00026 || strcmp(TERM, "rxvt") == 0);
00027 }
00028
00029
00030 WvColorLogConsole::WvColorLogConsole(int _fd, WvLog::LogLevel _max_level) :
00031 WvLogConsole(_fd, _max_level),
00032 colorize(WvColorLogConsole::can_colorize(_fd, getenv("TERM")))
00033 {
00034 }
00035
00036
00037 WvColorLogConsole::~WvColorLogConsole()
00038 {
00039 }
00040
00041
00042 void WvColorLogConsole::_begin_line()
00043 {
00044 if (colorize)
00045 {
00046 const char *seq = WvColorLogConsole::color_start_seq(last_level);
00047 uwrite(seq, strlen(seq));
00048 }
00049 WvLogConsole::_begin_line();
00050 if (colorize)
00051 {
00052 const char *seq;
00053 seq = WvColorLogConsole::clear_to_eol_seq(last_level);
00054 uwrite(seq, strlen(seq));
00055 seq = WvColorLogConsole::color_end_seq(last_level);
00056 uwrite(seq, strlen(seq));
00057 }
00058 }
00059
00060
00061 void WvColorLogConsole::_mid_line(const char *str, size_t len)
00062 {
00063 if (colorize)
00064 {
00065 const char *seq;
00066 seq = WvColorLogConsole::color_start_seq(last_level);
00067 uwrite(seq, strlen(seq));
00068 }
00069 WvLogConsole::_mid_line(str, len);
00070 if (colorize)
00071 {
00072 const char *seq;
00073 seq = WvColorLogConsole::clear_to_eol_seq(last_level);
00074 uwrite(seq, strlen(seq));
00075 seq = WvColorLogConsole::color_end_seq(last_level);
00076 uwrite(seq, strlen(seq));
00077 }
00078 }
00079
00080
00081 void WvColorLogConsole::_end_line()
00082 {
00083 if (colorize)
00084 {
00085 const char *seq;
00086 seq = WvColorLogConsole::color_start_seq(last_level);
00087 uwrite(seq, strlen(seq));
00088 seq = WvColorLogConsole::clear_to_eol_seq(last_level);
00089 uwrite(seq, strlen(seq));
00090 seq = WvColorLogConsole::color_end_seq(last_level);
00091 uwrite(seq, strlen(seq));
00092 }
00093 WvLogConsole::_end_line();
00094 }
00095
00096
00097 const char *WvColorLogConsole::color_start_seq(WvLog::LogLevel log_level)
00098 {
00099 if (int(log_level) <= int(WvLog::Error))
00100 return "\e[41;37;1m";
00101 else if (int(log_level) <= int(WvLog::Warning))
00102 return "\e[43;37;1m";
00103 else
00104 return "\e[40;37;1m";
00105 }
00106
00107
00108 const char *WvColorLogConsole::clear_to_eol_seq(WvLog::LogLevel log_level)
00109 {
00110 return "\e[0K";
00111 }
00112
00113
00114 const char *WvColorLogConsole::color_end_seq(WvLog::LogLevel log_level)
00115 {
00116 return "\e[0m";
00117 }