From c2d0351e6929a7cc6eeae4ff4c4a0cd59890d050 Mon Sep 17 00:00:00 2001 From: ToruNiina Date: Wed, 13 Nov 2019 17:24:51 +0900 Subject: [PATCH] feat: add (ANSI) terminal colorize operators --- toml/color.hpp | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 toml/color.hpp diff --git a/toml/color.hpp b/toml/color.hpp new file mode 100644 index 0000000..514632b --- /dev/null +++ b/toml/color.hpp @@ -0,0 +1,78 @@ +#ifndef TOML11_COLOR_HPP +#define TOML11_COLOR_HPP +#include +#include + +namespace toml +{ + +// put ANSI escape sequence to ostream +namespace color_ansi +{ +namespace detail +{ +inline int colorize_index() +{ + static const int index = std::ios_base::xalloc(); + return index; +} +} // detail + +inline std::ostream& colorize(std::ostream& os) +{ + // by default, it is zero. + os.iword(detail::colorize_index()) = 1; + return os; +} +inline std::ostream& nocolorize(std::ostream& os) +{ + os.iword(detail::colorize_index()) = 0; + return os; +} +inline std::ostream& reset (std::ostream& os) +{if(os.iword(detail::colorize_index()) == 1) {os << "\033[00m";} return os;} +inline std::ostream& bold (std::ostream& os) +{if(os.iword(detail::colorize_index()) == 1) {os << "\033[01m";} return os;} +inline std::ostream& grey (std::ostream& os) +{if(os.iword(detail::colorize_index()) == 1) {os << "\033[30m";} return os;} +inline std::ostream& red (std::ostream& os) +{if(os.iword(detail::colorize_index()) == 1) {os << "\033[31m";} return os;} +inline std::ostream& green (std::ostream& os) +{if(os.iword(detail::colorize_index()) == 1) {os << "\033[32m";} return os;} +inline std::ostream& yellow (std::ostream& os) +{if(os.iword(detail::colorize_index()) == 1) {os << "\033[33m";} return os;} +inline std::ostream& blue (std::ostream& os) +{if(os.iword(detail::colorize_index()) == 1) {os << "\033[34m";} return os;} +inline std::ostream& magenta(std::ostream& os) +{if(os.iword(detail::colorize_index()) == 1) {os << "\033[35m";} return os;} +inline std::ostream& cyan (std::ostream& os) +{if(os.iword(detail::colorize_index()) == 1) {os << "\033[36m";} return os;} +inline std::ostream& white (std::ostream& os) +{if(os.iword(detail::colorize_index()) == 1) {os << "\033[37m";} return os;} +} // color_ansi + +// do nothing. +namespace nocolor +{ +inline std::ostream& colorize (std::ostream& os) noexcept {return os;} +inline std::ostream& nocolorize(std::ostream& os) noexcept {return os;} +inline std::ostream& reset (std::ostream& os) noexcept {return os;} +inline std::ostream& bold (std::ostream& os) noexcept {return os;} +inline std::ostream& grey (std::ostream& os) noexcept {return os;} +inline std::ostream& red (std::ostream& os) noexcept {return os;} +inline std::ostream& green (std::ostream& os) noexcept {return os;} +inline std::ostream& yellow (std::ostream& os) noexcept {return os;} +inline std::ostream& blue (std::ostream& os) noexcept {return os;} +inline std::ostream& magenta (std::ostream& os) noexcept {return os;} +inline std::ostream& cyan (std::ostream& os) noexcept {return os;} +inline std::ostream& white (std::ostream& os) noexcept {return os;} +} // nocolor + +#ifdef TOML11_COLORIZE_ERROR_MESSAGE +namespace color = color_ansi; +#else +namespace color = nocolor; +#endif + +} // toml +#endif// TOML11_COLOR_HPP