From 95c64f92be44781ab0f9472e88296fbf971c79fa Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Tue, 22 Apr 2014 12:56:08 +0800 Subject: [PATCH] Fix display of tabulation character for mingw hosts. Pierre proposed this patch https://sourceware.org/ml/gdb-patches/2013-10/msg00011.html and Tom gave a suggestion that it's better to do check \t in print_wchar However, I don't see the follow-up to this discussion. We encounter two fails in printcmds.exp on mingw host, and Pierre's patch fixes them. I pick it up, update a little per Tom's comments, and post it here for review. This patch fixes these fails below on mingw32 host. FAIL: gdb.base/charset.exp: print string in ASCII FAIL: gdb.base/charset.exp: try printing '\t' in ASCII FAIL: gdb.base/charset.exp: print string in ISO-8859-1 FAIL: gdb.base/charset.exp: try printing '\t' in ISO-8859-1 FAIL: gdb.base/charset.exp: print string in UTF-32 FAIL: gdb.base/charset.exp: try printing '\t' in UTF-32 FAIL: gdb.base/printcmds.exp: p ctable1[9] FAIL: gdb.base/printcmds.exp: p &ctable1[1*8] Also regression tested on x86_64-linux. Is it OK? gdb: 2014-05-16 Pierre Muller Yao Qi * valprint.c (print_wchar): Move the code on checking whether W is a printable wide char to the default branch of switch statement below. Call wchar_printable instead of gdb_iswprint. --- gdb/ChangeLog | 7 ++++ gdb/valprint.c | 122 +++++++++++++++++++++++++++++---------------------------- 2 files changed, 70 insertions(+), 59 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cefa26e..1a439de 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2014-05-16 Pierre Muller + Yao Qi + + * valprint.c (print_wchar): Move the code on checking whether + W is a printable wide char to the default branch of switch + statement below. Call wchar_printable instead of gdb_iswprint. + 2014-05-16 Taimoor Mirza * arm-tdep.c (thumb_analyze_prologue): Fix offset calculation for diff --git a/gdb/valprint.c b/gdb/valprint.c index fe23530..f55b5db 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -1949,73 +1949,77 @@ print_wchar (gdb_wint_t w, const gdb_byte *orig, int need_escape = *need_escapep; *need_escapep = 0; - if (gdb_iswprint (w) && (!need_escape || (!gdb_iswdigit (w) - && w != LCST ('8') - && w != LCST ('9')))) - { - gdb_wchar_t wchar = w; - if (w == gdb_btowc (quoter) || w == LCST ('\\')) - obstack_grow_wstr (output, LCST ("\\")); - obstack_grow (output, &wchar, sizeof (gdb_wchar_t)); - } - else + /* iswprint implementation on Windows returns 1 for tab character. + In order to avoid different printout on this host, we explicitly + use wchar_printable function. */ + switch (w) { - switch (w) + case LCST ('\a'): + obstack_grow_wstr (output, LCST ("\\a")); + break; + case LCST ('\b'): + obstack_grow_wstr (output, LCST ("\\b")); + break; + case LCST ('\f'): + obstack_grow_wstr (output, LCST ("\\f")); + break; + case LCST ('\n'): + obstack_grow_wstr (output, LCST ("\\n")); + break; + case LCST ('\r'): + obstack_grow_wstr (output, LCST ("\\r")); + break; + case LCST ('\t'): + obstack_grow_wstr (output, LCST ("\\t")); + break; + case LCST ('\v'): + obstack_grow_wstr (output, LCST ("\\v")); + break; + default: { - case LCST ('\a'): - obstack_grow_wstr (output, LCST ("\\a")); - break; - case LCST ('\b'): - obstack_grow_wstr (output, LCST ("\\b")); - break; - case LCST ('\f'): - obstack_grow_wstr (output, LCST ("\\f")); - break; - case LCST ('\n'): - obstack_grow_wstr (output, LCST ("\\n")); - break; - case LCST ('\r'): - obstack_grow_wstr (output, LCST ("\\r")); - break; - case LCST ('\t'): - obstack_grow_wstr (output, LCST ("\\t")); - break; - case LCST ('\v'): - obstack_grow_wstr (output, LCST ("\\v")); - break; - default: - { - int i; + if (wchar_printable (w) && (!need_escape || (!gdb_iswdigit (w) + && w != LCST ('8') + && w != LCST ('9')))) + { + gdb_wchar_t wchar = w; - for (i = 0; i + width <= orig_len; i += width) - { - char octal[30]; - ULONGEST value; + if (w == gdb_btowc (quoter) || w == LCST ('\\')) + obstack_grow_wstr (output, LCST ("\\")); + obstack_grow (output, &wchar, sizeof (gdb_wchar_t)); + } + else + { + int i; + + for (i = 0; i + width <= orig_len; i += width) + { + char octal[30]; + ULONGEST value; - value = extract_unsigned_integer (&orig[i], width, + value = extract_unsigned_integer (&orig[i], width, byte_order); - /* 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)); - else - xsnprintf (octal, sizeof (octal), "\\x%lx", (long) value); - append_string_as_wide (octal, output); - } - /* If we somehow have extra bytes, print them now. */ - while (i < orig_len) - { - char octal[5]; + /* 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)); + else + xsnprintf (octal, sizeof (octal), "\\x%lx", (long) value); + append_string_as_wide (octal, output); + } + /* If we somehow have extra bytes, print them now. */ + while (i < orig_len) + { + char octal[5]; - xsnprintf (octal, sizeof (octal), "\\%.3o", orig[i] & 0xff); - append_string_as_wide (octal, output); - ++i; - } + xsnprintf (octal, sizeof (octal), "\\%.3o", orig[i] & 0xff); + append_string_as_wide (octal, output); + ++i; + } - *need_escapep = 1; - } + *need_escapep = 1; + } break; } } -- 2.7.4