diff mbox series

[05/45] Add pp_write_text_as_html_like_dot_to_stream

Message ID 20191213181134.1830-6-dmalcolm@redhat.com
State New
Headers show
Series v4 of analyzer patch kit | expand

Commit Message

David Malcolm Dec. 13, 2019, 6:10 p.m. UTC
gcc/ChangeLog:
	* pretty-print.c (pp_write_text_as_html_like_dot_to_stream): New
	function.
	* pretty-print.h (pp_write_text_as_html_like_dot_to_stream): New decl.
---
 gcc/pretty-print.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++
 gcc/pretty-print.h |  3 +++
 2 files changed, 51 insertions(+)

Comments

David Malcolm Dec. 16, 2019, 5:09 p.m. UTC | #1
On Fri, 2019-12-13 at 13:10 -0500, David Malcolm wrote:
> gcc/ChangeLog:
> 	* pretty-print.c (pp_write_text_as_html_like_dot_to_stream):
> New
> 	function.
> 	* pretty-print.h (pp_write_text_as_html_like_dot_to_stream):
> New decl.
> ---
>  gcc/pretty-print.c | 48
> ++++++++++++++++++++++++++++++++++++++++++++++
>  gcc/pretty-print.h |  3 +++
>  2 files changed, 51 insertions(+)

I've self-approved this one and committed it to trunk as r279444
(with usual bootstrap&regression testing)

Dave
diff mbox series

Patch

diff --git a/gcc/pretty-print.c b/gcc/pretty-print.c
index 084e03c73c78..2ecb0343ba05 100644
--- a/gcc/pretty-print.c
+++ b/gcc/pretty-print.c
@@ -907,6 +907,54 @@  pp_write_text_as_dot_label_to_stream (pretty_printer *pp, bool for_record)
   pp_clear_output_area (pp);
 }
 
+/* As pp_write_text_to_stream, but for GraphViz HTML-like strings.
+
+   Flush the formatted text of pretty-printer PP onto the attached stream,
+   escaping these characters
+     " & < >
+   using XML escape sequences.
+
+   http://www.graphviz.org/doc/info/lang.html#html states:
+      special XML escape sequences for ", &, <, and > may be necessary in
+      order to embed these characters in attribute values or raw text
+   This doesn't list "'" (which would normally be escaped in XML
+   as "&apos;" or in HTML as "&#39;");.
+
+   Experiments show that escaping "'" doesn't seem to be necessary.  */
+
+void
+pp_write_text_as_html_like_dot_to_stream (pretty_printer *pp)
+{
+  const char *text = pp_formatted_text (pp);
+  const char *p = text;
+  FILE *fp = pp_buffer (pp)->stream;
+
+  for (;*p; p++)
+    {
+      switch (*p)
+	{
+	case '"':
+	  fputs ("&quot;", fp);
+	  break;
+	case '&':
+	  fputs ("&amp;", fp);
+	  break;
+	case '<':
+	  fputs ("&lt;", fp);
+	  break;
+	case '>':
+	  fputs ("&gt;",fp);
+	  break;
+
+	default:
+	  fputc (*p, fp);
+	  break;
+	}
+    }
+
+  pp_clear_output_area (pp);
+}
+
 /* Wrap a text delimited by START and END into PRETTY-PRINTER.  */
 static void
 pp_wrap_text (pretty_printer *pp, const char *start, const char *end)
diff --git a/gcc/pretty-print.h b/gcc/pretty-print.h
index 493507d41419..86b9e869eeb7 100644
--- a/gcc/pretty-print.h
+++ b/gcc/pretty-print.h
@@ -393,8 +393,11 @@  extern void pp_indent (pretty_printer *);
 extern void pp_newline (pretty_printer *);
 extern void pp_character (pretty_printer *, int);
 extern void pp_string (pretty_printer *, const char *);
+
 extern void pp_write_text_to_stream (pretty_printer *);
 extern void pp_write_text_as_dot_label_to_stream (pretty_printer *, bool);
+extern void pp_write_text_as_html_like_dot_to_stream (pretty_printer *pp);
+
 extern void pp_maybe_space (pretty_printer *);
 
 extern void pp_begin_quote (pretty_printer *, bool);