diff options
Diffstat (limited to 'tools/gn/standard_out.cc')
-rw-r--r-- | tools/gn/standard_out.cc | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/tools/gn/standard_out.cc b/tools/gn/standard_out.cc new file mode 100644 index 0000000..f6a2031 --- /dev/null +++ b/tools/gn/standard_out.cc @@ -0,0 +1,84 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "tools/gn/standard_out.h" + +#include "build/build_config.h" + +#if defined(OS_WIN) +#include <windows.h> +#else +#include <stdio.h> +#endif + +namespace { + +bool initialized = false; + +#if defined(OS_WIN) +HANDLE hstdout; +WORD default_attributes; + +bool is_console = false; +#endif + +void EnsureInitialized() { + if (initialized) + return; + initialized = true; + +#if defined(OS_WIN) + hstdout = ::GetStdHandle(STD_OUTPUT_HANDLE); + CONSOLE_SCREEN_BUFFER_INFO info; + is_console = !!::GetConsoleScreenBufferInfo(hstdout, &info); + default_attributes = info.wAttributes; +#endif +} + +} // namespace + +#if defined(OS_WIN) + +void OutputString(const std::string& output, TextDecoration dec) { + EnsureInitialized(); + if (is_console) { + switch (dec) { + case DECORATION_NONE: + break; + case DECORATION_BOLD: + ::SetConsoleTextAttribute(hstdout, FOREGROUND_INTENSITY); + break; + case DECORATION_RED: + ::SetConsoleTextAttribute(hstdout, + FOREGROUND_RED | FOREGROUND_INTENSITY); + break; + case DECORATION_GREEN: + // Keep green non-bold. + ::SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN); + break; + case DECORATION_BLUE: + ::SetConsoleTextAttribute(hstdout, + FOREGROUND_BLUE | FOREGROUND_INTENSITY); + break; + case DECORATION_YELLOW: + ::SetConsoleTextAttribute(hstdout, + FOREGROUND_RED | FOREGROUND_GREEN); + break; + } + } + + DWORD written = 0; + ::WriteFile(hstdout, output.c_str(), output.size(), &written, NULL); + + if (is_console) + ::SetConsoleTextAttribute(hstdout, default_attributes); +} + +#else + +void OutputString(const std::string& output, TextDecoration dec) { + printf("%s", output.c_str()); +} + +#endif |