daily update
[deliverable/binutils-gdb.git] / binutils / strings.c
index a04cb581eaeafc556471064f82b87240bf154828..40b53b8fed5cde5f6b1994cc19267a0140feef35 100644 (file)
@@ -1,10 +1,10 @@
 /* strings -- print the strings of printable characters in files
    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-   2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
+   the Free Software Foundation; either version 3, or (at your option)
    any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -46,6 +46,7 @@
                littleendian 32-bit.
 
    --target=BFDNAME
+   -T {bfdname}
                Specify a non-default object file format.
 
    --help
    Written by Richard Stallman <rms@gnu.ai.mit.edu>
    and David MacKenzie <djm@gnu.ai.mit.edu>.  */
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include "sysdep.h"
 #include "bfd.h"
-#include <stdio.h>
 #include "getopt.h"
-#include <errno.h>
-#include "bucomm.h"
 #include "libiberty.h"
 #include "safe-ctype.h"
 #include <sys/stat.h>
+#include "bucomm.h"
 
 /* Some platforms need to put stdin into binary mode, to read
     binary files.  */
@@ -163,7 +160,6 @@ typedef struct
 static void strings_a_section (bfd *, asection *, void *);
 static bfd_boolean strings_object_file (const char *);
 static bfd_boolean strings_file (char *file);
-static int integer_arg (char *s);
 static void print_strings (const char *, FILE *, file_off, int, int, char *);
 static void usage (FILE *, int);
 static long get_char (FILE *, file_off *, int *, char **);
@@ -188,14 +184,14 @@ main (int argc, char **argv)
 
   expandargv (&argc, &argv);
 
-  string_min = -1;
+  string_min = 4;
   print_addresses = FALSE;
   print_filenames = FALSE;
   datasection_only = TRUE;
   target = NULL;
   encoding = 's';
 
-  while ((optc = getopt_long (argc, argv, "afhHn:ot:e:Vv0123456789",
+  while ((optc = getopt_long (argc, argv, "afhHn:ot:e:T:Vv0123456789",
                              long_options, (int *) 0)) != EOF)
     {
       switch (optc)
@@ -213,9 +209,7 @@ main (int argc, char **argv)
          usage (stdout, 0);
 
        case 'n':
-         string_min = integer_arg (optarg);
-         if (string_min < 1)
-           fatal (_("invalid number %s"), optarg);
+         string_min = (int) strtoul (optarg, NULL, 0);
          break;
 
        case 'o':
@@ -265,16 +259,13 @@ main (int argc, char **argv)
          usage (stderr, 1);
 
        default:
-         if (string_min < 0)
-           string_min = optc - '0';
-         else
-           string_min = string_min * 10 + optc - '0';
+         string_min = (int) strtoul (argv[optind - 1] + 1, NULL, 0);
          break;
        }
     }
 
-  if (string_min < 0)
-    string_min = 4;
+  if (string_min < 1)
+    fatal (_("invalid minimum string length %d"), string_min);
 
   switch (encoding)
     {
@@ -596,14 +587,18 @@ print_strings (const char *filename, FILE *stream, file_off address,
          case 8:
 #if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
            if (sizeof (start) > sizeof (long))
-             printf ("%7Lo ", (unsigned long long) start);
-           else
+             {
+#ifndef __MSVCRT__
+               printf ("%7llo ", (unsigned long long) start);
 #else
-# if !BFD_HOST_64BIT_LONG
+               printf ("%7I64o ", (unsigned long long) start);
+#endif
+             }
+           else
+#elif !BFD_HOST_64BIT_LONG
            if (start != (unsigned long) start)
              printf ("++%7lo ", (unsigned long) start);
            else
-# endif
 #endif
              printf ("%7lo ", (unsigned long) start);
            break;
@@ -611,14 +606,18 @@ print_strings (const char *filename, FILE *stream, file_off address,
          case 10:
 #if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
            if (sizeof (start) > sizeof (long))
-             printf ("%7Ld ", (unsigned long long) start);
-           else
+             {
+#ifndef __MSVCRT__
+               printf ("%7lld ", (unsigned long long) start);
 #else
-# if !BFD_HOST_64BIT_LONG
+               printf ("%7I64d ", (unsigned long long) start);
+#endif
+             }
+           else
+#elif !BFD_HOST_64BIT_LONG
            if (start != (unsigned long) start)
              printf ("++%7ld ", (unsigned long) start);
            else
-# endif
 #endif
              printf ("%7ld ", (long) start);
            break;
@@ -626,15 +625,19 @@ print_strings (const char *filename, FILE *stream, file_off address,
          case 16:
 #if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
            if (sizeof (start) > sizeof (long))
-             printf ("%7Lx ", (unsigned long long) start);
-           else
+             {
+#ifndef __MSVCRT__
+               printf ("%7llx ", (unsigned long long) start);
 #else
-# if !BFD_HOST_64BIT_LONG
+               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
-# endif
 #endif
              printf ("%7lx ", (unsigned long) start);
            break;
@@ -657,51 +660,6 @@ print_strings (const char *filename, FILE *stream, file_off address,
     }
 }
 \f
-/* Parse string S as an integer, using decimal radix by default,
-   but allowing octal and hex numbers as in C.  */
-
-static int
-integer_arg (char *s)
-{
-  int value;
-  int radix = 10;
-  char *p = s;
-  int c;
-
-  if (*p != '0')
-    radix = 10;
-  else if (*++p == 'x')
-    {
-      radix = 16;
-      p++;
-    }
-  else
-    radix = 8;
-
-  value = 0;
-  while (((c = *p++) >= '0' && c <= '9')
-        || (radix == 16 && (c & ~40) >= 'A' && (c & ~40) <= 'Z'))
-    {
-      value *= radix;
-      if (c >= '0' && c <= '9')
-       value += c - '0';
-      else
-       value += (c & ~40) - 'A';
-    }
-
-  if (c == 'b')
-    value *= 512;
-  else if (c == 'B')
-    value *= 1024;
-  else
-    p--;
-
-  if (*p)
-    fatal (_("invalid integer argument %s"), s);
-
-  return value;
-}
-
 static void
 usage (FILE *stream, int status)
 {
@@ -711,7 +669,7 @@ usage (FILE *stream, int status)
   -a - --all                Scan the entire file, not just the data section\n\
   -f --print-file-name      Print the name of the file before each string\n\
   -n --bytes=[number]       Locate & print any NUL-terminated sequence of at\n\
-  -<number>                 least [number] characters (default 4).\n\
+  -<number>                   least [number] characters (default 4).\n\
   -t --radix={o,d,x}        Print the location of the string in base 8, 10 or 16\n\
   -o                        An alias for --radix=o\n\
   -T --target=<BFDNAME>     Specify the binary file format\n\
@@ -721,7 +679,7 @@ usage (FILE *stream, int status)
   -h --help                 Display this information\n\
   -v --version              Print the program's version number\n"));
   list_supported_targets (program_name, stream);
-  if (status == 0)
+  if (REPORT_BUGS_TO[0] && status == 0)
     fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
   exit (status);
 }
This page took 0.02523 seconds and 4 git commands to generate.