Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/consoleinterface.cc')
-rw-r--r--src/sys/consoleinterface.cc288
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