diff options
author | Tom Tromey <tom@tromey.com> | 2025-04-06 12:58:55 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2025-04-08 14:35:58 -0600 |
commit | ae871f291b8a603026d674bd1b01590cb485a8c3 (patch) | |
tree | e5439ca144c738b5ca5e4055f09b75c774b18734 | |
parent | d55ade198f842223eecc99e88f30acf7b86a9bb6 (diff) | |
download | binutils-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.c | 46 |
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. |