Skip to content

Commit ad6484e

Browse files
Print XML and JSON objects on message stream
1 parent 5ef9c17 commit ad6484e

File tree

7 files changed

+116
-42
lines changed

7 files changed

+116
-42
lines changed

src/cbmc/all_properties.cpp

+5-6
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ Author: Daniel Kroening, [email protected]
1111

1212
#include "all_properties_class.h"
1313

14-
#include <iostream>
15-
1614
#include <util/time_stopping.h>
1715
#include <util/xml.h>
1816
#include <util/json.h>
@@ -176,10 +174,11 @@ void bmc_all_propertiest::report(const cover_goalst &cover_goals)
176174
for(const auto &g : goal_map)
177175
if(g.second.status==goalt::statust::FAILURE)
178176
{
179-
std::cout << "\n" << "Trace for " << g.first << ":" << "\n";
180-
show_goto_trace(std::cout, bmc.ns, g.second.goto_trace);
177+
result() << "\n" << "Trace for " << g.first << ":" << "\n";
178+
show_goto_trace(result(), bmc.ns, g.second.goto_trace);
181179
}
182180
}
181+
result() << eom;
183182

184183
status() << "\n** " << cover_goals.number_covered()
185184
<< " of " << cover_goals.size() << " failed ("
@@ -200,7 +199,7 @@ void bmc_all_propertiest::report(const cover_goalst &cover_goals)
200199
if(g.second.status==goalt::statust::FAILURE)
201200
convert(bmc.ns, g.second.goto_trace, xml_result.new_element());
202201

203-
std::cout << xml_result << "\n";
202+
result() << xml_result;
204203
}
205204
break;
206205
}
@@ -224,7 +223,7 @@ void bmc_all_propertiest::report(const cover_goalst &cover_goals)
224223
}
225224
}
226225

227-
std::cout << ",\n" << json_result;
226+
result() << json_result;
228227
}
229228
break;
230229
}

src/cbmc/bmc.cpp

+13-15
Original file line numberDiff line numberDiff line change
@@ -64,24 +64,24 @@ void bmct::error_trace()
6464
{
6565
xmlt xml;
6666
convert(ns, goto_trace, xml);
67-
status() << xml << eom;
67+
status() << xml;
6868
}
6969
break;
7070

7171
case ui_message_handlert::uit::JSON_UI:
7272
{
73-
json_objectt json_result;
74-
json_arrayt &result_array=json_result["results"].make_array();
75-
json_objectt &result=result_array.push_back().make_object();
73+
json_objectt json;
74+
json_arrayt &result_array=json["results"].make_array();
75+
json_objectt &json_result=result_array.push_back().make_object();
7676
const goto_trace_stept &step=goto_trace.steps.back();
77-
result["property"]=
77+
json_result["property"]=
7878
json_stringt(id2string(step.pc->source_location.get_property_id()));
79-
result["description"]=
79+
json_result["description"]=
8080
json_stringt(id2string(step.pc->source_location.get_comment()));
81-
result["status"]=json_stringt("failed");
82-
jsont &json_trace=result["trace"];
81+
json_result["status"]=json_stringt("failed");
82+
jsont &json_trace=json_result["trace"];
8383
convert(ns, goto_trace, json_trace);
84-
status() << ",\n" << json_result << eom;
84+
status() << json_result;
8585
}
8686
break;
8787
}
@@ -173,16 +173,15 @@ void bmct::report_success()
173173
{
174174
xmlt xml("cprover-status");
175175
xml.data="SUCCESS";
176-
std::cout << xml;
177-
std::cout << "\n";
176+
result() << xml;
178177
}
179178
break;
180179

