diff options
Diffstat (limited to 'src/sys/consoleinterface.cc')
-rw-r--r-- | src/sys/consoleinterface.cc | 288 |
1 files changed, 157 insertions, 131 deletions
diff --git a/src/sys/consoleinterface.cc b/src/sys/consoleinterface.cc index 073f34b..284a48d 100644 --- a/src/sys/consoleinterface.cc +++ b/src/sys/consoleinterface.cc @@ -6,187 +6,213 @@ #include "sys/consoleinterface.h" -#include <iostream> - -#include <stdlib.h> - 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"); -} +const size_t DEFAULT_LOGSIZE = 2048; -std::ostream & ConsoleInterface::warningstream() -{ - flush(); - return (consoleinterface_buffer << "^W"); -} +/* -- ANSI color code support -------------------------------------- */ -std::ostream & ConsoleInterface::errorstream() -{ - flush(); - return (consoleinterface_buffer << "^R"); -} +bool con_ansicolor = false; -std::ostream & ConsoleInterface::debugstream() +bool ansi() { - flush(); - return (consoleinterface_buffer << "^D"); + return con_ansicolor; } -void ConsoleInterface::flush() +void set_ansi(const bool ansi) { - 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; + con_ansicolor = ansi; + if (con_ansicolor) { + // ANSI default color + std::cout << "\033[0;39m"; } - - consoleinterface_buffer.clear(); -} - -void ConsoleInterface::resize() -{ } -void ConsoleInterface::print_ansi(const char *line) +void fallback_print(const std::string &text) { - if (consoleinterface_ansi) - std::cout << "\033[0;39m"; - - const char *c = line; + bool is_color_code = false; + int ansi_bold = 0; + int ansi_color = 39; + + const char *c = text.c_str(); while (*c) { + + if ((*c) == '\n') { + std::cout << std::endl; + + } else if ((*c) == '^') { - if ((*c == '^')) { - bool is_code = true; - int bold = 0; - int color = 39; - + is_color_code = true; + ansi_bold = 0; + ansi_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; + ansi_color = 0; + ansi_bold = 1; break; - + case '1': // red + ansi_color = 31; + break; + case '2': // green + ansi_color = 32; + break; + case '3': // yellow + ansi_color = 1; + ansi_color = 33; + break; + case '4': // blue + ansi_color = 34; + break; + case '5': // cyan + ansi_color = 36; + break; + case '6': // magenta + ansi_color = 35; + break; + case '7': // white is mapped to foreground color + ansi_bold = 1; + ansi_color = 39; + break; + case 'N': // normal - bold = 0; - color = 39; + ansi_bold = 0; + ansi_color = 39; break; case 'B': // bold - bold = 1; - color = 39; + ansi_bold = 1; + ansi_color = 39; break; case 'D': // debug - bold = 0; - color = 39; + ansi_bold = 0; + ansi_color = 39; break; case 'R': // error - bold = 0; - color = 31; + ansi_bold = 0; + ansi_color = 31; break; case 'W': // warning - bold = 1; - color = 33; + ansi_bold = 1; + ansi_color = 33; break; case 'F': // fancy - bold = 0; - color = 32; + ansi_bold = 0; + ansi_color = 32; break; default: - is_code = false; + is_color_code = false; } - if (is_code) { + + if (is_color_code) { + if (con_ansicolor) + std::cout << "\033[" << ansi_bold << ";" << ansi_color << "m"; c++; - if (consoleinterface_ansi) - std::cout << "\033[" << bold << ";" << color << "m"; - } else + } else { std::cout << *c; + } + } else { std::cout << *c; } + c++; } +} - if (consoleinterface_ansi) - std::cout << "\033[0;39m"; +/* -- ConsoleBuffer ------------------------------------------------ */ + +int ConsoleBuffer::overflow(int c) +{ + if (c == Traits::eof()) + return Traits::not_eof(c); + + if (c == '\n') { + if (ConsoleInterface::instance()) { + ConsoleInterface::instance()->event_text(con_buffer); + } else { + fallback_print(con_buffer); + std::cout << std::endl; + } + con_buffer.clear(); + } else { + con_buffer += c; + } + return c; } -void ConsoleInterface::set_ansi(bool enable) +/* -- ConsoleStream ------------------------------------------------ */ + +ConsoleStream con_out; + +ConsoleStream::ConsoleStream() : std::basic_ostream<char, Traits>(&con_buffer) { - consoleinterface_ansi = enable; + clear(); } -void ConsoleInterface::set_rcon(bool enable) +ConsoleStream::~ConsoleStream() { - if (enable) { - flush(); + if (con_ansicolor) { + // ANSI default color + std::cout << "\033[0;39m" << std::endl; } +} + +/* -- Console ------------------------------------------------------ */ + +ConsoleInterface *ConsoleInterface::consoleinterface_instance = 0; + +ConsoleInterface::ConsoleInterface() +{ + if (consoleinterface_instance) { + std::cerr << "multiple sys::ConsoleInterface instances!" << std::endl; + sys::quit(2); + } + + consoleinterface_rcon = false; + consoleinterface_instance = this; + consoleinterface_logsize = DEFAULT_LOGSIZE; +} + +ConsoleInterface::~ConsoleInterface() +{ + consoleinterface_instance = 0; +} + +ConsoleInterface *ConsoleInterface::instance() +{ + return consoleinterface_instance; +} + +void ConsoleInterface::set_rcon(bool enable) +{ consoleinterface_rcon = enable; } -} // namespace sys +void ConsoleInterface::set_logsize(const size_t logsize) +{ + consoleinterface_logsize = logsize < 16 ? 16 : logsize; +} +void ConsoleInterface::event_text(const std::string & text) +{ + if (rcon()) { + consoleinterface_rconbuf.push_back(text); + } else { + while (consoleinterface_log.size() >= consoleinterface_logsize) { + consoleinterface_log.pop_front(); + } + + consoleinterface_log.push_back(std::string(text)); + print(text); + } +} + +void ConsoleInterface::print(const std::string & text) +{ + fallback_print(text); + std::cout << std::endl; +} + +} // namespace sys |