Refactor handle_qxfer_libraries and friends to use std::string
authorSimon Marchi <simon.marchi@ericsson.com>
Sat, 16 Sep 2017 12:22:11 +0000 (14:22 +0200)
committerSimon Marchi <simon.marchi@ericsson.com>
Sat, 16 Sep 2017 12:22:11 +0000 (14:22 +0200)
Using std::string in handle_qxfer_libraries and friends allow to
simplify the code.  We don't have to manually free the buffer, and we
don't have to pre-compute the required space.

gdb/gdbserver/ChangeLog:

* server.c (accumulate_file_name_length): Remove.
(emit_dll_description): Adjust to std::string change.
(handle_qxfer_libraries): Use std::string to hold document.

gdb/gdbserver/ChangeLog
gdb/gdbserver/server.c

index 49a76c94f601479b3c55b56483e14cbc28d37eaf..00e789187e78def3907f6fc3095036a8cef67c90 100644 (file)
@@ -1,3 +1,9 @@
+2017-09-16  Simon Marchi  <simon.marchi@ericsson.com>
+
+       * server.c (accumulate_file_name_length): Remove.
+       (emit_dll_description): Adjust to std::string change.
+       (handle_qxfer_libraries): Use std::string to hold document.
+
 2017-09-16  Simon Marchi  <simon.marchi@ericsson.com>
 
        * linux-low.c (linux_qxfer_libraries_svr4): Adjust to change of
index 92943e2e6f38914961e236b10833a89078529b49..f4faff9d77fe6b357a1916eb805acc1944db3680 100644 (file)
@@ -1508,21 +1508,6 @@ handle_qxfer_features (const char *annex,
   return len;
 }
 
-/* Worker routine for handle_qxfer_libraries.
-   Add to the length pointed to by ARG a conservative estimate of the
-   length needed to transmit the file name of INF.  */
-
-static void
-accumulate_file_name_length (struct inferior_list_entry *inf, void *arg)
-{
-  struct dll_info *dll = (struct dll_info *) inf;
-  unsigned int *total_len = (unsigned int *) arg;
-
-  /* Over-estimate the necessary memory.  Assume that every character
-     in the library name must be escaped.  */
-  *total_len += 128 + 6 * strlen (dll->name);
-}
-
 /* Worker routine for handle_qxfer_libraries.
    Emit the XML to describe the library in INF.  */
 
@@ -1530,22 +1515,12 @@ static void
 emit_dll_description (struct inferior_list_entry *inf, void *arg)
 {
   struct dll_info *dll = (struct dll_info *) inf;
-  char **p_ptr = (char **) arg;
-  char *p = *p_ptr;
-
-  strcpy (p, "  <library name=\"");
-  p = p + strlen (p);
+  std::string *document = (std::string *) arg;
   std::string name = xml_escape_text (dll->name);
-  strcpy (p, name.c_str ());
-  p = p + strlen (p);
-  strcpy (p, "\"><segment address=\"");
-  p = p + strlen (p);
-  sprintf (p, "0x%lx", (long) dll->base_addr);
-  p = p + strlen (p);
-  strcpy (p, "\"/></library>\n");
-  p = p + strlen (p);
-
-  *p_ptr = p;
+
+  *document += string_printf
+    ("  <library name=\"%s\"><segment address=\"0x%lx\"/></library>\n",
+     name.c_str (), (long) dll->base_addr);
 }
 
 /* Handle qXfer:libraries:read.  */
@@ -1555,43 +1530,26 @@ handle_qxfer_libraries (const char *annex,
                        gdb_byte *readbuf, const gdb_byte *writebuf,
                        ULONGEST offset, LONGEST len)
 {
-  unsigned int total_len;
-  char *document, *p;
-
   if (writebuf != NULL)
     return -2;
 
   if (annex[0] != '\0' || current_thread == NULL)
     return -1;
 
-  total_len = 64;
-  for_each_inferior_with_data (&all_dlls, accumulate_file_name_length,
-                              &total_len);
-
-  document = (char *) malloc (total_len);
-  if (document == NULL)
-    return -1;
-
-  strcpy (document, "<library-list version=\"1.0\">\n");
-  p = document + strlen (document);
+  std::string document = "<library-list version=\"1.0\">\n";
 
-  for_each_inferior_with_data (&all_dlls, emit_dll_description, &p);
+  for_each_inferior_with_data (&all_dlls, emit_dll_description, &document);
 
-  strcpy (p, "</library-list>\n");
+  document += "</library-list>\n";
 
-  total_len = strlen (document);
+  if (offset > document.length ())
+    return -1;
 
-  if (offset > total_len)
-    {
-      free (document);
-      return -1;
-    }
+  if (offset + len > document.length ())
+    len = document.length () - offset;
 
-  if (offset + len > total_len)
-    len = total_len - offset;
+  memcpy (readbuf, &document[offset], len);
 
-  memcpy (readbuf, document + offset, len);
-  free (document);
   return len;
 }