1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
// file : libbuild2/diagnostics.cxx -*- C++ -*-
// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
// license : MIT; see accompanying LICENSE file
#include <libbuild2/diagnostics.hxx>
#include <cstring> // strchr()
#include <libbutl/process-io.mxx>
using namespace std;
namespace build2
{
// Diagnostics state (verbosity level, progress, etc). Keep disabled until
// set from options.
//
uint16_t verb = 0;
optional<bool> diag_progress_option;
bool diag_no_line = false;
bool diag_no_column = false;
bool stderr_term = false;
void
init_diag (uint16_t v, optional<bool> p, bool nl, bool nc, bool st)
{
verb = v;
diag_progress_option = p;
diag_no_line = nl;
diag_no_column = nc;
stderr_term = st;
}
// Stream verbosity.
//
const int stream_verb_index = ostream::xalloc ();
void
print_process (const char* const* args, size_t n)
{
diag_record r (text);
print_process (r, args, n);
}
void
print_process (diag_record& r, const char* const* args, size_t n)
{
r << butl::process_args {args, n};
}
// Diagnostics stack.
//
static
#ifdef __cpp_thread_local
thread_local
#else
__thread
#endif
const diag_frame* diag_frame_stack = nullptr;
const diag_frame* diag_frame::
stack () noexcept
{
return diag_frame_stack;
}
const diag_frame* diag_frame::
stack (const diag_frame* f) noexcept
{
const diag_frame* r (diag_frame_stack);
diag_frame_stack = f;
return r;
}
// Diagnostic facility, project specifics.
//
void simple_prologue_base::
operator() (const diag_record& r) const
{
stream_verb (r.os, sverb_);
if (type_ != nullptr)
r << type_ << ": ";
if (mod_ != nullptr)
r << mod_ << "::";
if (name_ != nullptr)
r << name_ << ": ";
}
void location_prologue_base::
operator() (const diag_record& r) const
{
stream_verb (r.os, sverb_);
if (!loc_.empty ())
{
r << *loc_.file << ':';
if (!diag_no_line)
{
if (loc_.line != 0)
{
r << loc_.line << ':';
if (!diag_no_column)
{
if (loc_.column != 0)
r << loc_.column << ':';
}
}
}
r << ' ';
}
if (type_ != nullptr)
r << type_ << ": ";
if (mod_ != nullptr)
r << mod_ << "::";
if (name_ != nullptr)
r << name_ << ": ";
}
const basic_mark error ("error");
const basic_mark warn ("warning");
const basic_mark info ("info");
const basic_mark text (nullptr, nullptr, nullptr); // No type/data/frame.
const fail_mark fail ("error");
const fail_end endf;
}
|