* Copyright (c) 1980, 1987 The Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. 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 BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
"@(#) Copyright (c) 1980, 1987 The Regents of the University of California.\n\
static char sccsid
[] = "@(#)strings.c 5.10 (Berkeley) 5/23/91";
#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 */
short asdata
, oflg
, fflg
;
* for backward compatibility, allow '-' to specify 'a' flag; no
* longer documented in the man page or usage string.
asdata
= exitcode
= fflg
= oflg
= 0;
while ((ch
= getopt(argc
, argv
, "-0123456789anof")) != 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);
if (!(bfr
= malloc((u_int
)minlen
))) {
(void)fprintf(stderr
, "strings: %s\n", strerror(errno
));
if (!freopen(file
, "r", stdin
)) {
"strings; %s: %s\n", file
, strerror(errno
));
#define DO_EVERYTHING() {read_len = -1; head_len = 0; goto start;}
read(fileno(stdin
), head
, sizeof(EXEC
))) == -1)
if (head_len
== sizeof(EXEC
) && !N_BADMAG(*head
)) {
if (fseek(stdin
, foff
, SEEK_SET
) == -1)
read_len
= head
->a_text
+ head
->a_data
;
for (cnt
= 0; (ch
= getch()) != EOF
;) {
foff
- minlen
, (char *)bfr
);
while ((ch
= getch()) != EOF
&& ISSTR(ch
))
* get next character from wherever
return((int)hbfr
[hcnt
++]);
if (read_len
== -1 || read_len
-- > 0)
"usage: strings [-afo] [-n length] [file ... ]\n");