|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <a.out.h> ! 3: #include <ctype.h> ! 4: ! 5: long ftell(); ! 6: ! 7: /* ! 8: * Strings - extract strings from an object file for whatever ! 9: * ! 10: * Bill Joy UCB ! 11: * April 22, 1978 ! 12: * ! 13: * The algorithm is to look for sequences of "non-junk" characters ! 14: * The variable "minlen" is the minimum length string printed. ! 15: * This helps get rid of garbage. ! 16: * Default minimum string length is 4 characters. ! 17: */ ! 18: ! 19: struct exec header; ! 20: ! 21: char *infile = "Standard input"; ! 22: int oflg; ! 23: int asdata; ! 24: long offset; ! 25: int minlength = 4; ! 26: ! 27: main(argc, argv) ! 28: int argc; ! 29: char *argv[]; ! 30: { ! 31: ! 32: argc--, argv++; ! 33: while (argc > 0 && argv[0][0] == '-') { ! 34: register int i; ! 35: if (argv[0][1] == 0) ! 36: asdata++; ! 37: else for (i = 1; argv[0][i] != 0; i++) switch (argv[0][i]) { ! 38: ! 39: case 'o': ! 40: oflg++; ! 41: break; ! 42: ! 43: case 'a': ! 44: asdata++; ! 45: break; ! 46: ! 47: default: ! 48: if (!isdigit(argv[0][i])) { ! 49: fprintf(stderr, "Usage: strings [ - ] [ -o ] [ -# ] [ file ... ]\n"); ! 50: exit(1); ! 51: } ! 52: minlength = argv[0][i] - '0'; ! 53: for (i++; isdigit(argv[0][i]); i++) ! 54: minlength = minlength * 10 + argv[0][i] - '0'; ! 55: i--; ! 56: break; ! 57: } ! 58: argc--, argv++; ! 59: } ! 60: do { ! 61: if (argc > 0) { ! 62: if (freopen(argv[0], "r", stdin) == NULL) { ! 63: perror(argv[0]); ! 64: exit(1); ! 65: } ! 66: infile = argv[0]; ! 67: argc--, argv++; ! 68: } ! 69: fseek(stdin, (long) 0, 0); ! 70: if (asdata || ! 71: fread((char *)&header, sizeof header, 1, stdin) != 1 || ! 72: !ismagic(header.a_magic)) { ! 73: fseek(stdin, (long) 0, 0); ! 74: find((long) 100000000L); ! 75: continue; ! 76: } ! 77: fseek(stdin, (long) header.a_text, 1); ! 78: find((long) header.a_data); ! 79: } while (argc > 0); ! 80: } ! 81: ! 82: find(cnt) ! 83: long cnt; ! 84: { ! 85: static char buf[BUFSIZ]; ! 86: register char *cp; ! 87: register int c, cc; ! 88: ! 89: cp = buf, cc = 0; ! 90: for (; cnt != 0; cnt--) { ! 91: c = getc(stdin); ! 92: if (c == '\n' || dirt(c) || cnt == 0) { ! 93: if (cp > buf && cp[-1] == '\n') ! 94: --cp; ! 95: *cp++ = 0; ! 96: if (cp > &buf[minlength]) { ! 97: if (oflg) ! 98: printf("%7D ", ftell(stdin) - cc - 1); ! 99: printf("%s\n", buf); ! 100: } ! 101: cp = buf, cc = 0; ! 102: } else { ! 103: if (cp < &buf[sizeof buf - 2]) ! 104: *cp++ = c; ! 105: cc++; ! 106: } ! 107: if (ferror(stdin) || feof(stdin)) ! 108: break; ! 109: } ! 110: } ! 111: ! 112: dirt(c) ! 113: int c; ! 114: { ! 115: ! 116: switch (c) { ! 117: ! 118: case '\n': ! 119: case '\f': ! 120: return (0); ! 121: ! 122: case 0177: ! 123: return (1); ! 124: ! 125: default: ! 126: return (c > 0200 || c < ' '); ! 127: } ! 128: } ! 129: ! 130: ismagic(a) ! 131: int a; ! 132: { ! 133: ! 134: switch (a) { ! 135: ! 136: case A_MAGIC1: ! 137: case A_MAGIC2: ! 138: case A_MAGIC3: ! 139: case A_MAGIC4: ! 140: return (1); ! 141: } ! 142: return (0); ! 143: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.