/* sys/consoleinterface.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "sys/consoleinterface.h" #include #include namespace sys { ConsoleInterface *ConsoleInterface::consoleinterface_instance = 0; ConsoleInterface::ConsoleInterface() { consoleinterface_ansi = true; if (consoleinterface_instance) { std::cerr << "multiple sys::ConsoleInterface instances!" << std::endl; sys::quit(2); } consoleinterface_rcon = false; consoleinterface_instance = this; consoleinterface_text.clear(); consoleinterface_buffer.clear(); } ConsoleInterface::~ConsoleInterface() { consoleinterface_instance = 0; } ConsoleInterface *ConsoleInterface::instance() { return consoleinterface_instance; } std::ostream & ConsoleInterface::messagestream() { flush(); return (consoleinterface_buffer << "^N"); } std::ostream & ConsoleInterface::warningstream() { flush(); return (consoleinterface_buffer << "^W"); } std::ostream & ConsoleInterface::errorstream() { flush(); return (consoleinterface_buffer << "^R"); } std::ostream & ConsoleInterface::debugstream() { flush(); return (consoleinterface_buffer << "^D"); } void ConsoleInterface::flush() { if (rcon()) return; char line[MAXCMDSIZE]; while(consoleinterface_buffer.getline(line, MAXCMDSIZE-1)) { while (consoleinterface_text.size() >= MAXCONLINES) { consoleinterface_text.pop_front(); } consoleinterface_text.push_back(std::string(line)); // print to stdout print_ansi(line); std::cout << std::endl; } consoleinterface_buffer.clear(); } void ConsoleInterface::resize() { } void ConsoleInterface::print_ansi(const char *line) { if (consoleinterface_ansi) std::cout << "\033[0;39m"; const char *c = line; while (*c) { if ((*c == '^')) { bool is_code = true; int bold = 0; int color = 39; switch (*(c+1)) { case '0': // black color = 0; bold = 1; break; case '1': // red color = 31; break; case '2': // green color = 32; break; case '3': // yellow bold = 1; color = 33; break; case '4': // blue color = 34; break; case '5': // cyan color = 36; break; case '6': // magenta color = 35; break; case '7': // white is mapped to foreground color bold = 1; color = 39; break; case 'N': // normal bold = 0; color = 39; break; case 'B': // bold bold = 1; color = 39; break; case 'D': // debug bold = 0; color = 39; break; case 'R': // error bold = 0; color = 31; break; case 'W': // warning bold = 1; color = 33; break; case 'F': // fancy bold = 0; color = 32; break; default: is_code = false; } if (is_code) { c++; if (consoleinterface_ansi) std::cout << "\033[" << bold << ";" << color << "m"; } else std::cout << *c; } else { std::cout << *c; } c++; } if (consoleinterface_ansi) std::cout << "\033[0;39m"; } void ConsoleInterface::buffer_rcon(bool enable) { if (enable) { flush(); } consoleinterface_rcon = enable; } } // namespace sys