181180
case ui_message_handlert::uit::JSON_UI:
182181
{
183182
json_objectt json_result;
184183
json_result["cProverStatus"]=json_stringt("success");
185-
std::cout << ",\n" << json_result;
184+
result() << json_result;
186185
}
187186
break;
188187
}
@@ -201,16 +200,15 @@ void bmct::report_failure()
201200
{
202201
xmlt xml("cprover-status");
203202
xml.data="FAILURE";
204-
std::cout << xml;
205-
std::cout << "\n";
203+
result() << xml;
206204
}
207205
break;
208206

209207
case ui_message_handlert::uit::JSON_UI:
210208
{
211209
json_objectt json_result;
212210
json_result["cProverStatus"]=json_stringt("failure");
213-
std::cout << ",\n" << json_result;
211+
result() << json_result;
214212
}
215213
break;
216214
}

src/cbmc/bmc_cover.cpp

+8-13
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ Author: Daniel Kroening, [email protected]
1111

1212
#include "bmc.h"
1313

14-
#include <iostream>
15-
1614
#include <util/time_stopping.h>
1715
#include <util/xml.h>
1816
#include <util/xml_expr.h>
@@ -185,10 +183,6 @@ void bmc_covert::satisfying_assignment()
185183
goto_trace.steps.erase(++s_it1, goto_trace.steps.end());
186184
break;
187185
}
188-
189-
#if 0
190-
show_goto_trace(std::cout, bmc.ns, test.goto_trace);
191-
#endif
192186
}
193187

194188
bool bmc_covert::operator()()
@@ -223,8 +217,6 @@ bool bmc_covert::operator()()
223217

224218
bmc.do_conversion();
225219

226-
// bmc.equation.output(std::cout);
227-
228220
// get the conditions for these goals from formula
229221
// collect all 'instances' of the goals
230222
for(auto it = bmc.equation.SSA_steps.begin();
@@ -317,7 +309,7 @@ bool bmc_covert::operator()()
317309
if(goal.source_location.is_not_nil())
318310
xml_result.new_element()=xml(goal.source_location);
319311

320-
std::cout << xml_result << "\n";
312+
result() << xml_result;
321313
}
322314

323315
for(const auto &test : tests)
@@ -350,7 +342,7 @@ bool bmc_covert::operator()()
350342
xml_goal.set_attribute("id", id2string(goal_id));
351343
}
352344

353-
std::cout << xml_result << "\n";
345+
result() << xml_result;
354346
}
355347
break;
356348
}
@@ -406,7 +398,8 @@ bool bmc_covert::operator()()
406398
goal_refs.push_back(json_stringt(id2string(goal_id)));
407399
}
408400
}
409-
std::cout << ",\n" << json_result;
401+
402+
result() << json_result;
410403
break;
411404
}
412405
}
@@ -424,10 +417,12 @@ bool bmc_covert::operator()()
424417

425418
if(bmc.ui==ui_message_handlert::uit::PLAIN)
426419
{
427-
std::cout << "Test suite:" << '\n';
420+
result() << "Test suite:" << '\n';
428421

429422
for(const auto &test : tests)
430-
std::cout << get_test(test.goto_trace) << '\n';
423+
result() << get_test(test.goto_trace) << '\n';
424+
425+
result() << eom;
431426
}
432427

433428
return false;

src/cbmc/fault_localization.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ safety_checkert::resultt fault_localizationt::stop_on_fail()
301301
xmlt dest("fault-localization");
302302
xmlt xml_diagnosis=report_xml(ID_nil);
303303
dest.new_element().swap(xml_diagnosis);
304-
status() << preformatted_output << dest << eom;
304+
status() << dest;
305305
break;
306306
}
307307
case ui_message_handlert::uit::JSON_UI:
@@ -379,7 +379,7 @@ void fault_localizationt::report(
379379
xmlt xml_diagnosis=report_xml(goal_pair.first);
380380
dest.new_element().swap(xml_diagnosis);
381381
}
382-
status() << preformatted_output << dest << eom;
382+
status() << dest;
383383
}
384384
break;
385385
case ui_message_handlert::uit::JSON_UI:

