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 <windows.h>
15 #include <fcntl.h>
16 #include <io.h>
17 #include <cstdio>
18 #endif
19 
20 #include "unicode.h"
21 
24 {
25 }
26 
29 {
30 }
31 
33  unsigned level,
34  const std::string &message)
35 {
36  message_handlert::print(level, message);
37 
38  if(verbosity<level)
39  return;
40 
41  #ifdef _WIN32
42  HANDLE out_handle=
43  GetStdHandle((level>1)?STD_OUTPUT_HANDLE:STD_ERROR_HANDLE);
44 
45  // We use UTF16 when we write to the console,
46  // but we write UTF8 otherwise.
47 
48  DWORD consoleMode;
49  if(GetConsoleMode(out_handle, &consoleMode))
50  {
51  // writing to the console
52  std::wstring wide_message=widen(message);
53 
54  DWORD number_written;
55 
56  WriteConsoleW(
57  out_handle, wide_message.c_str(),
58  (DWORD)wide_message.size(), &number_written, NULL);
59 
60  WriteConsoleW(out_handle, L"\r\n", 2, &number_written, NULL);
61  }
62  else
63  {
64  // writing to a file
65 
66  if(level>=4)
67  {
68  std::cout << message << '\n';
69  }
70  else
71  std::cerr << message << '\n';
72  }
73  #else
74  // Messages level 3 or lower go to cerr, messages level 4 or
75  // above go to cout.
76 
77  if(level>=4)
78  {
79  std::cout << message << '\n';
80  }
81  else
82  std::cerr << message << '\n';
83  #endif
84 }
85 
86 void console_message_handlert::flush(unsigned level)
87 {
88  // We flush after messages of level 6 or lower.
89  // We don't for messages of level 7 or higher to improve performance,
90  // in particular when writing to NFS.
91  if(level>=4)
92  {
93  if(level<=6)
94  std::cout << std::flush;
95  }
96  else
97  std::cerr << std::flush;
98 }
99 
101  unsigned level,
102  const std::string &message,
103  int sequence_number,
104  const source_locationt &location)
105 {
106  const irep_idt file=location.get_file();
107  const irep_idt line=location.get_line();
108  const irep_idt column=location.get_column();
109  const irep_idt function=location.get_function();
110 
111  std::string dest;
112 
113  if(!function.empty())
114  {
115  if(!file.empty())
116  dest+=id2string(file)+":";
117  if(dest!="")
118  dest+=' ';
119  dest+="In function '"+id2string(function)+"':\n";
120  }
121 
122  if(!line.empty())
123  {
124  if(!file.empty())
125  dest+=id2string(file)+":";
126 
127  dest+=id2string(line)+":";
128 
129  if(column.empty())
130  dest+="1: ";
131  else
132  dest+=id2string(column)+": ";
133 
134  if(level==messaget::M_ERROR)
135  dest+="error: ";
136  else if(level==messaget::M_WARNING)
137  dest+="warning: ";
138  }
139 
140  dest+=message;
141 
142  print(level, dest);
143 }
144 
146  unsigned level,
147  const std::string &message)
148 {
149  message_handlert::print(level, message);
150 
151  // gcc appears to send everything to cerr
152  if(verbosity>=level)
153  std::cerr << message << '\n' << std::flush;
154 }
const std::string & id2string(const irep_idt &d)
Definition: irep.h:44
std::wstring widen(const char *s)
Definition: unicode.cpp:56
const irep_idt & get_function() const
STL namespace.
unsigned verbosity
Definition: message.h:56
const irep_idt & get_column() const
const irep_idt & get_line() const
virtual void flush(unsigned level) override
const irep_idt & get_file() const
virtual void print(unsigned level, const std::string &message) override
virtual void print(unsigned level, const std::string &message) override
bool empty() const
Definition: dstring.h:61
virtual void print(unsigned level, const std::string &message)=0
Definition: message.cpp:57
Definition: kdev_t.h:19