Don't create empty literal pieces

I noticed that format_pieces can create an empty literal piece.
However, there's never a need for one, so this patch removes the
possibility.

gdb/ChangeLog
2019-10-01  Tom Tromey  <tom@tromey.com>

	* unittests/format_pieces-selftests.c: Update.  Add final format.
	* gdbsupport/format.c (format_pieces::format_pieces): Don't add
	empty literal pieces.
This commit is contained in:
Tom Tromey
2019-09-22 16:06:03 -06:00
parent e43b10e10e
commit 0dfe5bfbb7
3 changed files with 20 additions and 8 deletions

View File

@ -1,3 +1,9 @@
2019-10-01 Tom Tromey <tom@tromey.com>
* unittests/format_pieces-selftests.c: Update. Add final format.
* gdbsupport/format.c (format_pieces::format_pieces): Don't add
empty literal pieces.
2019-10-01 Tom Tromey <tom@tromey.com>
* ui-out.h (enum class ui_out_style_kind): Remove.

View File

@ -129,7 +129,8 @@ format_pieces::format_pieces (const char **arg)
current_substring += f - 1 - prev_start;
*current_substring++ = '\0';
m_pieces.emplace_back (sub_start, literal_piece);
if (*sub_start != '\0')
m_pieces.emplace_back (sub_start, literal_piece);
percent_loc = f - 1;
@ -340,11 +341,14 @@ format_pieces::format_pieces (const char **arg)
/* Record the remainder of the string. */
sub_start = current_substring;
if (f > prev_start)
{
sub_start = current_substring;
strncpy (current_substring, prev_start, f - prev_start);
current_substring += f - prev_start;
*current_substring++ = '\0';
strncpy (current_substring, prev_start, f - prev_start);
current_substring += f - prev_start;
*current_substring++ = '\0';
m_pieces.emplace_back (sub_start, literal_piece);
m_pieces.emplace_back (sub_start, literal_piece);
}
}

View File

@ -48,13 +48,15 @@ test_escape_sequences ()
static void
test_format_specifier ()
{
check ("Hello %d%llx%%d", /* ARI: %ll */
/* The format string here ends with a % sequence, to ensure we don't
see a trailing empty literal piece. */
check ("Hello %d%llx%%d%d", /* ARI: %ll */
{
format_piece ("Hello ", literal_piece),
format_piece ("%d", int_arg),
format_piece ("", literal_piece),
format_piece ("%llx", long_long_arg), /* ARI: %ll */
format_piece ("%%d", literal_piece),
format_piece ("%d", int_arg),
});
}