* Copyright (c) 1980, 1987 The Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that: (1) source distributions retain this entire copyright
* notice and comment, and (2) distributions including binaries display
* the following acknowledgement: ``This product includes software
* developed by the University of California, Berkeley and its contributors''
* in the documentation or other materials provided with the distribution
* and in all advertising materials mentioning features or use of this
* software. Neither the name of the University nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
"@(#) Copyright (c) 1980, 1987 The Regents of the University of California.\n\
static char sccsid
[] = "@(#)strings.c 5.6 (Berkeley) 6/1/90";
#define DEF_LEN 4 /* default minimum string length */
#define ISSTR(ch) (isascii(ch) && (isprint(ch) || ch == '\t'))
typedef struct exec EXEC
; /* struct exec cast */
static long foff
; /* offset in the file */
static int hcnt
, /* head count */
head_len
, /* length of header */
read_len
; /* length to read */
static u_char hbfr
[sizeof(EXEC
)]; /* buffer for struct exec */
char *file
, *p
, *malloc();
* for backward compatibility, allow '-' to specify 'a' flag; no
* longer documented in the man page or usage string.
while ((ch
= getopt(argc
, argv
, "-0123456789ao")) != EOF
)
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
* kludge: strings was originally designed to take
if (p
[0] == '-' && p
[1] == ch
&& !p
[2])
minlen
= atoi(argv
[optind
] + 1);
"usage: strings [-ao] [-#] [file ... ]\n");
if (!(bfr
= (u_char
*)malloc((u_int
)minlen
))) {
fputs("strings: no space.\n", stderr
);
if (!freopen(*argv
, "r", stdin
)) {
if ((head_len
= read(fileno(stdin
), (char *)head
, sizeof(EXEC
))) == -1) {
if (head_len
== sizeof(EXEC
) && !N_BADMAG(*head
)) {
foff
= N_TXTOFF(*head
) + head
->a_text
;
if (fseek(stdin
, foff
, L_SET
) == -1) {
for (cnt
= 0; (ch
= getch()) != EOF
;) {
printf("%07ld %s", foff
- minlen
,
fputs((char *)bfr
, stdout
);
while ((ch
= getch()) != EOF
&& ISSTR(ch
))
* get next character from wherever
return((int)hbfr
[hcnt
++]);
if (read_len
== -1 || read_len
-- > 0)