|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980, 1987 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that: (1) source distributions retain this entire copyright ! 7: * notice and comment, and (2) distributions including binaries display ! 8: * the following acknowledgement: ``This product includes software ! 9: * developed by the University of California, Berkeley and its contributors'' ! 10: * in the documentation or other materials provided with the distribution ! 11: * and in all advertising materials mentioning features or use of this ! 12: * software. Neither the name of the University nor the names of its ! 13: * contributors may be used to endorse or promote products derived ! 14: * from this software without specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: char copyright[] = ! 22: "@(#) Copyright (c) 1980, 1987 The Regents of the University of California.\n\ ! 23: All rights reserved.\n"; ! 24: #endif /* not lint */ ! 25: ! 26: #ifndef lint ! 27: static char sccsid[] = "@(#)strings.c 5.6 (Berkeley) 6/1/90"; ! 28: #endif /* not lint */ ! 29: ! 30: #include <sys/types.h> ! 31: #include <sys/file.h> ! 32: #include <a.out.h> ! 33: #include <stdio.h> ! 34: #include <ctype.h> ! 35: ! 36: #define DEF_LEN 4 /* default minimum string length */ ! 37: #define ISSTR(ch) (isascii(ch) && (isprint(ch) || ch == '\t')) ! 38: ! 39: typedef struct exec EXEC; /* struct exec cast */ ! 40: ! 41: static long foff; /* offset in the file */ ! 42: static int hcnt, /* head count */ ! 43: head_len, /* length of header */ ! 44: read_len; /* length to read */ ! 45: static u_char hbfr[sizeof(EXEC)]; /* buffer for struct exec */ ! 46: ! 47: main(argc, argv) ! 48: int argc; ! 49: char **argv; ! 50: { ! 51: extern char *optarg; ! 52: extern int optind; ! 53: register int ch, cnt; ! 54: register u_char *C; ! 55: EXEC *head; ! 56: int minlen; ! 57: short asdata, oflg; ! 58: u_char *bfr; ! 59: char *file, *p, *malloc(); ! 60: ! 61: /* ! 62: * for backward compatibility, allow '-' to specify 'a' flag; no ! 63: * longer documented in the man page or usage string. ! 64: */ ! 65: asdata = oflg = 0; ! 66: minlen = -1; ! 67: while ((ch = getopt(argc, argv, "-0123456789ao")) != EOF) ! 68: switch((char)ch) { ! 69: case '0': case '1': case '2': case '3': case '4': ! 70: case '5': case '6': case '7': case '8': case '9': ! 71: /* ! 72: * kludge: strings was originally designed to take ! 73: * a number after a dash. ! 74: */ ! 75: if (minlen == -1) { ! 76: p = argv[optind - 1]; ! 77: if (p[0] == '-' && p[1] == ch && !p[2]) ! 78: minlen = atoi(++p); ! 79: else ! 80: minlen = atoi(argv[optind] + 1); ! 81: } ! 82: break; ! 83: case '-': ! 84: case 'a': ! 85: asdata = 1; ! 86: break; ! 87: case 'o': ! 88: oflg = 1; ! 89: break; ! 90: case '?': ! 91: default: ! 92: fprintf(stderr, ! 93: "usage: strings [-ao] [-#] [file ... ]\n"); ! 94: exit(1); ! 95: } ! 96: argc -= optind; ! 97: argv += optind; ! 98: ! 99: if (minlen == -1) ! 100: minlen = DEF_LEN; ! 101: ! 102: if (!(bfr = (u_char *)malloc((u_int)minlen))) { ! 103: fputs("strings: no space.\n", stderr); ! 104: exit(1); ! 105: } ! 106: bfr[minlen] = '\0'; ! 107: file = "stdin"; ! 108: do { ! 109: if (*argv) { ! 110: if (!freopen(*argv, "r", stdin)) { ! 111: perror(*argv); ! 112: exit(1); ! 113: } ! 114: file = *argv++; ! 115: } ! 116: foff = 0; ! 117: read_len = -1; ! 118: if (asdata) ! 119: head_len = 0; ! 120: else { ! 121: head = (EXEC *)hbfr; ! 122: if ((head_len = read(fileno(stdin), (char *)head, sizeof(EXEC))) == -1) { ! 123: perror(file); ! 124: exit(1); ! 125: } ! 126: if (head_len == sizeof(EXEC) && !N_BADMAG(*head)) { ! 127: foff = N_TXTOFF(*head) + head->a_text; ! 128: if (fseek(stdin, foff, L_SET) == -1) { ! 129: perror(file); ! 130: exit(1); ! 131: } ! 132: read_len = head->a_data; ! 133: head_len = 0; ! 134: } ! 135: else ! 136: hcnt = 0; ! 137: } ! 138: for (cnt = 0; (ch = getch()) != EOF;) { ! 139: if (ISSTR(ch)) { ! 140: if (!cnt) ! 141: C = bfr; ! 142: *C++ = ch; ! 143: if (++cnt < minlen) ! 144: continue; ! 145: if (oflg) ! 146: printf("%07ld %s", foff - minlen, ! 147: (char *)bfr); ! 148: else ! 149: fputs((char *)bfr, stdout); ! 150: while ((ch = getch()) != EOF && ISSTR(ch)) ! 151: putchar((char)ch); ! 152: putchar('\n'); ! 153: } ! 154: cnt = 0; ! 155: } ! 156: } while (*argv); ! 157: exit(0); ! 158: } ! 159: ! 160: /* ! 161: * getch -- ! 162: * get next character from wherever ! 163: */ ! 164: getch() ! 165: { ! 166: ++foff; ! 167: if (head_len) { ! 168: if (hcnt < head_len) ! 169: return((int)hbfr[hcnt++]); ! 170: head_len = 0; ! 171: } ! 172: if (read_len == -1 || read_len-- > 0) ! 173: return(getchar()); ! 174: return(EOF); ! 175: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.