cprover
cout_message.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
9 #include "cout_message.h"
10 
11 #include <iostream>
12 
13 #ifdef _WIN32
14 #include <util/pragma_push.def>
15 #ifdef _MSC_VER
16 #pragma warning(disable:4668)
17  // using #if/#elif on undefined macro
18 #pragma warning(disable : 5039)
19 // pointer or reference to potentially throwing function passed to extern C
20 #endif
21 #include <windows.h>
22 #include <fcntl.h>
23 #include <io.h>
24 #include <cstdio>
25 #include <util/pragma_pop.def>
26 #else
27 #include <unistd.h>
28 #endif
29 
30 #include "unicode.h"
31 
33  stream_message_handlert(std::cout)
34 {
35 }
36 
38  stream_message_handlert(std::cerr)
39 {
40 }
41 
43  : always_flush(_always_flush), is_a_tty(false), use_SGR(false)
44 {
45 #ifdef _WIN32
46  HANDLE out_handle=GetStdHandle(STD_OUTPUT_HANDLE);
47 
48  DWORD consoleMode;
49  if(GetConsoleMode(out_handle, &consoleMode))
50  {
51  is_a_tty = true;
52 
53 #ifdef ENABLE_VIRTUAL_TERMINAL_PROCESSING
54  consoleMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
55  if(SetConsoleMode(out_handle, consoleMode))
56  use_SGR = true;
57 #endif
58  }
59 #else
60  is_a_tty = isatty(STDOUT_FILENO);
61  use_SGR = is_a_tty;
62 #endif
63 }
64 
68 std::string console_message_handlert::command(unsigned c) const
69 {
70  if(!use_SGR)
71  return std::string();
72 
73  return "\x1b[" + std::to_string(c) + 'm';
74 }
75 
77  unsigned level,
78  const std::string &message)
79 {
81 
82  if(verbosity<level)
83  return;
84 
85  #ifdef _WIN32
86  HANDLE out_handle=
87  GetStdHandle((level>1)?STD_OUTPUT_HANDLE:STD_ERROR_HANDLE);
88 
89  // We use UTF16 when we write to the console,
90  // but we write UTF8 otherwise.
91 
92  DWORD consoleMode;
93  if(GetConsoleMode(out_handle, &consoleMode))
94  {
95  // writing to the console
96  std::wstring wide_message=widen(message);
97 
98  DWORD number_written;
99 
100  WriteConsoleW(
101  out_handle, wide_message.c_str(),
102  (DWORD)wide_message.size(), &number_written, NULL);
103 
104  WriteConsoleW(out_handle, L"\r\n", 2, &number_written, NULL);
105  }
106  else
107  {
108  // writing to a file
109 
110  if(level>=4)
111  {
112  std::cout << message << '\n';
113  }
114  else
115  std::cerr << message << '\n';
116  }
117  #else
118  // Messages level 3 or lower go to cerr, messages level 4 or
119  // above go to cout.
120 
121  if(level>=4)
122  {
123  std::cout << message << '\n';
124  }
125  else
126  std::cerr << message << '\n';
127  #endif
128 }
129 
131 {
132  // We flush after messages of level 6 or lower.
133  // We don't for messages of level 7 or higher to improve performance,
134  // in particular when writing to NFS.
135  if(level>=4)
136  {
137  if(level <= 6 || always_flush)
138  std::cout << std::flush;
139  }
140  else
141  std::cerr << std::flush;
142 }
console_message_handlert::print
void print(unsigned, const xmlt &) override
Definition: cout_message.h:32
console_message_handlert::use_SGR
bool use_SGR
true if we use ECMA-48 SGR to render colors
Definition: cout_message.h:62
console_message_handlert::always_flush
const bool always_flush
Definition: cout_message.h:56
to_string
std::string to_string(const string_not_contains_constraintt &expr)
Used for debug printing.
Definition: string_constraint.cpp:55
message_handlert::verbosity
unsigned verbosity
Definition: message.h:72
message_handlert::print
virtual void print(unsigned level, const std::string &message)=0
Definition: message.cpp:59
console_message_handlert::flush
virtual void flush(unsigned level) override
Definition: cout_message.cpp:130
message
static const char * message(const static_verifier_resultt::statust &status)
Makes a status message string from a status.
Definition: static_verifier.cpp:74
console_message_handlert::is_a_tty
bool is_a_tty
true if we are outputting to a proper console
Definition: cout_message.h:59
cout_message.h
widen
std::wstring widen(const char *s)
Definition: unicode.cpp:50
cout_message_handlert::cout_message_handlert
cout_message_handlert()
Definition: cout_message.cpp:32
cerr_message_handlert::cerr_message_handlert
cerr_message_handlert()
Definition: cout_message.cpp:37
unicode.h
console_message_handlert::console_message_handlert
console_message_handlert()
Definition: cout_message.h:47
console_message_handlert::command
std::string command(unsigned c) const override
Create an ECMA-48 SGR (Select Graphic Rendition) command with given code.
Definition: cout_message.cpp:68
stream_message_handlert
Definition: message.h:111