#include <stdio.h>
#ifdef _WIN32
+# include <iostream>
# include <io.h>
# define isatty(x) _isatty((x))
# define fileno(x) _fileno((x))
+extern WindowsStream StandardError;
+extern WindowsStream StandardOutput;
#else
# include <unistd.h>
#endif
return isatty(fileno(stdout));
#endif
}
+
+#ifdef _WIN32
+ inline WindowsStream& GetStreamHandle(std::ostream& os)
+ {
+ if (os.rdbuf() == std::cerr.rdbuf())
+ return StandardError;
+
+ if (os.rdbuf() == std::cout.rdbuf())
+ return StandardOutput;
+
+ // This will never happen.
+ throw std::invalid_argument("Tried to write color codes to a stream other than stdout or stderr!");
+ }
+#endif
}
#ifdef _WIN32
#include <windows.h>
-extern WORD g_wOriginalColors;
-extern WORD g_wBackgroundColor;
-extern HANDLE g_hStdout;
-
inline std::ostream& con_green(std::ostream& stream)
{
if (CanUseColors())
- SetConsoleTextAttribute(g_hStdout, FOREGROUND_GREEN|FOREGROUND_INTENSITY|g_wBackgroundColor);
+ {
+ const WindowsStream& ws = GetStreamHandle(stream);
+ SetConsoleTextAttribute(ws.Handle, FOREGROUND_GREEN | FOREGROUND_INTENSITY | ws.BackgroundColor);
+ }
return stream;
}
inline std::ostream& con_red(std::ostream& stream)
{
if (CanUseColors())
- SetConsoleTextAttribute(g_hStdout, FOREGROUND_RED|FOREGROUND_INTENSITY|g_wBackgroundColor);
+ {
+ const WindowsStream& ws = GetStreamHandle(stream);
+ SetConsoleTextAttribute(ws.Handle, FOREGROUND_RED | FOREGROUND_INTENSITY | ws.BackgroundColor);
+ }
return stream;
}
inline std::ostream& con_white(std::ostream& stream)
{
if (CanUseColors())
- SetConsoleTextAttribute(g_hStdout, FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|g_wBackgroundColor);
+ {
+ const WindowsStream& ws = GetStreamHandle(stream);
+ SetConsoleTextAttribute(ws.Handle, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | ws.BackgroundColor);
+ }
return stream;
}
inline std::ostream& con_white_bright(std::ostream& stream)
{
if (CanUseColors())
- SetConsoleTextAttribute(g_hStdout, FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY|g_wBackgroundColor);
+ {
+ const WindowsStream& ws = GetStreamHandle(stream);
+ SetConsoleTextAttribute(ws.Handle, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY | ws.BackgroundColor);
+ }
return stream;
}
inline std::ostream& con_bright(std::ostream& stream)
{
if (CanUseColors())
- SetConsoleTextAttribute(g_hStdout, FOREGROUND_INTENSITY|g_wBackgroundColor);
+ {
+ const WindowsStream& ws = GetStreamHandle(stream);
+ SetConsoleTextAttribute(ws.Handle, FOREGROUND_INTENSITY | ws.BackgroundColor);
+ }
return stream;
}
inline std::ostream& con_reset(std::ostream& stream)
{
if (CanUseColors())
- SetConsoleTextAttribute(g_hStdout, g_wOriginalColors);
+ {
+ const WindowsStream& ws = GetStreamHandle(stream);
+ SetConsoleTextAttribute(ws.Handle, ws.ForegroundColor);
+ }
return stream;
}
#include <pwd.h> // setuid
#include <grp.h> // setgid
#else
- WORD g_wOriginalColors;
- WORD g_wBackgroundColor;
- HANDLE g_hStdout;
+ /** Manages formatting lines written to stderr on Windows. */
+ WindowsStream StandardError(STD_ERROR_HANDLE);
+
+ /** Manages formatting lines written to stdout on Windows. */
+ WindowsStream StandardOutput(STD_OUTPUT_HANDLE);
#endif
#include <fstream>
this->Config->cmdline.argc = argc;
ParseOptions();
-#ifdef _WIN32
- // Initialize the console values
- g_hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
- CONSOLE_SCREEN_BUFFER_INFO bufinf;
- if(GetConsoleScreenBufferInfo(g_hStdout, &bufinf))
- {
- g_wOriginalColors = bufinf.wAttributes & 0x00FF;
- g_wBackgroundColor = bufinf.wAttributes & 0x00F0;
- }
- else
- {
- g_wOriginalColors = FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN;
- g_wBackgroundColor = 0;
- }
-#endif
-
{
ServiceProvider* provs[] =
{