aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2025-04-06 12:58:55 -0600
committerTom Tromey <tom@tromey.com>2025-04-08 14:35:58 -0600
commitae871f291b8a603026d674bd1b01590cb485a8c3 (patch)
treee5439ca144c738b5ca5e4055f09b75c774b18734
parentd55ade198f842223eecc99e88f30acf7b86a9bb6 (diff)
downloadbinutils-ae871f291b8a603026d674bd1b01590cb485a8c3.zip
binutils-ae871f291b8a603026d674bd1b01590cb485a8c3.tar.gz
binutils-ae871f291b8a603026d674bd1b01590cb485a8c3.tar.bz2
Simplify print_doc_line
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>
-rw-r--r--gdb/cli/cli-decode.c46
1 files changed, 17 insertions, 29 deletions
diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c
index c486306..48a3466 100644
--- a/gdb/cli/cli-decode.c
+++ b/gdb/cli/cli-decode.c
@@ -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.