1 /**************************************************************************
3 * Copyright 2010 VMware, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 **************************************************************************/
27 * Helpers for coloring output.
30 #ifndef _FORMATTER_HPP_
31 #define _FORMATTER_HPP_
39 #ifndef COMMON_LVB_LEADING_BYTE
40 #define COMMON_LVB_LEADING_BYTE 0x0100
43 #ifndef COMMON_LVB_TRAILING_BYTE
44 #define COMMON_LVB_TRAILING_BYTE 0x0200
47 #ifndef COMMON_LVB_GRID_HORIZONTAL
48 #define COMMON_LVB_GRID_HORIZONTAL 0x0400
51 #ifndef COMMON_LVB_GRID_LVERTICAL
52 #define COMMON_LVB_GRID_LVERTICAL 0x0800
55 #ifndef COMMON_LVB_GRID_RVERTICAL
56 #define COMMON_LVB_GRID_RVERTICAL 0x1000
59 #ifndef COMMON_LVB_REVERSE_VIDEO
60 #define COMMON_LVB_REVERSE_VIDEO 0x4000
63 #ifndef COMMON_LVB_UNDERSCORE
64 #define COMMON_LVB_UNDERSCORE 0x8000
73 * See also http://bytes.com/topic/c/answers/63822-design-question-little-c-header-colorizing-text-linux-comments-ideas
78 virtual ~Attribute() {}
80 virtual void apply(std::ostream &) const {}
93 virtual ~Formatter() {}
95 virtual Attribute *normal(void) const { return new Attribute; }
96 virtual Attribute *bold(void) const { return new Attribute; }
97 virtual Attribute *italic(void) const { return new Attribute; }
98 virtual Attribute *strike(void) const { return new Attribute; }
99 virtual Attribute *color(Color) const { return new Attribute; }
103 class AnsiAttribute : public Attribute {
107 AnsiAttribute(const char *_escape) : escape(_escape) {}
108 void apply(std::ostream& os) const {
109 os << "\33[" << escape;
115 * Formatter for plain-text files which outputs ANSI escape codes. See
116 * http://en.wikipedia.org/wiki/ANSI_escape_code for more information
117 * concerning ANSI escape codes.
119 class AnsiFormatter : public Formatter {
122 virtual Attribute *normal(void) const { return new AnsiAttribute("0m"); }
123 virtual Attribute *bold(void) const { return new AnsiAttribute("1m"); }
124 /* Italic is not widely supported, or worse, implemented with a reverse */
126 virtual Attribute *italic(void) const { return new AnsiAttribute("3m"); }
128 virtual Attribute *strike(void) const { return new AnsiAttribute("9m"); }
129 virtual Attribute *color(Color c) const {
130 static const char *color_escapes[] = {
135 return new AnsiAttribute(color_escapes[c]);
140 inline std::ostream& operator<<(std::ostream& os, const Attribute *attr) {
149 class WindowsAttribute : public Attribute {
153 WindowsAttribute(WORD _wAttributes) : wAttributes(_wAttributes) {}
154 void apply(std::ostream& os) const {
155 DWORD nStdHandleOutput;
156 if (os == std::cout) {
157 nStdHandleOutput = STD_OUTPUT_HANDLE;
158 } else if (os == std::cerr) {
159 nStdHandleOutput = STD_ERROR_HANDLE;
163 HANDLE hConsoleOutput = GetStdHandle(nStdHandleOutput);
164 if (hConsoleOutput == INVALID_HANDLE_VALUE) {
168 SetConsoleTextAttribute(hConsoleOutput, wAttributes);
174 * Formatter for the Windows Console.
176 class WindowsFormatter : public Formatter {
179 virtual Attribute *normal(void) const { return new WindowsAttribute(FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED); }
180 virtual Attribute *bold(void) const { return new WindowsAttribute(FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); }
181 virtual Attribute *italic(void) const { return new WindowsAttribute(FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED); }
182 virtual Attribute *strike(void) const { return new WindowsAttribute(COMMON_LVB_REVERSE_VIDEO | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED); }
183 virtual Attribute *color(Color c) const {
184 static const WORD color_escapes[] = {
185 FOREGROUND_RED | FOREGROUND_INTENSITY,
186 FOREGROUND_GREEN | FOREGROUND_INTENSITY,
187 FOREGROUND_BLUE | FOREGROUND_INTENSITY,
189 return new WindowsAttribute(color_escapes[c]);
197 inline Formatter *defaultFormatter(bool color = true) {
200 // http://wiki.winehq.org/DeveloperFaq#detect-wine
201 static HMODULE hNtDll = NULL;
202 static bool bWine = false;
204 hNtDll = LoadLibraryA("ntdll");
206 bWine = GetProcAddress(hNtDll, "wine_get_version") != NULL;
210 return new AnsiFormatter;
212 return new WindowsFormatter;
214 return new AnsiFormatter;
217 return new Formatter;
222 } /* namespace formatter */
225 #endif /* _FORMATTER_HPP_ */