Fixed changelog entry. Indented m68k-tdep.c
[deliverable/binutils-gdb.git] / binutils / strings.c
index c6cf10ddca63d6956080d717ce1da770ad618476..dade2444182464803aa1cbe2cc90736e9b272f80 100644 (file)
@@ -1,6 +1,6 @@
 /* strings -- print the strings of printable characters in files
-   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-   Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+   2002 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
    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 "bfd.h"
 #include <stdio.h>
-#include <getopt.h>
+#include "getopt.h"
 #include <errno.h>
 #include "bucomm.h"
 #include "libiberty.h"
@@ -90,6 +93,14 @@ extern int errno;
 /* The BFD section flags that identify an initialized data section.  */
 #define DATA_FLAGS (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS)
 
+#ifdef HAVE_FOPEN64
+typedef off64_t file_off;
+#define file_open(s,m) fopen64(s,m)
+#else
+typedef off_t file_off;
+#define file_open(s,m) fopen(s,m)
+#endif
+
 /* Radix for printing addresses (must be 8, 10 or 16).  */
 static int address_radix;
 
@@ -133,10 +144,14 @@ static boolean strings_object_file PARAMS ((const char *));
 static boolean strings_file PARAMS ((char *file));
 static int integer_arg PARAMS ((char *s));
 static void print_strings PARAMS ((const char *filename, FILE *stream,
-                                 file_ptr address, int stop_point,
+                                 file_off address, int stop_point,
                                  int magiccount, char *magic));
 static void usage PARAMS ((FILE *stream, int status));
+static long get_char PARAMS ((FILE *stream, file_off *address,
+                             int *magiccount, char **magic));
 \f
+int main PARAMS ((int, char **));
+
 int
 main (argc, argv)
      int argc;
@@ -161,7 +176,7 @@ main (argc, argv)
   target = NULL;
   encoding = 's';
 
-  while ((optc = getopt_long (argc, argv, "afn:ot:e:v0123456789",
+  while ((optc = getopt_long (argc, argv, "afhHn:ot:e:Vv0123456789",
                              long_options, (int *) 0)) != EOF)
     {
       switch (optc)
@@ -174,6 +189,7 @@ main (argc, argv)
          print_filenames = true;
          break;
 
+       case 'H':
        case 'h':
          usage (stdout, 0);
 
@@ -223,6 +239,7 @@ main (argc, argv)
          encoding = optarg[0];
          break;
 
+       case 'V':
        case 'v':
          print_version ("strings");
          break;
@@ -369,10 +386,7 @@ strings_file (file)
     {
       FILE *stream;
 
-      stream = fopen (file, "rb");
-      /* Not all systems permit "rb", so try "r" if it failed.  */
-      if (stream == NULL)
-       stream = fopen (file, "r");
+      stream = file_open (file, FOPEN_RB);
       if (stream == NULL)
        {
          fprintf (stderr, "%s: ", program_name);
@@ -380,7 +394,7 @@ strings_file (file)
          return false;
        }
 
-      print_strings (file, stream, (file_ptr) 0, 0, 0, (char *) 0);
+      print_strings (file, stream, (file_off) 0, 0, 0, (char *) 0);
 
       if (fclose (stream) == EOF)
        {
@@ -406,12 +420,12 @@ strings_file (file)
 static long
 get_char (stream, address, magiccount, magic)
      FILE *stream;
-     file_ptr *address;
+     file_off *address;
      int *magiccount;
      char **magic;
 {
   int c, i;
-  long r;
+  long r = EOF;
   unsigned char buf[4];
 
   for (i = 0; i < encoding_bytes; i++)
@@ -425,7 +439,11 @@ get_char (stream, address, magiccount, magic)
        {
          if (stream == NULL)
            return EOF;
+#ifdef HAVE_GETC_UNLOCKED
+         c = getc_unlocked (stream);
+#else
          c = getc (stream);
+#endif
          if (c == EOF)
            return EOF;
        }
@@ -477,7 +495,7 @@ static void
 print_strings (filename, stream, address, stop_point, magiccount, magic)
      const char *filename;
      FILE *stream;
-     file_ptr address;
+     file_off address;
      int stop_point;
      int magiccount;
      char *magic;
@@ -486,7 +504,7 @@ print_strings (filename, stream, address, stop_point, magiccount, magic)
 
   while (1)
     {
-      file_ptr start;
+      file_off start;
       int i;
       long c;
 
@@ -515,15 +533,48 @@ print_strings (filename, stream, address, stop_point, magiccount, magic)
        switch (address_radix)
          {
          case 8:
-           printf ("%7lo ", (unsigned long) start);
+#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
+           if (sizeof (start) > sizeof (long))
+             printf ("%7Lo ", (unsigned long long) start);
+           else
+#else
+# if !BFD_HOST_64BIT_LONG
+           if (start != (unsigned long) start)
+             printf ("++%7lo ", (unsigned long) start);
+           else
+# endif
+#endif
+             printf ("%7lo ", (unsigned long) start);
            break;
 
          case 10:
-           printf ("%7ld ", (long) start);
+#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
+           if (sizeof (start) > sizeof (long))
+             printf ("%7Ld ", (unsigned long long) start);
+           else
+#else
+# if !BFD_HOST_64BIT_LONG
+           if (start != (unsigned long) start)
+             printf ("++%7ld ", (unsigned long) start);
+           else
+# endif
+#endif
+             printf ("%7ld ", (long) start);
            break;
 
          case 16:
-           printf ("%7lx ", (unsigned long) start);
+#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
+           if (sizeof (start) > sizeof (long))
+             printf ("%7Lx ", (unsigned long long) start);
+           else
+#else
+# if !BFD_HOST_64BIT_LONG
+           if (start != (unsigned long) start)
+             printf ("%lx%8.8lx ", start >> 32, start & 0xffffffff);
+           else
+# endif
+#endif
+             printf ("%7lx ", (unsigned long) start);
            break;
          }
 
@@ -596,11 +647,20 @@ usage (stream, status)
      FILE *stream;
      int status;
 {
-  fprintf (stream, _("\
-Usage: %s [-afov] [-n min-len] [-min-len] [-t {o,x,d}] [-e {s,b,l,B,L}]\n\
-       [-] [--all] [--print-file-name] [--bytes=min-len] [--radix={o,x,d}]\n\
-       [--target=bfdname] [--encoding {s,b,l,B,L}] [--help] [--version] file...\n"),
-          program_name);
+  fprintf (stream, _("Usage: %s [option(s)] [file(s)]\n"), program_name);
+  fprintf (stream, _(" Display printable strings in [file(s)] (stdin by default)\n"));
+  fprintf (stream, _(" The options are:\n\
+  -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\
+  -t --radix={o,x,d}        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\
+  -e --encoding={s,b,l,B,L} Select character size and endianness:\n\
+                            s = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit\n\
+  -h --help                 Display this information\n\
+  -v --version              Print the program's version number\n"));
   list_supported_targets (program_name, stream);
   if (status == 0)
     fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
This page took 0.026047 seconds and 4 git commands to generate.