#include "support/colors.h"
#include <cstdlib>
#include <ostream>
namespace {
bool colors_enabled = true;
}
void Colors::setEnabled(bool enabled) { colors_enabled = enabled; }
bool Colors::isEnabled() { return colors_enabled; }
#if defined(__linux__) || defined(__APPLE__)
#include <unistd.h>
void Colors::outputColorCode(std::ostream& stream, const char* colorCode) {
const static bool has_color = []() {
return (getenv("COLORS") && getenv("COLORS")[0] == '1') || (isatty(STDOUT_FILENO) &&
(!getenv("COLORS") || getenv("COLORS")[0] != '0')); }();
if (has_color && colors_enabled) {
stream << colorCode;
}
}
#elif defined(_WIN32)
#include <io.h>
#include <iostream>
#include <windows.h>
void Colors::outputColorCode(std::ostream& stream, const WORD& colorCode) {
const static bool has_color = []() {
return _isatty(_fileno(stdout)) &&
(!getenv("COLORS") || getenv("COLORS")[0] != '0'); }();
static HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
static HANDLE hStderr = GetStdHandle(STD_ERROR_HANDLE);
if (has_color && colors_enabled)
SetConsoleTextAttribute(&stream == &std::cout ? hStdout : hStderr,
colorCode);
}
#endif