From 7ca166c9408599e64c0cd3c5d3f0d00c8fae2d9e Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sat, 8 Dec 2018 11:49:20 +1030 Subject: [PATCH] Fix strings.c endian issue and strings test git commit 71f5e3f7b624 obviously wasn't tested on a big-endian host, and the test fail message resulted in tcl errors. * strings.c (unget_part_char): New function. (print_strings): Use unget_part_char. Formatting. * testsuite/binutils-all/strings.exp (test_multibyte): Don't use square brackets in fail message. Expect "String1\nString2". --- binutils/ChangeLog | 7 + binutils/strings.c | 167 +++++++++----------- binutils/testsuite/binutils-all/strings.exp | 18 +-- 3 files changed, 87 insertions(+), 105 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index a75f83b923..a5796a8cf9 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,10 @@ +2018-12-08 Alan Modra + + * strings.c (unget_part_char): New function. + (print_strings): Use unget_part_char. Formatting. + * testsuite/binutils-all/strings.exp (test_multibyte): Don't + use square brackets in fail message. Expect "String1\nString2". + 2018-12-07 Alan Modra * nm.c (display_rel_file): Use xrealloc to increase minisyms diff --git a/binutils/strings.c b/binutils/strings.c index e1fecc0932..fedfee9057 100644 --- a/binutils/strings.c +++ b/binutils/strings.c @@ -502,6 +502,57 @@ get_char (FILE *stream, file_ptr *address, int *magiccount, char **magic) return r; } + +/* Throw away one byte of a (possibly) multi-byte char C, updating + address and buffer to suit. */ + +static void +unget_part_char (long c, file_ptr *address, int *magiccount, char **magic) +{ + static char tmp[4]; + + if (encoding_bytes > 1) + { + *address -= encoding_bytes - 1; + + if (*magiccount == 0) + { + /* If no magic buffer exists, use temp buffer. */ + switch (encoding) + { + default: + break; + case 'b': + tmp[0] = c & 0xff; + *magiccount = 1; + break; + case 'l': + tmp[0] = (c >> 8) & 0xff; + *magiccount = 1; + break; + case 'B': + tmp[0] = (c >> 16) & 0xff; + tmp[1] = (c >> 8) & 0xff; + tmp[2] = c & 0xff; + *magiccount = 3; + break; + case 'L': + tmp[0] = (c >> 8) & 0xff; + tmp[1] = (c >> 16) & 0xff; + tmp[2] = (c >> 24) & 0xff; + *magiccount = 3; + break; + } + *magic = tmp; + } + else + { + /* If magic buffer exists, rewind. */ + *magic -= encoding_bytes - 1; + *magiccount += encoding_bytes - 1; + } + } +} /* Find the strings in file FILENAME, read from STREAM. Assume that STREAM is positioned so that the next byte read @@ -543,43 +594,8 @@ print_strings (const char *filename, FILE *stream, file_ptr address, if (! STRING_ISGRAPHIC (c)) { - /* Found a non-graphic. Try again starting with next char. */ - if (encoding_bytes > 1) - { - /* In case of multibyte encodings rewind using magic buffer. */ - if (magiccount == 0) - { - /* If no magic buffer exists: use memory of c. */ - switch (encoding) - { - default: - break; - case 'b': - c = c & 0xff; - magiccount += 1; - break; - case 'l': - case 'L': - c = c >> 8; - magiccount += (encoding_bytes -1); - break; - case 'B': - c = (( c & 0xff0000) >> 16) | ( c & 0xff00) - | (( c & 0xff) << 16); - magiccount += 3; - break; - } - magic = (char *) &c; - } - else - { - /* If magic buffer exists: rewind. */ - magic = magic - (encoding_bytes -1); - } - - address = address - (encoding_bytes -1); - } - + /* Found a non-graphic. Try again starting with next byte. */ + unget_part_char (c, &address, &magiccount, &magic); goto tryline; } buf[i] = c; @@ -598,18 +614,18 @@ print_strings (const char *filename, FILE *stream, file_ptr address, if (sizeof (start) > sizeof (long)) { # ifndef __MSVCRT__ - printf ("%7llo ", (unsigned long long) start); + printf ("%7llo ", (unsigned long long) start); # else - printf ("%7I64o ", (unsigned long long) start); + printf ("%7I64o ", (unsigned long long) start); # endif } else #elif !BFD_HOST_64BIT_LONG - if (start != (unsigned long) start) - printf ("++%7lo ", (unsigned long) start); - else + if (start != (unsigned long) start) + printf ("++%7lo ", (unsigned long) start); + else #endif - printf ("%7lo ", (unsigned long) start); + printf ("%7lo ", (unsigned long) start); break; case 10: @@ -617,18 +633,18 @@ print_strings (const char *filename, FILE *stream, file_ptr address, if (sizeof (start) > sizeof (long)) { # ifndef __MSVCRT__ - printf ("%7lld ", (unsigned long long) start); + printf ("%7lld ", (unsigned long long) start); # else - printf ("%7I64d ", (unsigned long long) start); + printf ("%7I64d ", (unsigned long long) start); # endif } else #elif !BFD_HOST_64BIT_LONG - if (start != (unsigned long) start) - printf ("++%7ld ", (unsigned long) start); - else + if (start != (unsigned long) start) + printf ("++%7ld ", (unsigned long) start); + else #endif - printf ("%7ld ", (long) start); + printf ("%7ld ", (long) start); break; case 16: @@ -636,19 +652,19 @@ print_strings (const char *filename, FILE *stream, file_ptr address, if (sizeof (start) > sizeof (long)) { # ifndef __MSVCRT__ - printf ("%7llx ", (unsigned long long) start); + printf ("%7llx ", (unsigned long long) start); # else - printf ("%7I64x ", (unsigned long long) start); + printf ("%7I64x ", (unsigned long long) start); # endif } else #elif !BFD_HOST_64BIT_LONG - if (start != (unsigned long) start) - printf ("%lx%8.8lx ", (unsigned long) (start >> 32), - (unsigned long) (start & 0xffffffff)); - else + if (start != (unsigned long) start) + printf ("%lx%8.8lx ", (unsigned long) (start >> 32), + (unsigned long) (start & 0xffffffff)); + else #endif - printf ("%7lx ", (unsigned long) start); + printf ("%7lx ", (unsigned long) start); break; } @@ -662,49 +678,16 @@ print_strings (const char *filename, FILE *stream, file_ptr address, break; if (! STRING_ISGRAPHIC (c)) { - if (encoding_bytes > 1) - { - /* In case of multibyte encodings rewind using magic buffer. */ - if (magiccount == 0) - { - /* If no magic buffer exists: use memory of c. */ - switch (encoding) - { - default: - break; - case 'b': - c = c & 0xff; - magiccount += 1; - break; - case 'l': - case 'L': - c = c >> 8; - magiccount += (encoding_bytes -1); - break; - case 'B': - c = (( c & 0xff0000) >> 16) | ( c & 0xff00) - | (( c & 0xff) << 16); - magiccount += 3; - break; - } - magic = (char *) &c; - } - else - { - /* If magic buffer exists: rewind. */ - magic = magic - (encoding_bytes -1); - } - address = address - (encoding_bytes -1); - } + unget_part_char (c, &address, &magiccount, &magic); break; } putchar (c); } if (output_separator) - fputs (output_separator, stdout); + fputs (output_separator, stdout); else - putchar ('\n'); + putchar ('\n'); } free (buf); } diff --git a/binutils/testsuite/binutils-all/strings.exp b/binutils/testsuite/binutils-all/strings.exp index c4bbf69181..83bd2113bb 100644 --- a/binutils/testsuite/binutils-all/strings.exp +++ b/binutils/testsuite/binutils-all/strings.exp @@ -4,12 +4,12 @@ # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. -# +# # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. @@ -17,19 +17,13 @@ proc test_multibyte {testfile} { global STRINGS global STRINGSFLAGS - + set testname "strings: decoding little-endian multibyte strings" set got [binutils_run $STRINGS "$STRINGSFLAGS --encoding=l $testfile"] - set want "String1" + set want "String1\nString2" if ![regexp $want $got] then { - fail "$testname [String1]" - return - } - - set want "tring2" - if ![regexp $want $got] then { - fail "$testname [tring2]" + fail "$testname" return } @@ -37,5 +31,3 @@ proc test_multibyte {testfile} { } test_multibyte $srcdir/$subdir/strings-1.bin - - -- 2.34.1