Add xml_escape_text_append and use it
authorSimon Marchi <simon.marchi@polymtl.ca>
Thu, 8 Mar 2018 23:04:46 +0000 (18:04 -0500)
committerSimon Marchi <simon.marchi@ericsson.com>
Thu, 8 Mar 2018 23:04:46 +0000 (18:04 -0500)
[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.

gdb/ChangeLog
gdb/common/xml-utils.c
gdb/common/xml-utils.h
gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c
gdb/unittests/xml-utils-selftests.c

index f10476b4ca0859c738899c35f29c509386db2987..0ee5178028718cffdfea416e34e40c391e79228a 100644 (file)
@@ -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.
index aba1722cc0e358cdbe8c459e5c35670c4966bf9d..3e1c2bfa7d2b681fb00fe1b8be243fff5dbd06d5 100644 (file)
 #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;
 }
index b87401633414cfc54b2ef7b250207fc988d856d3..3427ab246dc2acdfece5889b0da6fb629f12c58a 100644 (file)
 #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
index 33c0484de6e29989fa0204bec7cd66d272379eea..053cf17ee525c58d95c7f536129fa2ced41a5ccb 100644 (file)
@@ -1,3 +1,8 @@
+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.
index c8bb1f5785dcf4d8615a640718f257065f2bcaf0..e64949504ddc7afca23741ef8043795b34a405fd 100644 (file)
@@ -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);
            }
        }
 
index 2457494d8c7604c50845975225d6e3b2fb7325f6..1412773e185787a72c81150d955f338da932b7be 100644 (file)
@@ -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);
 }