diff options
author | Keith Seitz <keiths@redhat.com> | 2012-11-10 20:19:01 +0000 |
---|---|---|
committer | Keith Seitz <keiths@redhat.com> | 2012-11-10 20:19:01 +0000 |
commit | 0d63ecdad04d410698c905283d095505680ba907 (patch) | |
tree | 3f894b47be2cfef2d36d71ffb1cb4d33717bd9b7 /gdb/testsuite/gdb.base | |
parent | 9b8d6827200e1b04d3ca860ce52472655e84248c (diff) | |
download | fsf-binutils-gdb-0d63ecdad04d410698c905283d095505680ba907.zip fsf-binutils-gdb-0d63ecdad04d410698c905283d095505680ba907.tar.gz fsf-binutils-gdb-0d63ecdad04d410698c905283d095505680ba907.tar.bz2 |
PR gdb/14288
* c-valprint.c (c_val_print): For character arrays
with "print null" option on, print ellipses if
the output is truncated and the next character is not \000.
* valprint.c (MAX_WCHARS): Define.
(WCHAR_BUFLEN): Likewise.
(WCHAR_BUFLEN_MAX): Likewise.
(struct converted_character): New structure.
(count_next_character): New function.
(print_converted_chars_to_obstack): New function.
(generic_printstr): Rewrite using count_next_character
and print_converted_chars_to_obstack.
* gdb.base/printcmds.c: Add invalid_XXX globals
for repeated byte tests.
* gdb.base/printcmds.exp (test_repeat_bytes): New procedure.
* gdb.base/wchar.c (main): Add and construct a wchar_t
array with repeated characters.
* gdb.base/wchar.exp: Add repeated character tests.
Diffstat (limited to 'gdb/testsuite/gdb.base')
-rw-r--r-- | gdb/testsuite/gdb.base/printcmds.c | 92 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/printcmds.exp | 71 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/wchar.c | 10 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/wchar.exp | 19 |
4 files changed, 192 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/printcmds.c b/gdb/testsuite/gdb.base/printcmds.c index 743734b..d80c13d 100644 --- a/gdb/testsuite/gdb.base/printcmds.c +++ b/gdb/testsuite/gdb.base/printcmds.c @@ -122,6 +122,98 @@ struct some_struct } }; +/* The following variables are used for testing byte repeat sequences. + The variable names are encoded: invalid_XYZ where: + X = start + Y = invalid + Z = end + + Each of X and Z can be "E" (empty), "S" (single), "L" (long single), + or "R" (repeat). + + Y can be either any of the above except "E" (otherwise there is nothing + to test). */ +char invalid_ESE[] = "\240"; +char invalid_SSE[] = "a\240"; +char invalid_LSE[] = "abaabbaaabbb\240"; +char invalid_RSE[] = "aaaaaaaaaaaaaaaaaaaa\240"; +char invalid_ESS[] = "\240c"; +char invalid_SSS[] = "a\240c"; +char invalid_LSS[] = "abaabbaaabbb\240c"; +char invalid_RSS[] = "aaaaaaaaaaaaaaaaaaaa\240c"; +char invalid_ESL[] = "\240cdccddcccddd"; +char invalid_SSL[] = "a\240cdccddcccddd"; +char invalid_LSL[] = "abaabbaaabbb\240cdccddcccddd"; +char invalid_RSL[] = "aaaaaaaaaaaaaaaaaaaa\240cdccddcccddd"; +char invalid_ESR[] = "\240cccccccccccccccccccc"; +char invalid_SSR[] = "a\240cccccccccccccccccccc"; +char invalid_LSR[] = "abaabbaaabbb\240cccccccccccccccccccc"; +char invalid_RSR[] = "aaaaaaaaaaaaaaaaaaaa\240cccccccccccccccccccc"; +char invalid_ELE[] = "\240\240\240\240"; +char invalid_SLE[] = "a\240\240\240\240"; +char invalid_LLE[] = "abaabbaaabbb\240\240\240\240"; +char invalid_RLE[] = "aaaaaaaaaaaaaaaaaaaa\240\240\240\240"; +char invalid_ELS[] = "\240\240\240\240c"; +char invalid_SLS[] = "a\240\240\240\240c"; +char invalid_LLS[] = "abaabbaaabbb\240\240\240\240c"; +char invalid_RLS[] = "aaaaaaaaaaaaaaaaaaaa\240\240\240\240c"; +char invalid_ELL[] = "\240\240\240\240cdccddcccddd"; +char invalid_SLL[] = "a\240\240\240\240cdccddcccddd"; +char invalid_LLL[] = "abaabbaaabbb\240\240\240\240cdccddcccddd"; +char invalid_RLL[] = "aaaaaaaaaaaaaaaaaaaa\240\240\240\240cdccddcccddd"; +char invalid_ELR[] = "\240\240\240\240cccccccccccccccccccc"; +char invalid_SLR[] = "a\240\240\240\240cccccccccccccccccccc"; +char invalid_LLR[] = "abaabbaaabbb\240\240\240\240cccccccccccccccccccc"; +char invalid_RLR[] = "aaaaaaaaaaaaaaaaaaaa\240\240\240\240cccccccccccccccccccc"; +char invalid_ERE[] = "" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240"; +char invalid_LRE[] = "abaabbaaabbb" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240"; +char invalid_RRE[] = "aaaaaaaaaaaaaaaaaaaa" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240"; +char invalid_ERS[] = "" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240c"; +char invalid_ERL[] = "" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240cdccddcccddd"; +char invalid_ERR[] = "" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240cccccccccccccccccccc"; +char invalid_SRE[] = "a" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240"; +char invalid_SRS[] = "a" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240c"; +char invalid_SRL[] = "a" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240cdccddcccddd"; +char invalid_SRR[] = "a" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240cccccccccccccccccccc"; +char invalid_LRS[] = "abaabbaaabbb" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240c"; +char invalid_LRL[] = "abaabbaaabbb" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240cdccddcccddd"; +char invalid_LRR[] = "abaabbaaabbb" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240cccccccccccccccccccc"; +char invalid_RRS[] = "aaaaaaaaaaaaaaaaaaaa" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240c"; +char invalid_RRL[] = "aaaaaaaaaaaaaaaaaaaa" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240cdccddcccddd"; +char invalid_RRR[] = "aaaaaaaaaaaaaaaaaaaa" + "\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240cccccccccccccccccccc"; + /* -- */ int main () diff --git a/gdb/testsuite/gdb.base/printcmds.exp b/gdb/testsuite/gdb.base/printcmds.exp index 4f76cec..4dfe90f 100644 --- a/gdb/testsuite/gdb.base/printcmds.exp +++ b/gdb/testsuite/gdb.base/printcmds.exp @@ -792,6 +792,76 @@ proc gdb_test_escape_braces { args } { gdb_test [lindex $args 0] $esc_pattern [lindex $args 2] } +proc test_repeat_bytes {} { + set start(E) {} + set start(S) {a} + set start(L) {abaabbaaabbb} + set start(R) {'a' <repeats 20 times>} + set end(E) {} + set end(S) {c} + set end(L) {cdccddcccddd} + set end(R) {'c' <repeats 20 times>} + set invalid(S) {\\240} + set invalid(L) {\\240\\240\\240\\240} + set invalid(R) {'\\240' <repeats 20 times>} + + set fmt(SSS) "\"%s%s%s\"" + set fmt(SSR) "\"%s%s\", %s" + set fmt(SRS) "\"%s\", %s, \"%s\"" + set fmt(RSS) "%s, \"%s%s\"" + set fmt(RSR) "%s, \"%s\", %s" + set fmt(SRR) "\"%s\", %s, %s" + set fmt(RRS) "%s, %s, \"%s\"" + set fmt(RRR) "%s, %s, %s" + + set fmt(RS) "%s, \"%s\"" + set fmt(RR) "%s, %s" + set fmt(SR) "\"%s\", %s" + set fmt(SS) "\"%s%s\"" + + # Test the various permutations of invalid characters + foreach i [array names invalid] { + set I $i + + if {$i == "L"} { + set i "S" + } + + foreach s [array names start] { + set S $s + + if {$s == "L"} { + set s "S" + } + + + foreach e [array names end] { + set E $e + + if {$e == "L"} { + set e "S" + } + + # Skip E*E. + if {$s == "E" && $e == "E"} { continue } + + # Special cases... + if {$s == "E"} { + set result [format $fmt($i$e) $invalid($I) $end($E)] + } elseif {$e == "E"} { + set result [format $fmt($s$i) $start($S) $invalid($I)] + } else { + set result [format $fmt($s$i$e) \ + $start($S) $invalid($I) $end($E)] + } + + send_log "expecting: = $result\n" + gdb_test "print invalid_$S$I$E" "= $result" + } + } + } +} + # Start with a fresh gdb. gdb_exit @@ -851,3 +921,4 @@ test_print_enums test_printf test_printf_with_dfp test_print_symbol +test_repeat_bytes diff --git a/gdb/testsuite/gdb.base/wchar.c b/gdb/testsuite/gdb.base/wchar.c index 22f5beb..7bdfd68 100644 --- a/gdb/testsuite/gdb.base/wchar.c +++ b/gdb/testsuite/gdb.base/wchar.c @@ -25,11 +25,21 @@ do_nothing (wchar_t *c) int main (void) { + int i; wchar_t narrow = 97; wchar_t single = 0xbeef; wchar_t simple[] = L"facile"; wchar_t difficile[] = { 0xdead, 0xbeef, 0xfeed, 0xface}; wchar_t mixed[] = {L'f', 0xdead, L'a', L'c', 0xfeed, 0xface}; + wchar_t *cent = L"\242"; + wchar_t repeat[128]; + wchar_t *repeat_p = repeat; + + repeat[0] = 0; + wcscat (repeat, L"A"); + for (i = 0; i < 21; ++i) + wcscat (repeat, cent); + wcscat (repeat, L"B"); do_nothing (&narrow); /* START */ do_nothing (&single); diff --git a/gdb/testsuite/gdb.base/wchar.exp b/gdb/testsuite/gdb.base/wchar.exp index 2451d92..4c7ebf1 100644 --- a/gdb/testsuite/gdb.base/wchar.exp +++ b/gdb/testsuite/gdb.base/wchar.exp @@ -36,3 +36,22 @@ gdb_test "print simple\[2\]" "= 99 L'c'" gdb_test "print difficile\[2\]" "= 65261 L'\\\\xfeed'" +set cent "\\\\242" +gdb_test "print repeat" "= L\"A\", '$cent' <repeats 21 times>, \"B.*" + +global hex +gdb_test "print repeat_p" \ + "= $hex L\"A\", '$cent' <repeats 21 times>, \"B\"" + +gdb_test_no_output "set print null on" + +gdb_test "print repeat" "= L\"A\", '$cent' <repeats 21 times>, \"B\"" \ + "print repeat (print null on)" + +gdb_test_no_output "set print elements 3" + +gdb_test "print repeat" "= L\"A$cent$cent\"\.\.\." \ + "print repeat (print elements 3)" + +gdb_test "print repeat_p" "= $hex L\"A$cent$cent\"\.\.\." \ + "print repeat_p (print elements 3)" |