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