src/util/message.h

+33-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ Author: Daniel Kroening, [email protected]
1515
#include <sstream>
1616

1717
#include "invariant.h"
18+
#include "json.h"
1819
#include "source_location.h"
20+
#include "xml.h"
1921

2022
class message_handlert
2123
{
@@ -24,7 +26,17 @@ class message_handlert
2426
{
2527
}
2628

27-
virtual void print(unsigned level, const std::string &message) = 0;
29+
virtual void print(unsigned level, const std::string &message)=0;
30+
31+
virtual void print(unsigned level, const xmlt &xml)
32+
{
33+
// no-op by default
34+
}
35+
36+
virtual void print(unsigned level, const jsont &json)
37+
{
38+
// no-op by default
39+
}
2840

2941
virtual void print(
3042
unsigned level,
@@ -176,6 +188,26 @@ class messaget
176188
messaget &message;
177189
source_locationt source_location;
178190

191+
mstreamt &operator << (const xmlt &data)
192+
{
193+
*this << eom; // force end of previous message
194+
if(message.message_handler)
195+
{
196+
message.message_handler->print(message_level, data);
197+
}
198+
return *this;
199+
}
200+
201+
mstreamt &operator << (const json_objectt &data)
202+
{
203+
*this << eom; // force end of previous message
204+
if(message.message_handler)
205+
{
206+
message.message_handler->print(message_level, data);
207+
}
208+
return *this;
209+
}
210+
179211
template <class T>
180212
mstreamt &operator << (const T &x)
181213
{

src/util/ui_message.cpp

+44
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,50 @@ void ui_message_handlert::print(
115115
}
116116
}
117117

118+
void ui_message_handlert::print(
119+
unsigned level,
120+
const xmlt &data)
121+
{
122+
if(verbosity>=level)
123+
{
124+
switch(get_ui())
125+
{
126+
case uit::PLAIN:
127+
INVARIANT(false, "Cannot print xml data on PLAIN UI");
128+
break;
129+
case uit::XML_UI:
130+
std::cout << data << '\n';
131+
flush(level);
132+
break;
133+
case uit::JSON_UI:
134+
INVARIANT(false, "Cannot print xml data on JSON UI");
135+
break;
136+
}
137+
}
138+
}
139+
140+
void ui_message_handlert::print(
141+
unsigned level,
142+
const jsont &data)
143+
{
144+
if(verbosity>=level)
145+
{
146+
switch(get_ui())
147+
{
148+
case uit::PLAIN:
149+
INVARIANT(false, "Cannot print json data on PLAIN UI");
150+
break;
151+
case uit::XML_UI:
152+
INVARIANT(false, "Cannot print json data on XML UI");
153+
break;
154+
case uit::JSON_UI:
155+
std::cout << ',' << '\n' << data;
156+
flush(level);
157+
break;
158+
}
159+
}
160+
}
161+
118162
void ui_message_handlert::print(
119163
unsigned level,
120164
const std::string &message,

src/util/ui_message.h

+11-5
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,28 @@ class ui_message_handlert:public message_handlert
3636
_ui=__ui;
3737
}
3838

39-
virtual void flush(unsigned level);
39+
virtual void flush(unsigned level) override;
4040

4141
protected:
4242
uit _ui;
4343

44-
// overloading
4544
virtual void print(
4645
unsigned level,
47-
const std::string &message);
46+
const std::string &message) override;
4847

49-
// overloading
5048
virtual void print(
5149
unsigned level,
5250
const std::string &message,
5351
int sequence_number,
54-
const source_locationt &location);
52+
const source_locationt &location) override;
53+
54+
virtual void print(
55+
unsigned level,
56+
const xmlt &data) override;
57+
58+
virtual void print(
59+
unsigned level,
60+
const jsont &data) override;
5561

5662
virtual void xml_ui_msg(
5763
const std::string &type,

0 commit comments

Comments
 (0)