Changeset 2604

Show
Ignore:
Timestamp:
01/30/06 00:56:46 (3 years ago)
Author:
madcat
Message:

Adds support for colors on win32.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • hydranode/hnbase/log.cpp

    r2465 r2604  
    105105} 
    106106 
     107void Log::writeMsg(const std::string &msg) { 
     108#ifdef WIN32 // custom code for win32 console colors handling 
     109        std::string tmp; 
     110        DWORD cWritten; 
     111        WORD wOldColors; 
     112        CONSOLE_SCREEN_BUFFER_INFO csbiInfo; 
     113        GetConsoleScreenBufferInfo(GetStdHandle(STD_ERROR_HANDLE), &csbiInfo); 
     114        wOldColors = csbiInfo.wAttributes; 
     115        for (size_t i = 0; i < msg.size(); ++i) { 
     116                if (msg[i] == '\33' && msg[i+1] == '[' && msg.size() >= i+5) { 
     117                        DWORD color = 0; 
     118                        if (msg[i+2] == '1') { 
     119                                color |= FOREGROUND_INTENSITY; 
     120                        } 
     121                        if (msg[i+5] == '1') { 
     122                                color |= FOREGROUND_RED; 
     123                        } else if (msg[i+5] == '2') { 
     124                                color |= FOREGROUND_GREEN; 
     125                        } else if (msg[i+5] == '3') { 
     126                                color |= FOREGROUND_RED; 
     127                                color |= FOREGROUND_GREEN; 
     128                        } else if (msg[i+5] == '4') { 
     129                                color |= FOREGROUND_BLUE; 
     130                        } else if (msg[i+5] == '5') { 
     131                                color |= FOREGROUND_BLUE; 
     132                                color |= FOREGROUND_RED; 
     133                        } else if (msg[i+5] == '6') { 
     134                                color |= FOREGROUND_GREEN; 
     135                                color |= FOREGROUND_BLUE; 
     136                        } else { 
     137                                color = wOldColors; 
     138                        } 
     139                        WriteConsole( 
     140                                GetStdHandle(STD_ERROR_HANDLE),  
     141                                tmp.c_str(), tmp.size(), &cWritten, NULL 
     142                        ); 
     143                        tmp.clear(); 
     144                        SetConsoleTextAttribute( 
     145                                GetStdHandle(STD_ERROR_HANDLE), color 
     146                        ); 
     147                        if (msg[i+5] == 'm') { 
     148                                i += 5; 
     149                        } else if (msg[i+6] == 'm') { 
     150                                i += 6; 
     151                        } 
     152                } else { 
     153                        tmp.push_back(msg[i]); 
     154                } 
     155        } 
     156        if (tmp.size()) { 
     157                WriteConsole( 
     158                        GetStdHandle(STD_ERROR_HANDLE),  
     159                        tmp.c_str(), tmp.size(), &cWritten, NULL 
     160                        ); 
     161                tmp.clear(); 
     162        } 
     163#else 
     164        std::cerr << msg; 
     165#endif 
     166} 
     167 
    107168void Log::doLogString(MessageType t, const std::string &msg) { 
    108169        if (m_output) { 
    109170                // clear any existing garbage 
    110                 std::cerr << '\r' << m_preStr << msg; 
     171                std::cerr << '\r' << m_preStr; 
     172                writeMsg(msg); 
    111173                int amount = 77 - (m_preStr.size() + msg.size()); 
    112174                if (amount > 0) { 
  • hydranode/hnbase/log.h

    r2496 r2604  
    233233                return std::string(""); 
    234234        } 
     235 
     236        /** 
     237         * Platform-independent console output method. 
     238         * 
     239         * @param msg        Message to be written 
     240         * 
     241         * On POSIX systems, this method merely writes the specified message 
     242         * to std::cerr. However, custom code is required on windows to set 
     243         * console colors, so this method transforms the POSIX color escape 
     244         * sequences into win32 API calls. 
     245         * 
     246         * As a rule, when performing custom console output (Log functions use 
     247         * this method internally already), use this method instead of direct 
     248         * console IO. 
     249         */ 
     250        static void writeMsg(const std::string &msg); 
    235251 
    236252        /** 
  • hydranode/hnbase/osdep.h

    r2516 r2604  
    216216#endif 
    217217 
    218 //! Enable ansi colors for all non-windows platforms 
    219 #ifndef WIN32 
    220         #define __ANSI_COLORS__ 
    221 #endif 
    222  
    223218/** 
    224219 * Ansi color codes. These can be used to colourize text output to terminal 
     
    226221 * be done on runtime (perhaps using a commandline argument?). 
    227222 */ 
    228 #if defined(__ANSI_COLORS__) 
    229         #define COL_NONE     "\33[0;0m" 
    230         #define COL_BLACK    "\33[0;30m" 
    231         #define COL_RED      "\33[0;31m" 
    232         #define COL_BRED     "\33[1;31m" 
    233         #define COL_GREEN    "\33[0;32m" 
    234         #define COL_BGREEN   "\33[1;32m" 
    235         #define COL_YELLOW   "\33[0;33m" 
    236         #define COL_BYELLOW  "\33[1;33m" 
    237         #define COL_BLUE     "\33[0;34m" 
    238         #define COL_BBLUE    "\33[1;34m" 
    239         #define COL_MAGENTA  "\33[0;35m" 
    240         #define COL_BMAGENTA "\33[1;35m" 
    241         #define COL_CYAN     "\33[0;36m" 
    242         #define COL_BCYAN    "\33[1;36m" 
    243         #define COL_WHITE    "\33[0;37m" 
    244         #define COL_BWHITE   "\33[1;37m" 
    245 #else 
    246         #define COL_NONE 
    247         #define COL_BLACK 
    248         #define COL_RED 
    249         #define COL_BRED 
    250         #define COL_GREEN 
    251         #define COL_BGREEN 
    252         #define COL_YELLOW 
    253         #define COL_BYELLOW 
    254         #define COL_BLUE 
    255         #define COL_BBLUE 
    256         #define COL_MAGENTA 
    257         #define COL_BMAGENTA 
    258         #define COL_CYAN 
    259         #define COL_BCYAN 
    260         #define COL_WHITE 
    261         #define COL_BWHITE 
    262 #endif 
     223#define COL_NONE     "\33[0;0m" 
     224#define COL_BLACK    "\33[0;30m" 
     225#define COL_RED      "\33[0;31m" 
     226#define COL_BRED     "\33[1;31m" 
     227#define COL_GREEN    "\33[0;32m" 
     228#define COL_BGREEN   "\33[1;32m" 
     229#define COL_YELLOW   "\33[0;33m" 
     230#define COL_BYELLOW  "\33[1;33m" 
     231#define COL_BLUE     "\33[0;34m" 
     232#define COL_BBLUE    "\33[1;34m" 
     233#define COL_MAGENTA  "\33[0;35m" 
     234#define COL_BMAGENTA "\33[1;35m" 
     235#define COL_CYAN     "\33[0;36m" 
     236#define COL_BCYAN    "\33[1;36m" 
     237#define COL_WHITE    "\33[0;37m" 
     238#define COL_BWHITE   "\33[1;37m" 
    263239 
    264240//! Compile code only when compiling with GNU GCC 
  • hydranode/hnbase/schedbase.cpp

    r2496 r2604  
    148148        logMsg( 
    149149                boost::format( 
    150                         "Networking scheduler started: UpSpeedLimit:
    151                         "%s/s DownSpeedLimit: %s/s
     150                        "Networking scheduler started (upload
     151                        "%s/s, download %s/s).
    152152                ) % Utils::bytesToString(m_upLimit) 
    153153                % Utils::bytesToString(m_downLimit) 
     
    382382                fmt3 % m_displayUpSpeed % m_displayDownSpeed % m_connCnt; 
    383383                boost::recursive_mutex::scoped_lock l(Log::getIosLock()); 
    384                 std::cout << '\r' << fmt3.str(); 
    385                 std::cout.flush(); 
     384                std::cerr << '\r'; 
     385                Log::writeMsg(fmt3.str()); 
     386                std::cerr.flush(); 
    386387                nextUpdate = m_curTick + 100; 
    387388        }