/* * Copyright (c) 1980 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ #if defined(DOSCCS) && !defined(lint) char copyright[] = "@(#) Copyright (c) 1980 Regents of the University of California.\n\ All rights reserved.\n"; static char sccsid[] = "@(#)strings.c 5.1.2 (2.11BSD GTE) 2/25/94"; #endif #include #include #include #include #include /* * strings */ struct xexec 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.e)) { fseek(stdin, (long) 0, L_SET); find((long) 100000000L); continue; } fseek(stdin, (long) N_DATOFF(header), L_SET); find((long) header.e.a_data); } while (argc > 0); } 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("%ld ", 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 < ' '); } }