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