wvcolorlogconsole.cc

00001 /*
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  * 
00005  * A version of WvColorLogConsole that colorizes the output
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 }

Generated on Fri Oct 5 18:20:27 2007 for WvStreams by  doxygen 1.5.3