From 89fcd2b4551f078b910719715c02780592a8af39 Mon Sep 17 00:00:00 2001 From: Alexandre Duret-Lutz Date: Sat, 18 May 2019 13:46:33 +0200 Subject: [PATCH] dot: replace large labels by "(label too long)" Based on a report by Victor Khomenko. * spot/twaalgos/dot.cc: Here. * tests/core/readsave.test: Add test case. * NEWS: Mention it. --- NEWS | 5 +++++ spot/twaalgos/dot.cc | 10 +++++++++- tests/core/readsave.test | 5 +++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index e3560c1e7..5ce805559 100644 --- a/NEWS +++ b/NEWS @@ -42,6 +42,11 @@ New in spot 2.7.4.dev (not yet released) helpful to display automata as "graphs", e.g., when illustrating algorithms that do not care about labels. + - print_dot will replace labels that have more 2048 characters by a + "(label too long)" string. This works around a limitation of + GraphViz that aborts when some label exceeds 16k characters, and + also helps making large automata more readable. + - A new complement() function that return automata with unspecified acceptance condition. The output can be alternating only if the input was alternating. diff --git a/spot/twaalgos/dot.cc b/spot/twaalgos/dot.cc index 7d3c1b1e3..70b228335 100644 --- a/spot/twaalgos/dot.cc +++ b/spot/twaalgos/dot.cc @@ -444,7 +444,15 @@ namespace spot print_sclatex_psl(os << '$', f) << '$'; return os; } - return escape_for_output(os, str_psl(f)); + // GraphViz (2.40.1) has a strict limit of 16k for label + // length. The limit we use below is more conservative, + // because (1) escaping the html element in the string + // (e.g., "&" -> "&") can increase it a lot, and (2) + // a label of size 2048 is already unreasonable to display. + std::string s = str_psl(f); + if (s.size() > 2048) + s = "(label too long)"; + return escape_for_output(os, s); } std::ostream& diff --git a/tests/core/readsave.test b/tests/core/readsave.test index c90778d2d..846a668c6 100755 --- a/tests/core/readsave.test +++ b/tests/core/readsave.test @@ -1104,3 +1104,8 @@ digraph "a U b" { } EOF diff out expected + +f="{{!a;!b}:{{c <-> d} && {e xor f} && {m | {l && {k | {j <-> {i xor {g && h}" +f="$f}}}}} && {{n && o} | {!n && p}} && {q -> {r <-> s}}}:{[*0..1];t}}[]-> u" +ltl2tgba -f "$f" --dot=bar > out.dot +grep 'label too long' out.dot