From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [PATCH 01/16] Change wrap buffering to use a std::string
Date: Wed, 28 Nov 2018 00:19:00 -0000 [thread overview]
Message-ID: <20181128001435.12703-2-tom@tromey.com> (raw)
In-Reply-To: <20181128001435.12703-1-tom@tromey.com>
Currently wrap buffering is implemented by allocating a string that is
the same width as the window, and then writing characters into it.
However, if gdb emits terminal escapes, then these could possibly
overflow the buffer.
To prevent this, change the wrap buffer to be a std::string and update
the various uses.
This also changes utils.c to always emit characters to the wrap
buffer. This simplifies future patches which emit terminal escape
sequences, and also makes it possible for the "echo" and "printf"
commands to be used to emit terminal escapes and have these work in
the TUI.
gdb/ChangeLog
2018-11-27 Tom Tromey <tom@tromey.com>
* utils.c (filter_initalized): New global.
(wrap_buffer): Now a std::string.
(wrap_pointer): Remove.
(flush_wrap_buffer): New function.
(filtered_printing_initialized, set_width, wrap_here)
(fputs_maybe_filtered): Update.
---
gdb/ChangeLog | 9 ++++++++
gdb/utils.c | 63 +++++++++++++++++++++------------------------------
2 files changed, 35 insertions(+), 37 deletions(-)
diff --git a/gdb/utils.c b/gdb/utils.c
index 0577e64ea8..0f1953a66d 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1268,13 +1268,11 @@ static bool pagination_disabled_for_command;
the end of the line, we spit out a newline, the indent, and then
the buffered output. */
-/* Malloc'd buffer with chars_per_line+2 bytes. Contains characters which
- are waiting to be output (they have already been counted in chars_printed).
- When wrap_buffer[0] is null, the buffer is empty. */
-static char *wrap_buffer;
+static bool filter_initalized = false;
-/* Pointer in wrap_buffer to the next character to fill. */
-static char *wrap_pointer;
+/* Contains characters which are waiting to be output (they have
+ already been counted in chars_printed). */
+static std::string wrap_buffer;
/* String to indent by if the wrap occurs. Must not be NULL if wrap_column
is non-zero. */
@@ -1347,7 +1345,7 @@ init_page_info (void)
int
filtered_printing_initialized (void)
{
- return wrap_buffer != NULL;
+ return filter_initalized;
}
set_batch_flag_and_restore_page_info::set_batch_flag_and_restore_page_info ()
@@ -1387,8 +1385,7 @@ set_screen_size (void)
rl_set_screen_size (rows, cols);
}
-/* Reinitialize WRAP_BUFFER according to the current value of
- CHARS_PER_LINE. */
+/* Reinitialize WRAP_BUFFER. */
static void
set_width (void)
@@ -1396,14 +1393,8 @@ set_width (void)
if (chars_per_line == 0)
init_page_info ();
- if (!wrap_buffer)
- {
- wrap_buffer = (char *) xmalloc (chars_per_line + 2);
- wrap_buffer[0] = '\0';
- }
- else
- wrap_buffer = (char *) xrealloc (wrap_buffer, chars_per_line + 2);
- wrap_pointer = wrap_buffer; /* Start it at the beginning. */
+ wrap_buffer.clear ();
+ filter_initalized = true;
}
static void
@@ -1521,6 +1512,18 @@ reinitialize_more_filter (void)
pagination_disabled_for_command = false;
}
+/* Flush the wrap buffer to STREAM, if necessary. */
+
+static void
+flush_wrap_buffer (struct ui_file *stream)
+{
+ if (!wrap_buffer.empty ())
+ {
+ fputs_unfiltered (wrap_buffer.c_str (), stream);
+ wrap_buffer.clear ();
+ }
+}
+
/* Indicate that if the next sequence of characters overflows the line,
a newline should be inserted here rather than when it hits the end.
If INDENT is non-null, it is a string to be printed to indent the
@@ -1546,17 +1549,11 @@ void
wrap_here (const char *indent)
{
/* This should have been allocated, but be paranoid anyway. */
- if (!wrap_buffer)
+ if (!filter_initalized)
internal_error (__FILE__, __LINE__,
_("failed internal consistency check"));
- if (wrap_buffer[0])
- {
- *wrap_pointer = '\0';
- fputs_unfiltered (wrap_buffer, gdb_stdout);
- }
- wrap_pointer = wrap_buffer;
- wrap_buffer[0] = '\0';
+ flush_wrap_buffer (gdb_stdout);
if (chars_per_line == UINT_MAX) /* No line overflow checking. */
{
wrap_column = 0;
@@ -1669,6 +1666,7 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
|| top_level_interpreter () == NULL
|| top_level_interpreter ()->interp_ui_out ()->is_mi_like_p ())
{
+ flush_wrap_buffer (stream);
fputs_unfiltered (linebuffer, stream);
return;
}
@@ -1692,10 +1690,7 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
/* Print a single line. */
if (*lineptr == '\t')
{
- if (wrap_column)
- *wrap_pointer++ = '\t';
- else
- fputc_unfiltered ('\t', stream);
+ wrap_buffer.push_back ('\t');
/* Shifting right by 3 produces the number of tab stops
we have already passed, and then adding one and
shifting left 3 advances to the next tab stop. */
@@ -1704,10 +1699,7 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
}
else
{
- if (wrap_column)
- *wrap_pointer++ = *lineptr;
- else
- fputc_unfiltered (*lineptr, stream);
+ wrap_buffer.push_back (*lineptr);
chars_printed++;
lineptr++;
}
@@ -1735,8 +1727,7 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
if (wrap_column)
{
fputs_unfiltered (wrap_indent, stream);
- *wrap_pointer = '\0'; /* Null-terminate saved stuff, */
- fputs_unfiltered (wrap_buffer, stream); /* and eject it. */
+ flush_wrap_buffer (stream);
/* FIXME, this strlen is what prevents wrap_indent from
containing tabs. However, if we recurse to print it
and count its chars, we risk trouble if wrap_indent is
@@ -1745,8 +1736,6 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
if we are printing a long string. */
chars_printed = strlen (wrap_indent)
+ (save_chars - wrap_column);
- wrap_pointer = wrap_buffer; /* Reset buffer */
- wrap_buffer[0] = '\0';
wrap_column = 0; /* And disable fancy wrap */
}
}
--
2.17.2
next prev parent reply other threads:[~2018-11-28 0:19 UTC|newest]
Thread overview: 99+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-28 0:16 [PATCH 00/16] Add styling to the gdb CLI and TUI Tom Tromey
2018-11-28 0:14 ` [PATCH 12/16] Style addresses Tom Tromey
2018-11-28 0:14 ` [PATCH 05/16] Add output styles to gdb Tom Tromey
2018-12-24 4:08 ` Joel Brobecker
2018-12-28 18:55 ` Tom Tromey
2018-11-28 0:14 ` [PATCH 09/16] Style print_address_symbolic Tom Tromey
2018-11-28 0:14 ` [PATCH 14/16] Use wclrtoeol in tui_show_source_line Tom Tromey
2018-12-24 8:03 ` Joel Brobecker
2018-11-28 0:14 ` [PATCH 10/16] Style the gdb welcome message Tom Tromey
2018-11-28 0:14 ` [PATCH 06/16] Reset terminal styles Tom Tromey
2018-12-24 4:16 ` Joel Brobecker
2018-12-28 19:01 ` Tom Tromey
2018-11-28 0:14 ` [PATCH 02/16] Add a "context" argument to add_setshow_enum_cmd Tom Tromey
2018-11-28 0:14 ` [PATCH 03/16] Introduce ui_file_style Tom Tromey
2018-12-24 3:40 ` Joel Brobecker
2018-12-28 18:54 ` Tom Tromey
2018-11-28 0:16 ` [PATCH 16/16] Document the "set style" commands Tom Tromey
2018-11-28 6:51 ` Eli Zaretskii
2018-12-28 19:19 ` Tom Tromey
2018-11-28 0:16 ` [PATCH 07/16] Style variable names Tom Tromey
2018-11-28 0:16 ` [PATCH 11/16] Style the "Reading symbols" message Tom Tromey
2018-11-28 0:16 ` [PATCH 15/16] Highlight source code using GNU Source Highlight Tom Tromey
2019-11-16 0:58 ` Andrew Pinski
2019-11-16 8:19 ` Eli Zaretskii
2019-11-24 17:41 ` Tom Tromey
2019-11-24 18:13 ` Christian Biesinger via gdb-patches
2019-11-24 19:53 ` Tom Tromey
2018-11-28 0:16 ` [PATCH 13/16] Make ANSI terminal escape sequences work in TUI Tom Tromey
2018-12-24 8:02 ` Joel Brobecker
2018-12-28 19:42 ` Tom Tromey
2018-11-28 0:16 ` [PATCH 04/16] Change gdb test suite's TERM setting Tom Tromey
2018-11-28 0:16 ` [PATCH 08/16] Style locations when setting a breakpoint Tom Tromey
2018-11-28 0:19 ` Tom Tromey [this message]
2018-12-23 15:26 ` [PATCH 01/16] Change wrap buffering to use a std::string Joel Brobecker
2018-12-28 18:47 ` Tom Tromey
2018-11-28 7:02 ` [PATCH 00/16] Add styling to the gdb CLI and TUI Eli Zaretskii
2018-11-29 22:44 ` Tom Tromey
2018-11-30 7:02 ` Eli Zaretskii
2018-11-30 16:17 ` Tom Tromey
2018-12-23 10:49 ` Joel Brobecker
2019-03-01 13:10 ` Pedro Alves
2019-03-01 13:56 ` Eli Zaretskii
2019-03-01 14:10 ` Pedro Alves
2019-03-01 14:50 ` Eli Zaretskii
2019-03-01 7:47 ` Eli Zaretskii
2019-03-01 18:42 ` Tom Tromey
2019-03-01 19:40 ` Eli Zaretskii
2019-03-01 21:04 ` Tom Tromey
2019-03-02 7:15 ` Eli Zaretskii
2019-03-03 15:42 ` Eli Zaretskii
2019-03-04 15:08 ` Tom Tromey
2019-03-04 15:57 ` Eli Zaretskii
2019-03-04 16:16 ` Tom Tromey
2019-03-05 15:38 ` Eli Zaretskii
2019-03-08 14:55 ` Eli Zaretskii
2019-03-08 16:14 ` Hannes Domani via gdb-patches
2019-03-08 21:08 ` Tom Tromey
2019-03-08 21:11 ` Tom Tromey
2019-03-09 6:49 ` Eli Zaretskii
2019-03-03 15:53 ` Eli Zaretskii
2019-03-03 16:16 ` Matt Rice
2019-03-03 17:13 ` Eli Zaretskii
2019-03-03 18:04 ` Matt Rice
2019-03-04 15:01 ` Tom Tromey
2019-03-04 17:37 ` Eli Zaretskii
2019-03-04 17:40 ` Tom Tromey
2019-03-06 16:02 ` Eli Zaretskii
2019-03-20 19:35 ` GDB version as convenience variable Eli Zaretskii
2019-03-25 17:31 ` Eli Zaretskii
2019-03-25 17:58 ` Simon Marchi
2019-03-25 18:10 ` Eli Zaretskii
2019-03-25 18:33 ` Simon Marchi
2019-03-25 18:37 ` Simon Marchi
2019-03-25 18:43 ` Eli Zaretskii
2019-03-25 18:51 ` Simon Marchi
2019-03-25 19:19 ` Eli Zaretskii
2019-03-26 14:47 ` Simon Marchi
2019-03-26 20:57 ` Joel Brobecker
2019-03-27 3:34 ` Eli Zaretskii
2019-03-27 12:56 ` Joel Brobecker
2019-03-30 17:25 ` Simon Marchi
2019-03-30 10:01 ` Eli Zaretskii
2019-03-21 1:55 ` [PATCH 00/16] Add styling to the gdb CLI and TUI Simon Marchi
2019-03-21 14:38 ` Eli Zaretskii
2019-03-21 15:02 ` Simon Marchi
2019-03-21 16:01 ` Eli Zaretskii
2019-03-21 16:06 ` Simon Marchi
2019-03-21 16:12 ` Pedro Alves
2019-03-21 16:54 ` John Baldwin
2019-03-21 17:02 ` Eli Zaretskii
2019-03-21 18:08 ` Simon Marchi
2019-03-21 18:19 ` Pedro Alves
2019-03-21 18:38 ` Eli Zaretskii
2019-03-07 6:02 ` Joel Brobecker
2019-03-07 14:53 ` Eli Zaretskii
2019-03-08 5:40 ` Joel Brobecker
2019-03-04 16:04 ` Eli Zaretskii
2018-12-24 9:27 ` Joel Brobecker
2018-12-28 20:57 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181128001435.12703-2-tom@tromey.com \
--to=tom@tromey.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox