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 **************************************************************************/
26 #ifndef _FORMATTER_HPP_
27 #define _FORMATTER_HPP_
36 * See also http://bytes.com/topic/c/answers/63822-design-question-little-c-header-colorizing-text-linux-comments-ideas
41 virtual ~Attribute() {}
43 virtual std::ostream& apply(std::ostream& os) const { return os; }
56 virtual ~Formatter() {}
58 virtual Attribute *normal(void) const { return new Attribute; }
59 virtual Attribute *bold(void) const { return new Attribute; }
60 virtual Attribute *italic(void) const { return new Attribute; }
61 virtual Attribute *color(Color color) const { return new Attribute; }
65 class AnsiAttribute : public Attribute {
69 AnsiAttribute(const char *_escape) : escape(_escape) {}
70 std::ostream & apply(std::ostream& os) const {
71 return os << "\33[" << escape;
77 * Formatter for plain-text files which outputs ANSI escape codes. See
78 * http://en.wikipedia.org/wiki/ANSI_escape_code for more information
79 * concerning ANSI escape codes.
81 class AnsiFormatter : public Formatter {
84 virtual Attribute *normal(void) const { return new AnsiAttribute("0m"); }
85 virtual Attribute *bold(void) const { return new AnsiAttribute("1m"); }
86 virtual Attribute *italic(void) const { return new AnsiAttribute("3m"); }
87 virtual Attribute *color(Color c) const {
88 static const char *color_escapes[] = {
93 return new AnsiAttribute(color_escapes[c]);
98 inline std::ostream& operator<<(std::ostream& os, const Attribute *attr) {
99 return attr->apply(os);
107 class WindowsAttribute : public Attribute {
111 WindowsAttribute(WORD _wAttributes) : wAttributes(_wAttributes) {}
112 std::ostream & apply(std::ostream& os) const {
113 DWORD nStdHandleOutput;
114 if (os == std::cout) {
115 nStdHandleOutput = STD_OUTPUT_HANDLE;
116 } else if (os == std::cerr) {
117 nStdHandleOutput = STD_ERROR_HANDLE;
122 HANDLE hConsoleOutput = GetStdHandle(nStdHandleOutput);
123 SetConsoleTextAttribute(hConsoleOutput, wAttributes);
129 * Formatter for the Windows Console.
131 class WindowsFormatter : public Formatter {
134 virtual Attribute *normal(void) const { return new WindowsAttribute(FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED); }
135 virtual Attribute *bold(void) const { return new WindowsAttribute(FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); }
136 virtual Attribute *italic(void) const { return new WindowsAttribute(FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED); }
137 virtual Attribute *color(Color c) const {
138 static const WORD color_escapes[] = {
139 FOREGROUND_RED | FOREGROUND_INTENSITY,
140 FOREGROUND_GREEN | FOREGROUND_INTENSITY,
141 FOREGROUND_BLUE | FOREGROUND_INTENSITY,
143 return new WindowsAttribute(color_escapes[c]);
150 inline Formatter *defaultFormatter(void) {
152 return new WindowsFormatter;
154 return new AnsiFormatter;
159 } /* namespace Formatter */
162 #endif /* _FORMATTER_HPP_ */