diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-01-24 13:23:55 +0100 |
---|---|---|
committer | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-01-24 13:23:55 +0100 |
commit | 99c6f5df144d0530fe43225d353dee881cfdf26a (patch) | |
tree | a9a7499dda7d643861c753855823ed0f71aa8021 /src/core/common | |
parent | 67d36e699a2852ce471c4d1b8dab5992d6c01a98 (diff) |
Moved Terminal and TerminalLogger to own classes in new frontent folder
Diffstat (limited to 'src/core/common')
-rw-r--r-- | src/core/common/Logger.cpp | 143 | ||||
-rw-r--r-- | src/core/common/Logger.hpp | 61 | ||||
-rw-r--r-- | src/core/common/Terminal.cpp | 58 | ||||
-rw-r--r-- | src/core/common/Terminal.hpp | 124 |
4 files changed, 19 insertions, 367 deletions
diff --git a/src/core/common/Logger.cpp b/src/core/common/Logger.cpp index aa61e6a..54156f2 100644 --- a/src/core/common/Logger.cpp +++ b/src/core/common/Logger.cpp @@ -20,8 +20,6 @@ #include <sstream> #include "Logger.hpp" -#include "Terminal.hpp" -#include "Utils.hpp" namespace ousia { @@ -118,49 +116,49 @@ void LoggerFork::commit() purge(); } -/* Class ScopedLogger */ +/* Class GuardedLogger */ -ScopedLogger::ScopedLogger(Logger &parent, SourceLocation loc) +GuardedLogger::GuardedLogger(Logger &parent, SourceLocation loc) : parent(parent), depth(0) { pushDefaultLocation(loc); } -ScopedLogger::~ScopedLogger() +GuardedLogger::~GuardedLogger() { while (depth > 0) { popDefaultLocation(); } } -void ScopedLogger::processMessage(const Message &msg) +void GuardedLogger::processMessage(const Message &msg) { parent.processMessage(msg); } -bool ScopedLogger::filterMessage(const Message &msg) +bool GuardedLogger::filterMessage(const Message &msg) { return parent.filterMessage(msg); } -void ScopedLogger::processPushDefaultLocation(const SourceLocation &loc) +void GuardedLogger::processPushDefaultLocation(const SourceLocation &loc) { parent.processPushDefaultLocation(loc); depth++; } -void ScopedLogger::processPopDefaultLocation() +void GuardedLogger::processPopDefaultLocation() { depth--; parent.processPopDefaultLocation(); } -void ScopedLogger::processSetDefaultLocation(const SourceLocation &loc) +void GuardedLogger::processSetDefaultLocation(const SourceLocation &loc) { parent.processSetDefaultLocation(loc); } -void ScopedLogger::processSetSourceContextCallback( +void GuardedLogger::processSetSourceContextCallback( SourceContextCallback sourceContextCallback) { parent.processSetSourceContextCallback(sourceContextCallback); @@ -265,128 +263,5 @@ bool ConcreteLogger::hasFatalError() return getSeverityCount(Severity::FATAL_ERROR) > 0; } -/* Class TerminalLogger */ - -void TerminalLogger::processMessage(const Message &msg) -{ - Terminal t(useColor); - - // Fetch filename, position and context - const SourceContext ctx = messageContext(msg); - - // Print the file name - if (ctx.hasFile()) { - os << t.bright() << ctx.filename << t.reset(); - } - - // Print line and column number - if (ctx.hasLine()) { - if (ctx.hasFile()) { - os << ':'; - } - os << t.bright() << ctx.startLine << t.reset(); - if (ctx.hasColumn()) { - os << ':' << ctx.startColumn; - } - } - - // Print the optional seperator - if (ctx.hasFile() || ctx.hasLine()) { - os << ": "; - } - - // Print the severity - switch (msg.severity) { - case Severity::DEBUG: - break; - case Severity::NOTE: - os << t.color(Terminal::CYAN, true) << "note: "; - break; - case Severity::WARNING: - os << t.color(Terminal::MAGENTA, true) << "warning: "; - break; - case Severity::ERROR: - os << t.color(Terminal::RED, true) << "error: "; - break; - case Severity::FATAL_ERROR: - os << t.color(Terminal::RED, true) << "fatal error: "; - break; - } - os << t.reset(); - - // Print the actual message - os << msg.msg << std::endl; - - // Print the error message context if available - if (ctx.hasText()) { - // Iterate over each line in the text - std::vector<std::string> lines = Utils::split(ctx.text, '\n'); - - const size_t relLen = ctx.relLen ? ctx.relLen : 1; - const size_t relPos = ctx.relPos; - const size_t pstart = relPos; - const size_t pend = relPos + relLen; - - size_t lstart = 0; - size_t lend = 0; - for (size_t n = 0; n < lines.size(); n++) { - bool firstLine = n == 0; - bool lastLine = n == lines.size() - 1; - - // Indicate truncation and indent non-first lines - if (ctx.truncatedStart && firstLine) { - os << "[...] "; - } - if (!firstLine) { - os << "\t"; - } - - // Print the actual line - os << lines[n]; - - // Indicate truncation - if (ctx.truncatedEnd && lastLine) { - os << " [...]"; - } - os << std::endl; - - // Repeat truncation or indendation space in the next line - if (ctx.truncatedStart && firstLine) { - os << " "; - } - if (!firstLine) { - os << "\t"; - } - - // Print the position indicators - lend = lastLine ? pend : lstart + lines[n].size(); - for (size_t i = lstart; i < lend; i++) { - if (i >= pstart && i < pend) { - os << t.color(Terminal::GREEN); - for (; i < std::min(lend, pend); i++) { - if (relLen == 1) { - os << '^'; - } else { - os << '~'; - } - if (i < ctx.text.size() && ctx.text[i] == '\t') { - os << '\t'; - } - } - os << t.reset(); - } else { - if (i < ctx.text.size() && ctx.text[i] == '\t') { - os << '\t'; - } else { - os << ' '; - } - } - } - os << std::endl; - - lstart = lend; - } - } -} } diff --git a/src/core/common/Logger.hpp b/src/core/common/Logger.hpp index 85b1bb1..afe58be 100644 --- a/src/core/common/Logger.hpp +++ b/src/core/common/Logger.hpp @@ -19,9 +19,8 @@ /** * @file Logger.hpp * - * Contains classes for logging messages in Ousía. Provides a generic Logger - * class, and TerminalLogger, an extension of Logger which logs do an output - * stream. + * Contains classes for logging messages in Ousía. Provides various base Logger + * classes that allow to Fork logger instances or to create a GuardedLogger. * * @author Andreas Stöckel (astoecke@techfak.uni-bielefeld.de) */ @@ -30,7 +29,6 @@ #define _OUSIA_LOGGER_HPP_ #include <cstdint> -#include <ostream> #include <string> #include <vector> @@ -109,7 +107,7 @@ inline MessageMode operator|(MessageMode a, MessageMode b) // Forward declaration class LoggerFork; -class ScopedLogger; +class GuardedLogger; /** * The Logger class is the base class the individual logging systems should @@ -123,7 +121,7 @@ class ScopedLogger; class Logger { public: friend LoggerFork; - friend ScopedLogger; + friend GuardedLogger; /** * The message struct represents a single log message and all information @@ -611,12 +609,12 @@ public: }; /** - * The ScopedLogger class can be used to automatically pop any pushed file from + * The GuardedLogger class can be used to automatically pop any pushed file from * the File stack maintained by a Logger class (in a RAII manner). This * simplifies managing pushing and popping files in case there are multiple * return calls or exceptions thrown. */ -class ScopedLogger : public Logger { +class GuardedLogger : public Logger { private: /** * Reference to the parent logger instance. @@ -668,20 +666,20 @@ protected: public: /** - * Constructor of the ScopedLogger class, pushes a first file instance onto + * Constructor of the GuardedLogger class, pushes a first file instance onto * the file stack. * * @param parent is the parent logger instance to which all calls should * be relayed. * @param loc specifies the first source location. */ - ScopedLogger(Logger &parent, SourceLocation loc = SourceLocation{}); + GuardedLogger(Logger &parent, SourceLocation loc = SourceLocation{}); /** - * Destructor of the ScopedLogger class, automatically unwinds the file + * Destructor of the GuardedLogger class, automatically unwinds the file * stack. */ - ~ScopedLogger(); + ~GuardedLogger(); }; /** @@ -818,45 +816,6 @@ public: bool hasFatalError(); }; -/** - * Class extending the Logger class and printing the log messages to the - * given - * stream. - */ -class TerminalLogger : public ConcreteLogger { -private: - /** - * Reference to the target output stream. - */ - std::ostream &os; - - /** - * If true, the TerminalLogger will use colors to make the log messages - * prettier. - */ - bool useColor; - -protected: - void processMessage(const Message &msg) override; - -public: - /** - * Constructor of the TerminalLogger class. - * - * @param os is the output stream the log messages should be logged to. - * Should be set to std::cerr in most cases. - * @param useColor if true, the TerminalLogger class will do its best to - * use ANSI/VT100 control sequences for colored log messages. - * @param minSeverity is the minimum severity below which log messages - *are - * discarded. - */ - TerminalLogger(std::ostream &os, bool useColor = false, - Severity minSeverity = DEFAULT_MIN_SEVERITY) - : ConcreteLogger(minSeverity), os(os), useColor(useColor) - { - } -}; } #endif /* _OUSIA_LOGGER_HPP_ */ diff --git a/src/core/common/Terminal.cpp b/src/core/common/Terminal.cpp deleted file mode 100644 index 447e595..0000000 --- a/src/core/common/Terminal.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - Ousía - Copyright (C) 2014 Benjamin Paaßen, Andreas Stöckel - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include <sstream> - -#include "Terminal.hpp" - -namespace ousia { - -std::string Terminal::color(int color, bool bright) const -{ - if (!useColor) { - return std::string{}; - } - std::stringstream ss; - ss << "\x1b["; - if (bright) { - ss << "1;"; - } - ss << color << "m"; - return ss.str(); -} - -std::string Terminal::bright() const -{ - if (!useColor) { - return std::string{}; - } - std::stringstream ss; - ss << "\x1b[1m"; - return ss.str(); -} - -std::string Terminal::reset() const -{ - if (!useColor) { - return std::string{}; - } - return "\x1b[0m"; -} - -} - diff --git a/src/core/common/Terminal.hpp b/src/core/common/Terminal.hpp deleted file mode 100644 index 730853d..0000000 --- a/src/core/common/Terminal.hpp +++ /dev/null @@ -1,124 +0,0 @@ -/* - Ousía - Copyright (C) 2014 Benjamin Paaßen, Andreas Stöckel - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -/** - * @file Terminal.hpp - * - * Classes for printing colored output to a terminal. - * - * @author Andreas Stöckel (astoecke@techfak.uni-bielefeld.de) - */ - -#ifndef _OUSIA_TERMINAL_HPP_ -#define _OUSIA_TERMINAL_HPP_ - -#include <string> - -namespace ousia { - -/** - * The Terminal class contains some helper functions used to interact with the - * terminal as used for colorful output when logging error messages. - * - * TODO: Disable on Windows or use corresponding API-functions for setting the - * color. - * TODO: Give output stream to terminal/use terminal as output stream - */ -class Terminal { -private: - /** - * If set to false, no control codes are generated. - */ - bool useColor; - -public: - /** - * ANSI color code for black. - */ - static const int BLACK = 30; - - /** - * ANSI color code for red. - */ - static const int RED = 31; - - /** - * ANSI color code for green. - */ - static const int GREEN = 32; - - /** - * ANSI color code for yellow. - */ - static const int YELLOW = 33; - - /** - * ANSI color code for blue. - */ - static const int BLUE = 34; - - /** - * ANSI color code for magenta. - */ - static const int MAGENTA = 35; - - /** - * ANSI color code for cyan. - */ - static const int CYAN = 36; - - /** - * ANSI color code for white. - */ - static const int WHITE = 37; - - /** - * Creates a new instance of the Terminal class. - * - * @param useColor specifies whether color codes should be generated. - */ - Terminal(bool useColor) : useColor(useColor) {} - - /** - * Returns a control string for switching to the given color. - * - * @param color is the color the terminal should switch to. - * @param bright specifies whether the terminal should switch to the bright - * mode. - * @return a control string to be included in the output stream. - */ - std::string color(int color, bool bright = true) const; - - /** - * Returns a control string for switching to the bright mode. - * - * @return a control string to be included in the output stream. - */ - std::string bright() const; - - /** - * Returns a control string for switching to the default mode. - * - * @return a control string to be included in the output stream. - */ - std::string reset() const; -}; -} - -#endif /* _OUSIA_TERMINAL_HPP_ */ - |