summaryrefslogtreecommitdiff
path: root/src/core/common
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-24 13:23:55 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-24 13:23:55 +0100
commit99c6f5df144d0530fe43225d353dee881cfdf26a (patch)
treea9a7499dda7d643861c753855823ed0f71aa8021 /src/core/common
parent67d36e699a2852ce471c4d1b8dab5992d6c01a98 (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.cpp143
-rw-r--r--src/core/common/Logger.hpp61
-rw-r--r--src/core/common/Terminal.cpp58
-rw-r--r--src/core/common/Terminal.hpp124
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_ */
-