colorprint.cc revision a187aa080377f4707bb28690d51f206c0d49f436
1a187aa080377f4707bb28690d51f206c0d49f436Eric Fiselier// Copyright 2015 Google Inc. All rights reserved. 25a71bd6e6656bb1610da794489e65ac7d0b13bc6Dominic Hamon// 33fb8268eab1a0f116f5e690e13d1234265998f2cDominic Hamon// Licensed under the Apache License, Version 2.0 (the "License"); 43fb8268eab1a0f116f5e690e13d1234265998f2cDominic Hamon// you may not use this file except in compliance with the License. 53fb8268eab1a0f116f5e690e13d1234265998f2cDominic Hamon// You may obtain a copy of the License at 65a71bd6e6656bb1610da794489e65ac7d0b13bc6Dominic Hamon// 73fb8268eab1a0f116f5e690e13d1234265998f2cDominic Hamon// http://www.apache.org/licenses/LICENSE-2.0 85a71bd6e6656bb1610da794489e65ac7d0b13bc6Dominic Hamon// 93fb8268eab1a0f116f5e690e13d1234265998f2cDominic Hamon// Unless required by applicable law or agreed to in writing, software 103fb8268eab1a0f116f5e690e13d1234265998f2cDominic Hamon// distributed under the License is distributed on an "AS IS" BASIS, 113fb8268eab1a0f116f5e690e13d1234265998f2cDominic Hamon// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 123fb8268eab1a0f116f5e690e13d1234265998f2cDominic Hamon// See the License for the specific language governing permissions and 133fb8268eab1a0f116f5e690e13d1234265998f2cDominic Hamon// limitations under the License. 143fb8268eab1a0f116f5e690e13d1234265998f2cDominic Hamon 15403f35442375f2ee858981b79421ca321645df0Dominic Hamon#include "colorprint.h" 16403f35442375f2ee858981b79421ca321645df0Dominic Hamon 17a187aa080377f4707bb28690d51f206c0d49f436Eric Fiselier#include <cstdarg> 18403f35442375f2ee858981b79421ca321645df0Dominic Hamon 19403f35442375f2ee858981b79421ca321645df0Dominic Hamon#include "commandlineflags.h" 20a187aa080377f4707bb28690d51f206c0d49f436Eric Fiselier#include "internal_macros.h" 21403f35442375f2ee858981b79421ca321645df0Dominic Hamon 22403f35442375f2ee858981b79421ca321645df0Dominic HamonDECLARE_bool(color_print); 23403f35442375f2ee858981b79421ca321645df0Dominic Hamon 24e390e4ebc3c728e69d335a33c0cb00547dcd0ddeDominic Hamonnamespace benchmark { 25403f35442375f2ee858981b79421ca321645df0Dominic Hamonnamespace { 26403f35442375f2ee858981b79421ca321645df0Dominic Hamon#ifdef OS_WINDOWS 27403f35442375f2ee858981b79421ca321645df0Dominic Hamontypedef WORD PlatformColorCode; 28403f35442375f2ee858981b79421ca321645df0Dominic Hamon#else 29403f35442375f2ee858981b79421ca321645df0Dominic Hamontypedef const char* PlatformColorCode; 30403f35442375f2ee858981b79421ca321645df0Dominic Hamon#endif 31403f35442375f2ee858981b79421ca321645df0Dominic Hamon 32403f35442375f2ee858981b79421ca321645df0Dominic HamonPlatformColorCode GetPlatformColorCode(LogColor color) { 33403f35442375f2ee858981b79421ca321645df0Dominic Hamon#ifdef OS_WINDOWS 34403f35442375f2ee858981b79421ca321645df0Dominic Hamon switch (color) { 354ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_RED: 364ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return FOREGROUND_RED; 374ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_GREEN: 384ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return FOREGROUND_GREEN; 394ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_YELLOW: 404ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return FOREGROUND_RED | FOREGROUND_GREEN; 414ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_BLUE: 424ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return FOREGROUND_BLUE; 434ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_MAGENTA: 444ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return FOREGROUND_BLUE | FOREGROUND_RED; 454ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_CYAN: 464ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return FOREGROUND_BLUE | FOREGROUND_GREEN; 474ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_WHITE: // fall through to default 484ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon default: 494ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return 0; 50403f35442375f2ee858981b79421ca321645df0Dominic Hamon } 51403f35442375f2ee858981b79421ca321645df0Dominic Hamon#else 52403f35442375f2ee858981b79421ca321645df0Dominic Hamon switch (color) { 534ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_RED: 544ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return "1"; 554ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_GREEN: 564ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return "2"; 574ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_YELLOW: 584ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return "3"; 594ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_BLUE: 604ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return "4"; 614ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_MAGENTA: 624ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return "5"; 634ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_CYAN: 644ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return "6"; 654ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon case COLOR_WHITE: 664ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return "7"; 674ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon default: 684ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon return NULL; 69403f35442375f2ee858981b79421ca321645df0Dominic Hamon }; 70403f35442375f2ee858981b79421ca321645df0Dominic Hamon#endif 71403f35442375f2ee858981b79421ca321645df0Dominic Hamon} 72403f35442375f2ee858981b79421ca321645df0Dominic Hamon} // end namespace 73403f35442375f2ee858981b79421ca321645df0Dominic Hamon 74403f35442375f2ee858981b79421ca321645df0Dominic Hamonvoid ColorPrintf(LogColor color, const char* fmt, ...) { 75403f35442375f2ee858981b79421ca321645df0Dominic Hamon va_list args; 76403f35442375f2ee858981b79421ca321645df0Dominic Hamon va_start(args, fmt); 77403f35442375f2ee858981b79421ca321645df0Dominic Hamon 78403f35442375f2ee858981b79421ca321645df0Dominic Hamon if (!FLAGS_color_print) { 79403f35442375f2ee858981b79421ca321645df0Dominic Hamon vprintf(fmt, args); 80403f35442375f2ee858981b79421ca321645df0Dominic Hamon va_end(args); 81403f35442375f2ee858981b79421ca321645df0Dominic Hamon return; 82403f35442375f2ee858981b79421ca321645df0Dominic Hamon } 83403f35442375f2ee858981b79421ca321645df0Dominic Hamon 84403f35442375f2ee858981b79421ca321645df0Dominic Hamon#ifdef OS_WINDOWS 85403f35442375f2ee858981b79421ca321645df0Dominic Hamon const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); 8680093519382ae748d682e3914ef4ccf07da6ce35Dominic Hamon 87403f35442375f2ee858981b79421ca321645df0Dominic Hamon // Gets the current text color. 88403f35442375f2ee858981b79421ca321645df0Dominic Hamon CONSOLE_SCREEN_BUFFER_INFO buffer_info; 89403f35442375f2ee858981b79421ca321645df0Dominic Hamon GetConsoleScreenBufferInfo(stdout_handle, &buffer_info); 90403f35442375f2ee858981b79421ca321645df0Dominic Hamon const WORD old_color_attrs = buffer_info.wAttributes; 91403f35442375f2ee858981b79421ca321645df0Dominic Hamon 92403f35442375f2ee858981b79421ca321645df0Dominic Hamon // We need to flush the stream buffers into the console before each 93403f35442375f2ee858981b79421ca321645df0Dominic Hamon // SetConsoleTextAttribute call lest it affect the text that is already 94403f35442375f2ee858981b79421ca321645df0Dominic Hamon // printed but has not yet reached the console. 95403f35442375f2ee858981b79421ca321645df0Dominic Hamon fflush(stdout); 96403f35442375f2ee858981b79421ca321645df0Dominic Hamon SetConsoleTextAttribute(stdout_handle, 97403f35442375f2ee858981b79421ca321645df0Dominic Hamon GetPlatformColorCode(color) | FOREGROUND_INTENSITY); 98403f35442375f2ee858981b79421ca321645df0Dominic Hamon vprintf(fmt, args); 99403f35442375f2ee858981b79421ca321645df0Dominic Hamon 100403f35442375f2ee858981b79421ca321645df0Dominic Hamon fflush(stdout); 101403f35442375f2ee858981b79421ca321645df0Dominic Hamon // Restores the text color. 102403f35442375f2ee858981b79421ca321645df0Dominic Hamon SetConsoleTextAttribute(stdout_handle, old_color_attrs); 103403f35442375f2ee858981b79421ca321645df0Dominic Hamon#else 104403f35442375f2ee858981b79421ca321645df0Dominic Hamon const char* color_code = GetPlatformColorCode(color); 1054ce184d86ddefe6170914a4813940dbcbe645207Dominic Hamon if (color_code) fprintf(stdout, "\033[0;3%sm", color_code); 106403f35442375f2ee858981b79421ca321645df0Dominic Hamon vprintf(fmt, args); 107403f35442375f2ee858981b79421ca321645df0Dominic Hamon printf("\033[m"); // Resets the terminal to default. 108403f35442375f2ee858981b79421ca321645df0Dominic Hamon#endif 109403f35442375f2ee858981b79421ca321645df0Dominic Hamon va_end(args); 110403f35442375f2ee858981b79421ca321645df0Dominic Hamon} 111e390e4ebc3c728e69d335a33c0cb00547dcd0ddeDominic Hamon} // end namespace benchmark 112