From f6377045c90312c1bb2c719dfbcad9d469c6898e Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sun, 6 Aug 2023 19:00:34 +0300 Subject: [PATCH] Add red color to stderr logging --- .../log/include/psemek/log/colored_stream.hpp | 10 ++++ libs/log/source/colored_stream.cpp | 45 ++++++++++++++++++ libs/sdl2/source/main.cpp | 5 ++ .../include/psemek/util/terminal_color.hpp | 16 +++++++ libs/util/source/terminal_color.cpp | 47 +++++++++++++++++++ tools/test/source/main.cpp | 24 ++++------ 6 files changed, 131 insertions(+), 16 deletions(-) create mode 100644 libs/log/include/psemek/log/colored_stream.hpp create mode 100644 libs/log/source/colored_stream.cpp create mode 100644 libs/util/include/psemek/util/terminal_color.hpp create mode 100644 libs/util/source/terminal_color.cpp diff --git a/libs/log/include/psemek/log/colored_stream.hpp b/libs/log/include/psemek/log/colored_stream.hpp new file mode 100644 index 00000000..a486a641 --- /dev/null +++ b/libs/log/include/psemek/log/colored_stream.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include + +namespace psemek::log +{ + + std::unique_ptr colored_stream(std::unique_ptr stream, std::string open, std::string close); + +} diff --git a/libs/log/source/colored_stream.cpp b/libs/log/source/colored_stream.cpp new file mode 100644 index 00000000..f64e90b5 --- /dev/null +++ b/libs/log/source/colored_stream.cpp @@ -0,0 +1,45 @@ +#include + +namespace psemek::log +{ + + namespace + { + + struct colored_stream_impl + : io::ostream + { + colored_stream_impl(std::unique_ptr stream, std::string open, std::string close) + : stream_(std::move(stream)) + , open_(std::move(open)) + , close_(std::move(close)) + {} + + std::size_t write(char const * p, std::size_t size) override + { + std::size_t result = 0; + stream_->write(open_.data(), open_.size()); + result += stream_->write(p, size); + stream_->write(close_.data(), close_.size()); + return result; + } + + void flush() override + { + stream_->flush(); + } + + private: + std::unique_ptr stream_; + std::string open_; + std::string close_; + }; + + } + + std::unique_ptr colored_stream(std::unique_ptr stream, std::string open, std::string close) + { + return std::make_unique(std::move(stream), std::move(open), std::move(close)); + } + +} diff --git a/libs/sdl2/source/main.cpp b/libs/sdl2/source/main.cpp index dfc702f1..a6b4cc16 100644 --- a/libs/sdl2/source/main.cpp +++ b/libs/sdl2/source/main.cpp @@ -6,8 +6,10 @@ #include #include #include +#include #include #include +#include #undef main @@ -28,6 +30,9 @@ int main(int argc, char ** argv) try synchronized_stdout_stderr.push_back(io::std_err()); synchronized_stdout_stderr = io::synchronized(std::move(synchronized_stdout_stderr)); + if (util::terminal_color::supported()) + synchronized_stdout_stderr[1] = log::colored_stream(std::move(synchronized_stdout_stderr[1]), std::string{util::terminal_color::red()}, std::string{util::terminal_color::normal()}); + log::add_sink(log::default_sink(std::move(synchronized_stdout_stderr[0]), stdio_log_level, log::level::info)); log::add_sink(log::default_sink(std::move(synchronized_stdout_stderr[1]), log::level::warning, log::level::error)); log::register_thread("main"); diff --git a/libs/util/include/psemek/util/terminal_color.hpp b/libs/util/include/psemek/util/terminal_color.hpp new file mode 100644 index 00000000..779bf80d --- /dev/null +++ b/libs/util/include/psemek/util/terminal_color.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace psemek::util::terminal_color +{ + + bool supported(); + std::string_view bold(); + std::string_view red(); + std::string_view green(); + std::string_view yellow(); + std::string_view cyan(); + std::string_view normal(); + +} diff --git a/libs/util/source/terminal_color.cpp b/libs/util/source/terminal_color.cpp new file mode 100644 index 00000000..411a6725 --- /dev/null +++ b/libs/util/source/terminal_color.cpp @@ -0,0 +1,47 @@ +#include + +#include + +namespace psemek::util::terminal_color +{ + + bool supported() + { + std::string_view term; + if (auto t = std::getenv("TERM")) + term = t; + + return term == "linux" || term.starts_with("xterm"); + } + + std::string_view bold() + { + return "\033[1m"; + } + + std::string_view red() + { + return "\033[1;31m"; + } + + std::string_view green() + { + return "\033[1;32m"; + } + + std::string_view yellow() + { + return "\033[33m"; + } + + std::string_view cyan() + { + return "\033[36m"; + } + + std::string_view normal() + { + return "\033[0m"; + } + +} diff --git a/tools/test/source/main.cpp b/tools/test/source/main.cpp index daa74404..4f3a06d3 100644 --- a/tools/test/source/main.cpp +++ b/tools/test/source/main.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -63,15 +64,6 @@ namespace psemek::test } -static bool terminal_has_color() -{ - std::string_view term; - if (auto t = std::getenv("TERM")) - term = t; - - return term == "linux" || term.starts_with("xterm"); -} - int main(int argc, char ** argv) { std::string_view bold; @@ -81,14 +73,14 @@ int main(int argc, char ** argv) std::string_view cyan; std::string_view normal; - if (terminal_has_color()) + if (psemek::util::terminal_color::supported()) { - bold = "\033[1m"; - red = "\033[1;31m"; - green = "\033[1;32m"; - yellow = "\033[33m"; - cyan = "\033[36m"; - normal = "\033[0m"; + bold = psemek::util::terminal_color::bold(); + red = psemek::util::terminal_color::red(); + green = psemek::util::terminal_color::green(); + yellow = psemek::util::terminal_color::yellow(); + cyan = psemek::util::terminal_color::cyan(); + normal = psemek::util::terminal_color::normal(); } std::set tests;