diff --git a/format.cc b/format.cc index 4974b355..ba978035 100644 --- a/format.cc +++ b/format.cc @@ -35,13 +35,6 @@ #include #include -#ifdef _WIN32 -# ifdef __MINGW32__ -# include -# endif -# include -#endif - using fmt::internal::Arg; // Check if exceptions are disabled. @@ -119,7 +112,11 @@ struct IntChecker { } }; -const char RESET_COLOR[] = "\x1b[0m"; +#ifdef _WIN32 + const char RESET_COLOR = FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE; +#else + const char RESET_COLOR[] = "\x1b[0m"; +#endif typedef void (*FormatFunc)(fmt::Writer &, int, fmt::StringRef); @@ -1098,11 +1095,19 @@ FMT_FUNC void fmt::print(std::ostream &os, StringRef format_str, ArgList args) { } FMT_FUNC void fmt::print_colored(Color c, StringRef format, ArgList args) { +#ifdef _WIN32 + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); +#else char escape[] = "\x1b[30m"; escape[3] = '0' + static_cast(c); std::fputs(escape, stdout); +#endif print(format, args); +#ifdef _WIN32 + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), RESET_COLOR); +#else std::fputs(RESET_COLOR, stdout); +#endif } FMT_FUNC int fmt::fprintf(std::FILE *f, StringRef format, ArgList args) { diff --git a/format.h b/format.h index 0af01439..17dce15b 100644 --- a/format.h +++ b/format.h @@ -40,6 +40,15 @@ #include #include +#ifdef _WIN32 +# define WIN32_LEAN_AND_MEAN +# ifdef __MINGW32__ +# include +# endif +# include +# undef ERROR +#endif + #if _SECURE_SCL # include #endif @@ -2154,7 +2163,21 @@ void report_windows_error(int error_code, StringRef message) FMT_NOEXCEPT(true); #endif -enum Color { BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE }; +#ifdef _WIN32 + enum Color : uint8_t + { + BLACK = 0, + RED = FOREGROUND_RED | FOREGROUND_INTENSITY, + GREEN = FOREGROUND_GREEN | FOREGROUND_INTENSITY, + YELLOW = FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY, + BLUE = FOREGROUND_BLUE | FOREGROUND_INTENSITY, + MAGENTA = FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY, + CYAN = FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE, + WHITE = FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY + }; +#else + enum Color : uint8_t { BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE }; +#endif /** Formats a string and prints it to stdout using ANSI escape sequences