]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Simplify print_doc_line
authorTom Tromey <tom@tromey.com>
Sun, 6 Apr 2025 18:58:55 +0000 (12:58 -0600)
committerTom Tromey <tom@tromey.com>
Tue, 8 Apr 2025 20:35:58 +0000 (14:35 -0600)
print_doc_line uses a static buffer and manually manages memory.  I
think neither of these is really needed, so this patch rewrites the
function to use std::string.  The new implementation tries to avoid
copying when possible.

Regression tested on x86-64 Fedora 40.

Reviewed-By: Keith Seitz <keiths@redhat.com>
gdb/cli/cli-decode.c

index c486306a616e0628a5aa17f39a3a97fad4bbe339..48a34667c37ca708693a5d9f7af4734af8ccf4a9 100644 (file)
@@ -2041,40 +2041,28 @@ void
 print_doc_line (struct ui_file *stream, const char *str,
                bool for_value_prefix)
 {
-  static char *line_buffer = 0;
-  static int line_size;
-  const char *p;
+  const char *p = strchr (str, '\n');
 
-  if (!line_buffer)
-    {
-      line_size = 80;
-      line_buffer = (char *) xmalloc (line_size);
-    }
+  /* Only copy the input string if we really need to.  */
+  std::optional<std::string> line_buffer;
+  if (p != nullptr)
+    line_buffer = std::string (str, p);
+  else if (for_value_prefix)
+    line_buffer = str;
 
-  /* Searches for the first end of line or the end of STR.  */
-  p = str;
-  while (*p && *p != '\n')
-    p++;
-  if (p - str > line_size - 1)
-    {
-      line_size = p - str + 1;
-      xfree (line_buffer);
-      line_buffer = (char *) xmalloc (line_size);
-    }
-  strncpy (line_buffer, str, p - str);
   if (for_value_prefix)
     {
-      if (islower (line_buffer[0]))
-       line_buffer[0] = toupper (line_buffer[0]);
-      gdb_assert (p > str);
-      if (line_buffer[p - str - 1] == '.')
-       line_buffer[p - str - 1] = '\0';
-      else
-       line_buffer[p - str] = '\0';
+      char &c = (*line_buffer)[0];
+      if (islower (c))
+       c = toupper (c);
+      if (line_buffer->back () == '.')
+       line_buffer->pop_back ();
     }
-  else
-    line_buffer[p - str] = '\0';
-  gdb_puts (line_buffer, stream);
+
+  gdb_puts (line_buffer.has_value ()
+           ? line_buffer->c_str ()
+           : str,
+           stream);
 }
 
 /* Print one-line help for command C.