| 3969 | } // namespace Color |
| 3970 | |
| 3971 | class Colorize { |
| 3972 | public: |
| 3973 | Colorize(std::ostream& os) : _os(os), _reset(false), _enabled(false) {} |
| 3974 | |
| 3975 | void activate(ColorMode::type mode) { _enabled = mode == ColorMode::always; } |
| 3976 | |
| 3977 | void activate(ColorMode::type mode, FILE* fp) { activate(mode, fileno(fp)); } |
| 3978 | |
| 3979 | void set_color(Color::type ccode) |
| 3980 | { |
| 3981 | if (!_enabled) |
| 3982 | return; |
| 3983 | |
| 3984 | // I assume that the terminal can handle basic colors. Seriously I |
| 3985 | // don't want to deal with all the termcap shit. |
| 3986 | _os << "\033[" << static_cast<int>(ccode) << "m"; |
| 3987 | _reset = (ccode != Color::reset); |
| 3988 | } |
| 3989 | |
| 3990 | ~Colorize() |
| 3991 | { |
| 3992 | if (_reset) { |
| 3993 | set_color(Color::reset); |
| 3994 | } |
| 3995 | } |
| 3996 | |
| 3997 | private: |
| 3998 | void activate(ColorMode::type mode, int fd) |
| 3999 | { |
| 4000 | activate(mode == ColorMode::automatic && isatty(fd) ? ColorMode::always : mode); |
| 4001 | } |
| 4002 | |
| 4003 | std::ostream& _os; |
| 4004 | bool _reset; |
| 4005 | bool _enabled; |
| 4006 | }; |
| 4007 | |
| 4008 | #else // ndef BACKWARD_SYSTEM_LINUX |
| 4009 |
nothing calls this directly
no outgoing calls
no test coverage detected