/* 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, 2009
+ 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
#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 **);
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;
- unsigned char buf[4];
+ long r = 0;
for (i = 0; i < encoding_bytes; i++)
{
}
(*address)++;
- buf[i] = c;
+ r = (r << 8) | (c & 0xff);
}
switch (encoding)
{
- case 'S':
- case 's':
- r = buf[0];
- break;
- case 'b':
- r = (buf[0] << 8) | buf[1];
+ default:
break;
case 'l':
- r = buf[0] | (buf[1] << 8);
- break;
- case 'B':
- r = ((long) buf[0] << 24) | ((long) buf[1] << 16) |
- ((long) buf[2] << 8) | buf[3];
+ r = ((r & 0xff) << 8) | ((r & 0xff00) >> 8);
break;
case 'L':
- r = buf[0] | ((long) buf[1] << 8) | ((long) buf[2] << 16) |
- ((long) buf[3] << 24);
+ r = (((r & 0xff) << 24) | ((r & 0xff00) << 8)
+ | ((r & 0xff0000) >> 8) | ((r & 0xff000000) >> 24));
break;
}
- if (r == EOF)
- return 0;
-
return r;
}
\f
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