// 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 #else #include #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