From 30d8014422e2f816c4577658bdb040f227e66861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Sun, 25 Mar 2018 22:50:52 +0200 Subject: [PATCH] Added simple console manager - can switch colorized mode - can check if output is a terminal --- main.cpp | 13 ++++++++++-- utils/CMakeLists.txt | 1 + utils/ConsoleManager.cpp | 44 ++++++++++++++++++++++++++++++++++++++++ utils/ConsoleManager.hpp | 12 +++++++++++ 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 utils/ConsoleManager.cpp create mode 100644 utils/ConsoleManager.hpp diff --git a/main.cpp b/main.cpp index 4229622bc..18ba74a31 100644 --- a/main.cpp +++ b/main.cpp @@ -4,9 +4,11 @@ #include <rang.hpp> #include <FPEManager.hpp> #include <SignalManager.hpp> +#include <ConsoleManager.hpp> #include <CLI/CLI.hpp> #include <cassert> +#include <limits> inline double e(double rho, double p, double gamma) { @@ -128,9 +130,13 @@ int main(int argc, char *argv[]) bool disable_fpe = false; app.add_flag("--no-fpe", disable_fpe, "Do not trap floating point exceptions"); bool disable_signals = false; - app.add_flag("--no-signal", disable_signals, "Catches signals"); + app.add_flag("--no-signal", disable_signals, "Do not catches signals"); + + std::string colorize="auto"; + app.add_set("--colorize", colorize, {"auto", "yes", "no"}, "Colorize console output", true); + int threads=-1; - app.add_option("--threads", threads, "Number of Kokkos threads"); + app.add_option("--threads", threads, "Number of Kokkos threads")->check(CLI::Range(1,std::numeric_limits<decltype(threads)>::max())); std::atexit([](){std::cout << rang::style::reset;}); try { @@ -139,9 +145,12 @@ int main(int argc, char *argv[]) return app.exit(e); } + ConsoleManager::init(colorize); FPEManager::init(not disable_fpe); SignalManager::init(not disable_signals); + + std::cout << "colorize=" << colorize << '\n'; std::cout << "Code version: " << rang::style::bold << RevisionInfo::version() << rang::style::reset << '\n'; diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index aa8f05c8e..b1a57d9cf 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -5,6 +5,7 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_library( PastisUtils + ConsoleManager.cpp FPEManager.cpp RevisionInfo.cpp SignalManager.cpp) diff --git a/utils/ConsoleManager.cpp b/utils/ConsoleManager.cpp new file mode 100644 index 000000000..b2a9984e4 --- /dev/null +++ b/utils/ConsoleManager.cpp @@ -0,0 +1,44 @@ +#include <ConsoleManager.hpp> +#include <rang.hpp> + +bool ConsoleManager::isTerminal(std::ostream& os) +{ + return rang::rang_implementation::isTerminal(os.rdbuf()); +} + +void ConsoleManager::init(const std::string& colorize) +{ + std::cout << "Console management: color "; + if (colorize == "auto") { + if (isTerminal(std::cout)) { + std::cout << rang::style::bold + << rang::fgB::green + << "enabled" + << rang::fg::reset + << rang::style::reset; + } else { + std::cout << "disabled"; + } + std::cout << " [auto]\n"; + } else if (colorize == "yes") { + rang::setControlMode(rang::control::Force); + std::cout << rang::style::bold + << rang::fgB::green + << "enabled" + << rang::fg::reset + << rang::style::reset; + std::cout << " [" + << rang::style::bold + << rang::fgB::red + << "forced" + << rang::fg::reset + << rang::style::reset + << "]\n"; + } else if (colorize == "no") { + rang::setControlMode(rang::control::Off); + std::cout << "disabled [forced]\n"; + } else { + std::cerr << "Unknown colorize option: " << colorize << '\n'; + std::exit(1); + } +} diff --git a/utils/ConsoleManager.hpp b/utils/ConsoleManager.hpp new file mode 100644 index 000000000..ccd555e50 --- /dev/null +++ b/utils/ConsoleManager.hpp @@ -0,0 +1,12 @@ +#ifndef CONSOLE_MANAGER_HPP +#define CONSOLE_MANAGER_HPP + +#include <string> + +struct ConsoleManager +{ + static bool isTerminal(std::ostream& os); + static void init(const std::string& colorize); +}; + +#endif // CONSOLE_MANAGER_HPP -- GitLab