This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Add xml_escape_text_append and use it


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e6a58aa8a70c7fd17d9930e7df8d158a7e3c8c8e

commit e6a58aa8a70c7fd17d9930e7df8d158a7e3c8c8e
Author: Simon Marchi <simon.marchi@polymtl.ca>
Date:   Thu Mar 8 18:04:46 2018 -0500

    Add xml_escape_text_append and use it
    
    [This patch should go on top of "linux_qxfer_libraries_svr4: Use
     std::string", I should have sent them together as a series.]
    
    I noticed that linux_qxfer_libraries_svr4 used xml_escape_text, which
    returns an std::string.  That string is then copied into a larger
    buffer.  It would be more efficient if we had a version of
    xml_escape_text which appended to an existing string instead of
    returning a new one.  This is what this patch does.
    
    I manually verified that the output of linux_qxfer_libraries_svr4 didn't
    change before/after the patch.
    
    gdb/ChangeLog:
    
    	* common/xml-utils.c (xml_escape_text): Move code to...
    	(xml_escape_text_append): ... this new function.
    	* common/xml-utils.h (xml_escape_text_append): New declaration.
    	* unittests/xml-utils-selftests.c (test_xml_escape_text_append):
    	New function.
    	(_initialize_xml_utils): register test_xml_escape_text_append as
    	a selftest.
    
    gdb/gdbserver/ChangeLog:
    
    	* linux-low.c (linux_qxfer_libraries_svr4): Use
    	xml_escape_text_append.

Diff:
---
 gdb/ChangeLog                       | 10 ++++++++++
 gdb/common/xml-utils.c              | 27 +++++++++++++++++----------
 gdb/common/xml-utils.h              |  9 +++++++--
 gdb/gdbserver/ChangeLog             |  5 +++++
 gdb/gdbserver/linux-low.c           | 10 +++++-----
 gdb/unittests/xml-utils-selftests.c | 14 ++++++++++++++
 6 files changed, 58 insertions(+), 17 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index f10476b..0ee5178 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,13 @@
+2018-03-08  Simon Marchi  <simon.marchi@polymtl.ca>
+
+	* common/xml-utils.c (xml_escape_text): Move code to...
+	(xml_escape_text_append): ... this new function.
+	* common/xml-utils.h (xml_escape_text_append): New declaration.
+	* unittests/xml-utils-selftests.c (test_xml_escape_text_append):
+	New function.
+	(_initialize_xml_utils): register test_xml_escape_text_append as
+	a selftest.
+
 2018-03-07  Alan Hayward  <alan.hayward@arm.com>
 
 	* defs.h: Remove MAX_REGISTER_SIZE.
diff --git a/gdb/common/xml-utils.c b/gdb/common/xml-utils.c
index aba1722..3e1c2bf 100644
--- a/gdb/common/xml-utils.c
+++ b/gdb/common/xml-utils.c
@@ -20,37 +20,44 @@
 #include "common-defs.h"
 #include "xml-utils.h"
 
-/* Return a string with special characters from TEXT replaced by entity
-   references.  */
+/* See xml-utils.h.  */
 
 std::string
 xml_escape_text (const char *text)
 {
   std::string result;
 
+  xml_escape_text_append (&result, text);
+
+  return result;
+}
+
+/* See xml-utils.h.  */
+
+void
+xml_escape_text_append (std::string *result, const char *text)
+{
   /* Expand the result.  */
   for (int i = 0; text[i] != '\0'; i++)
     switch (text[i])
       {
       case '\'':
-	result += "&apos;";
+	*result += "&apos;";
 	break;
       case '\"':
-	result += "&quot;";
+	*result += "&quot;";
 	break;
       case '&':
-	result += "&amp;";
+	*result += "&amp;";
 	break;
       case '<':
-	result += "&lt;";
+	*result += "&lt;";
 	break;
       case '>':
-	result += "&gt;";
+	*result += "&gt;";
 	break;
       default:
-	result += text[i];
+	*result += text[i];
 	break;
       }
-
-  return result;
 }
diff --git a/gdb/common/xml-utils.h b/gdb/common/xml-utils.h
index b874016..3427ab2 100644
--- a/gdb/common/xml-utils.h
+++ b/gdb/common/xml-utils.h
@@ -20,9 +20,14 @@
 #ifndef XML_UTILS_H
 #define XML_UTILS_H
 
-/* Return a malloc allocated string with special characters from TEXT
-   replaced by entity references.  */
+/* Return a string with special characters from TEXT replaced by entity
+   references.  */
 
 extern std::string xml_escape_text (const char *text);
 
+/* Append TEXT to RESULT, with special characters replaced by entity
+   references.  */
+
+extern void xml_escape_text_append (std::string *result, const char *text);
+
 #endif
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 33c0484..053cf17 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,5 +1,10 @@
 2018-03-08  Simon Marchi  <simon.marchi@polymtl.ca>
 
+	* linux-low.c (linux_qxfer_libraries_svr4): Use
+	xml_escape_text_append.
+
+2018-03-08  Simon Marchi  <simon.marchi@polymtl.ca>
+
 	* linux-low.c (linux_qxfer_libraries_svr4): Use std::string.
 
 2018-03-02  Simon Marchi  <simon.marchi@polymtl.ca>
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index c8bb1f5..e649495 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -7136,12 +7136,12 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf,
 		  header_done = 1;
 		}
 
-	      std::string name = xml_escape_text ((char *) libname);
-	      string_appendf (document,
-			      "<library name=\"%s\" lm=\"0x%lx\" "
+	      string_appendf (document, "<library name=\"");
+	      xml_escape_text_append (&document, (char *) libname);
+	      string_appendf (document, "\" lm=\"0x%lx\" "
 			      "l_addr=\"0x%lx\" l_ld=\"0x%lx\"/>",
-			      name.c_str (), (unsigned long) lm_addr,
-			      (unsigned long) l_addr, (unsigned long) l_ld);
+			      (unsigned long) lm_addr, (unsigned long) l_addr,
+			      (unsigned long) l_ld);
 	    }
 	}
 
diff --git a/gdb/unittests/xml-utils-selftests.c b/gdb/unittests/xml-utils-selftests.c
index 2457494..1412773 100644
--- a/gdb/unittests/xml-utils-selftests.c
+++ b/gdb/unittests/xml-utils-selftests.c
@@ -33,6 +33,18 @@ static void test_xml_escape_text ()
   SELF_CHECK (actual_output == expected_output);
 }
 
+static void test_xml_escape_text_append ()
+{
+  /* Make sure that we do indeed append.  */
+  std::string actual_output = "foo<xml>";
+  const char *input = "<this isn't=\"xml\"> &";
+  const char *expected_output
+    = "foo<xml>&lt;this isn&apos;t=&quot;xml&quot;&gt; &amp;";
+  xml_escape_text_append (&actual_output, input);
+
+  SELF_CHECK (actual_output == expected_output);
+}
+
 }
 }
 
@@ -41,4 +53,6 @@ _initialize_xml_utils ()
 {
   selftests::register_test ("xml_escape_text",
 			    selftests::xml_utils::test_xml_escape_text);
+  selftests::register_test ("xml_escape_text_append",
+			    selftests::xml_utils::test_xml_escape_text_append);
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]