aboutsummaryrefslogtreecommitdiff
path: root/gdb/valprint.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2022-02-12 18:41:34 -0700
committerTom Tromey <tom@tromey.com>2022-10-10 10:43:34 -0600
commit3041b9313e360af215e235e4d07f9557a22ffd13 (patch)
treeb8a842cd7c50117846a12342515d24499b339c75 /gdb/valprint.c
parent05328f9105ed738cc4fe96429abd33466e891699 (diff)
downloadgdb-3041b9313e360af215e235e4d07f9557a22ffd13.zip
gdb-3041b9313e360af215e235e4d07f9557a22ffd13.tar.gz
gdb-3041b9313e360af215e235e4d07f9557a22ffd13.tar.bz2
Fix a latent bug in print_wchar
print_wchar keeps track of when escape sequences are emitted, to force an escape sequence if needed by a subsequent character. For example for the string concatenation "\0" "1", gdb will print "\000\061" -- because printing "\0001" might be confusing. However, this code has two errors. First, this logic is not needed for octal escapes, because there is a length limit of 3 for octal escapes, and gdb always prints these with "%.3o". Second, though, this *is* needed for hex escapes, because those do not have a length limit. This patch fixes these problems and adds the appropriate tests.
Diffstat (limited to 'gdb/valprint.c')
-rw-r--r--gdb/valprint.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/gdb/valprint.c b/gdb/valprint.c
index 5a2f4df..f079f31 100644
--- a/gdb/valprint.c
+++ b/gdb/valprint.c
@@ -2108,9 +2108,7 @@ print_wchar (gdb_wint_t w, const gdb_byte *orig,
break;
default:
{
- if (gdb_iswprint (w) && (!need_escape || (!gdb_iswdigit (w)
- && w != LCST ('8')
- && w != LCST ('9'))))
+ if (gdb_iswprint (w) && !(need_escape && gdb_iswxdigit (w)))
{
gdb_wchar_t wchar = w;
@@ -2132,10 +2130,19 @@ print_wchar (gdb_wint_t w, const gdb_byte *orig,
/* If the value fits in 3 octal digits, print it that
way. Otherwise, print it as a hex escape. */
if (value <= 0777)
- xsnprintf (octal, sizeof (octal), "\\%.3o",
- (int) (value & 0777));
+ {
+ xsnprintf (octal, sizeof (octal), "\\%.3o",
+ (int) (value & 0777));
+ *need_escapep = false;
+ }
else
- xsnprintf (octal, sizeof (octal), "\\x%lx", (long) value);
+ {
+ xsnprintf (octal, sizeof (octal), "\\x%lx", (long) value);
+ /* A hex escape might require the next character
+ to be escaped, because, unlike with octal,
+ hex escapes have no length limit. */
+ *need_escapep = true;
+ }
append_string_as_wide (octal, output);
}
/* If we somehow have extra bytes, print them now. */
@@ -2144,11 +2151,10 @@ print_wchar (gdb_wint_t w, const gdb_byte *orig,
char octal[5];
xsnprintf (octal, sizeof (octal), "\\%.3o", orig[i] & 0xff);
+ *need_escapep = false;
append_string_as_wide (octal, output);
++i;
}
-
- *need_escapep = true;
}
break;
}