140 lines
2.4 KiB
C
140 lines
2.4 KiB
C
/*
|
|
* Copyright (c) 1980 Regents of the University of California.
|
|
* All rights reserved. The Berkeley software License Agreement
|
|
* specifies the terms and conditions for redistribution.
|
|
*/
|
|
|
|
#ifndef lint
|
|
char copyright[] =
|
|
"@(#) Copyright (c) 1980 Regents of the University of California.\n\
|
|
All rights reserved.\n";
|
|
#endif not lint
|
|
|
|
#ifndef lint
|
|
static char sccsid[] = "@(#)strings.c 1.1 94/10/31 SMI"; /* from UCB 5.1 5/31/85 */
|
|
#endif not lint
|
|
|
|
#include <stdio.h>
|
|
#include <a.out.h>
|
|
#include <ctype.h>
|
|
#include <sys/file.h>
|
|
|
|
long ftell();
|
|
|
|
/*
|
|
* strings
|
|
*/
|
|
|
|
struct exec header;
|
|
|
|
char *infile = "Standard input";
|
|
int oflg;
|
|
int asdata;
|
|
long offset;
|
|
int minlength = 4;
|
|
|
|
main(argc, argv)
|
|
int argc;
|
|
char *argv[];
|
|
{
|
|
|
|
argc--, argv++;
|
|
while (argc > 0 && argv[0][0] == '-') {
|
|
register int i;
|
|
if (argv[0][1] == 0)
|
|
asdata++;
|
|
else for (i = 1; argv[0][i] != 0; i++) switch (argv[0][i]) {
|
|
|
|
case 'o':
|
|
oflg++;
|
|
break;
|
|
|
|
case 'a':
|
|
asdata++;
|
|
break;
|
|
|
|
default:
|
|
if (!isdigit(argv[0][i])) {
|
|
fprintf(stderr, "Usage: strings [ -a ] [ -o ] [ -# ] [ file ... ]\n");
|
|
exit(1);
|
|
}
|
|
minlength = argv[0][i] - '0';
|
|
for (i++; isdigit(argv[0][i]); i++)
|
|
minlength = minlength * 10 + argv[0][i] - '0';
|
|
i--;
|
|
break;
|
|
}
|
|
argc--, argv++;
|
|
}
|
|
do {
|
|
if (argc > 0) {
|
|
if (freopen(argv[0], "r", stdin) == NULL) {
|
|
perror(argv[0]);
|
|
exit(1);
|
|
}
|
|
infile = argv[0];
|
|
argc--, argv++;
|
|
}
|
|
fseek(stdin, (long) 0, L_SET);
|
|
if (asdata ||
|
|
fread((char *)&header, sizeof header, 1, stdin) != 1 ||
|
|
N_BADMAG(header)) {
|
|
fseek(stdin, (long) 0, L_SET);
|
|
find((long) 100000000L);
|
|
continue;
|
|
}
|
|
fseek(stdin, (long) N_DATOFF(header), L_SET);
|
|
find((long) header.a_data);
|
|
} while (argc > 0);
|
|
exit(0);
|
|
/* NOTREACHED */
|
|
}
|
|
|
|
find(cnt)
|
|
long cnt;
|
|
{
|
|
static char buf[BUFSIZ];
|
|
register char *cp;
|
|
register int c, cc;
|
|
|
|
cp = buf, cc = 0;
|
|
for (; cnt != 0; cnt--) {
|
|
c = getc(stdin);
|
|
if (c == '\n' || dirt(c) || cnt == 0) {
|
|
if (cp > buf && cp[-1] == '\n')
|
|
--cp;
|
|
*cp++ = 0;
|
|
if (cp > &buf[minlength]) {
|
|
if (oflg)
|
|
printf("%7D ", ftell(stdin) - cc - 1);
|
|
printf("%s\n", buf);
|
|
}
|
|
cp = buf, cc = 0;
|
|
} else {
|
|
if (cp < &buf[sizeof buf - 2])
|
|
*cp++ = c;
|
|
cc++;
|
|
}
|
|
if (ferror(stdin) || feof(stdin))
|
|
break;
|
|
}
|
|
}
|
|
|
|
dirt(c)
|
|
int c;
|
|
{
|
|
|
|
switch (c) {
|
|
|
|
case '\n':
|
|
case '\f':
|
|
return (0);
|
|
|
|
case 0177:
|
|
return (1);
|
|
|
|
default:
|
|
return (c > 0200 || c < ' ');
|
|
}
|
|
}
|