|
|
1.1 ! root 1: static char *sccsid = "@(#)strings.c 4.1 (Berkeley) 10/1/80"; ! 2: #include <stdio.h> ! 3: #include <a.out.h> ! 4: #include <ctype.h> ! 5: ! 6: long ftell(); ! 7: ! 8: /* ! 9: * strings ! 10: */ ! 11: ! 12: struct exec header; ! 13: ! 14: char *infile = "Standard input"; ! 15: int oflg; ! 16: int asdata; ! 17: long offset; ! 18: int minlength = 4; ! 19: ! 20: main(argc, argv) ! 21: int argc; ! 22: char *argv[]; ! 23: { ! 24: ! 25: argc--, argv++; ! 26: while (argc > 0 && argv[0][0] == '-') { ! 27: register int i; ! 28: if (argv[0][1] == 0) ! 29: asdata++; ! 30: else for (i = 1; argv[0][i] != 0; i++) switch (argv[0][i]) { ! 31: ! 32: case 'o': ! 33: oflg++; ! 34: break; ! 35: ! 36: case 'a': ! 37: asdata++; ! 38: break; ! 39: ! 40: default: ! 41: if (!isdigit(argv[0][i])) { ! 42: fprintf(stderr, "Usage: strings [ -a ] [ -o ] [ -# ] [ file ... ]\n"); ! 43: exit(1); ! 44: } ! 45: minlength = argv[0][i] - '0'; ! 46: for (i++; isdigit(argv[0][i]); i++) ! 47: minlength = minlength * 10 + argv[0][i] - '0'; ! 48: i--; ! 49: break; ! 50: } ! 51: argc--, argv++; ! 52: } ! 53: do { ! 54: if (argc > 0) { ! 55: if (freopen(argv[0], "r", stdin) == NULL) { ! 56: perror(argv[0]); ! 57: exit(1); ! 58: } ! 59: infile = argv[0]; ! 60: argc--, argv++; ! 61: } ! 62: fseek(stdin, (long) 0, 0); ! 63: if (asdata || ! 64: fread((char *)&header, sizeof header, 1, stdin) != 1 || ! 65: N_BADMAG(header)) { ! 66: fseek(stdin, (long) 0, 0); ! 67: find((long) 100000000L); ! 68: continue; ! 69: } ! 70: fseek(stdin, (long) N_TXTOFF(header)+header.a_text, 1); ! 71: find((long) header.a_data); ! 72: } while (argc > 0); ! 73: } ! 74: ! 75: find(cnt) ! 76: long cnt; ! 77: { ! 78: static char buf[BUFSIZ]; ! 79: register char *cp; ! 80: register int c, cc; ! 81: ! 82: cp = buf, cc = 0; ! 83: for (; cnt != 0; cnt--) { ! 84: c = getc(stdin); ! 85: if (c == '\n' || dirt(c) || cnt == 0) { ! 86: if (cp > buf && cp[-1] == '\n') ! 87: --cp; ! 88: *cp++ = 0; ! 89: if (cp > &buf[minlength]) { ! 90: if (oflg) ! 91: printf("%7D ", ftell(stdin) - cc - 1); ! 92: printf("%s\n", buf); ! 93: } ! 94: cp = buf, cc = 0; ! 95: } else { ! 96: if (cp < &buf[sizeof buf - 2]) ! 97: *cp++ = c; ! 98: cc++; ! 99: } ! 100: if (ferror(stdin) || feof(stdin)) ! 101: break; ! 102: } ! 103: } ! 104: ! 105: dirt(c) ! 106: int c; ! 107: { ! 108: ! 109: switch (c) { ! 110: ! 111: case '\n': ! 112: case '\f': ! 113: return (0); ! 114: ! 115: case 0177: ! 116: return (1); ! 117: ! 118: default: ! 119: return (c > 0200 || c < ' '); ! 120: } ! 121: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.