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