/* strings -- print the strings of printable characters in files
Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
- 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+ 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012
+ 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
-h Print the usage message on the standard output.
--version
+ -V
-v Print the program version number.
Written by Richard Stallman <rms@gnu.ai.mit.edu>
#include "getopt.h"
#include "libiberty.h"
#include "safe-ctype.h"
-#include <sys/stat.h>
#include "bucomm.h"
#define STRING_ISGRAPHIC(c) \
/* 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
-#ifdef HAVE_STAT64
-typedef struct stat64 statbuf;
-#define file_stat(f,s) stat64(f, s)
-#else
-typedef struct stat statbuf;
-#define file_stat(f,s) stat(f, s)
-#endif
-
/* Radix for printing addresses (must be 8, 10 or 16). */
static int address_radix;
static void strings_a_section (bfd *, asection *, void *);
static bfd_boolean strings_object_file (const char *);
static bfd_boolean strings_file (char *file);
-static void print_strings (const char *, FILE *, file_off, int, int, char *);
+static void print_strings (const char *, FILE *, file_ptr, int, int, char *);
static void usage (FILE *, int);
-static long get_char (FILE *, file_off *, int *, char **);
+static long get_char (FILE *, file_ptr *, int *, char **);
\f
int main (int, char **);
int exit_status = 0;
bfd_boolean files_given = FALSE;
char *s;
+ int numeric_opt = 0;
#if defined (HAVE_SETLOCALE)
setlocale (LC_ALL, "");
usage (stderr, 1);
default:
- string_min = (int) strtoul (argv[optind - 1] + 1, &s, 0);
- if (s != NULL && *s != 0)
- fatal (_("invalid integer argument %s"), argv[optind - 1] + 1);
+ numeric_opt = optind;
break;
}
}
+ if (numeric_opt != 0)
+ {
+ string_min = (int) strtoul (argv[numeric_opt - 1] + 1, &s, 0);
+ if (s != NULL && *s != 0)
+ fatal (_("invalid integer argument %s"), argv[numeric_opt - 1] + 1);
+ }
if (string_min < 1)
fatal (_("invalid minimum string length %d"), string_min);
got_a_section = TRUE;
print_strings (filename_and_sizep->filename, NULL, sect->filepos,
- 0, sectsize, mem);
+ 0, sectsize, (char *) mem);
}
free (mem);
static bfd_boolean
strings_file (char *file)
{
- statbuf st;
+ struct stat st;
+
+ /* get_file_size does not support non-S_ISREG files. */
- if (file_stat (file, &st) < 0)
+ if (stat (file, &st) < 0)
{
if (errno == ENOENT)
non_fatal (_("'%s': No such file"), file);
{
FILE *stream;
- stream = file_open (file, FOPEN_RB);
+ stream = fopen (file, FOPEN_RB);
if (stream == NULL)
{
fprintf (stderr, "%s: ", program_name);
return FALSE;
}
- print_strings (file, stream, (file_off) 0, 0, 0, (char *) 0);
+ print_strings (file, stream, (file_ptr) 0, 0, 0, (char *) 0);
if (fclose (stream) == EOF)
{
MAGICCOUNT is how many characters are in it. */
static long
-get_char (FILE *stream, file_off *address, int *magiccount, char **magic)
+get_char (FILE *stream, file_ptr *address, int *magiccount, char **magic)
{
int c, i;
long r = EOF;
Those characters come at address ADDRESS and the data in STREAM follow. */
static void
-print_strings (const char *filename, FILE *stream, file_off address,
+print_strings (const char *filename, FILE *stream, file_ptr address,
int stop_point, int magiccount, char *magic)
{
char *buf = (char *) xmalloc (sizeof (char) * (string_min + 1));
while (1)
{
- file_off start;
+ file_ptr start;
int i;
long c;
{
c = get_char (stream, &address, &magiccount, &magic);
if (c == EOF)
- return;
+ {
+ free (buf);
+ return;
+ }
if (! STRING_ISGRAPHIC (c))
/* Found a non-graphic. Try again starting with next char. */
goto tryline;
putchar ('\n');
}
+ free (buf);
}
\f
static void
s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit\n\
@<file> Read options from <file>\n\
-h --help Display this information\n\
- -v --version Print the program's version number\n"));
+ -v -V --version Print the program's version number\n"));
list_supported_targets (program_name, stream);
if (REPORT_BUGS_TO[0] && status == 0)
fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);