13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include <bio.h> 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier Biobuf *fin; 63e12c5d1SDavid du Colombier Biobuf fout; 73e12c5d1SDavid du Colombier 83e12c5d1SDavid du Colombier #define MINSPAN 6 /* Min characters in string */ 93e12c5d1SDavid du Colombier 103e12c5d1SDavid du Colombier #define BUFSIZE 70 113e12c5d1SDavid du Colombier 123e12c5d1SDavid du Colombier void stringit(char *); 133e12c5d1SDavid du Colombier int isprint(Rune); 143e12c5d1SDavid du Colombier 153e12c5d1SDavid du Colombier void 163e12c5d1SDavid du Colombier main(int argc, char **argv) 173e12c5d1SDavid du Colombier { 183e12c5d1SDavid du Colombier int i; 193e12c5d1SDavid du Colombier 203e12c5d1SDavid du Colombier Binit(&fout, 1, OWRITE); 213e12c5d1SDavid du Colombier if(argc < 2) { 223e12c5d1SDavid du Colombier stringit("/fd/0"); 233e12c5d1SDavid du Colombier exits(0); 243e12c5d1SDavid du Colombier } 253e12c5d1SDavid du Colombier 263e12c5d1SDavid du Colombier for(i = 1; i < argc; i++) { 273e12c5d1SDavid du Colombier if(argc > 2) 283e12c5d1SDavid du Colombier print("%s:\n", argv[i]); 293e12c5d1SDavid du Colombier 303e12c5d1SDavid du Colombier stringit(argv[i]); 313e12c5d1SDavid du Colombier } 323e12c5d1SDavid du Colombier 333e12c5d1SDavid du Colombier exits(0); 343e12c5d1SDavid du Colombier } 353e12c5d1SDavid du Colombier 363e12c5d1SDavid du Colombier void 373e12c5d1SDavid du Colombier stringit(char *str) 383e12c5d1SDavid du Colombier { 393e12c5d1SDavid du Colombier long posn, start; 403e12c5d1SDavid du Colombier int cnt = 0; 413e12c5d1SDavid du Colombier long c; 423e12c5d1SDavid du Colombier 433e12c5d1SDavid du Colombier Rune buf[BUFSIZE]; 443e12c5d1SDavid du Colombier 453e12c5d1SDavid du Colombier if ((fin = Bopen(str, OREAD)) == 0) { 463e12c5d1SDavid du Colombier perror("open"); 473e12c5d1SDavid du Colombier return; 483e12c5d1SDavid du Colombier } 493e12c5d1SDavid du Colombier 503e12c5d1SDavid du Colombier start = 0; 51*219b2ee8SDavid du Colombier posn = BOFFSET(fin); 52*219b2ee8SDavid du Colombier while((c = Bgetrune(fin)) >= 0) { 533e12c5d1SDavid du Colombier if(isprint(c)) { 543e12c5d1SDavid du Colombier if(start == 0) 553e12c5d1SDavid du Colombier start = posn; 563e12c5d1SDavid du Colombier buf[cnt++] = c; 573e12c5d1SDavid du Colombier if(cnt == BUFSIZE-1) { 58*219b2ee8SDavid du Colombier buf[cnt] = 0; 593e12c5d1SDavid du Colombier Bprint(&fout, "%8d: %S ...\n", start, buf); 603e12c5d1SDavid du Colombier start = 0; 613e12c5d1SDavid du Colombier cnt = 0; 623e12c5d1SDavid du Colombier } 63*219b2ee8SDavid du Colombier } else { 64*219b2ee8SDavid du Colombier if(cnt >= MINSPAN) { 653e12c5d1SDavid du Colombier buf[cnt] = 0; 663e12c5d1SDavid du Colombier Bprint(&fout, "%8d: %S\n", start, buf); 673e12c5d1SDavid du Colombier } 683e12c5d1SDavid du Colombier start = 0; 693e12c5d1SDavid du Colombier cnt = 0; 703e12c5d1SDavid du Colombier } 71*219b2ee8SDavid du Colombier posn = BOFFSET(fin); 723e12c5d1SDavid du Colombier } 733e12c5d1SDavid du Colombier 74*219b2ee8SDavid du Colombier if(cnt >= MINSPAN){ 753e12c5d1SDavid du Colombier buf[cnt] = 0; 763e12c5d1SDavid du Colombier Bprint(&fout, "%8d: %S\n", start, buf); 773e12c5d1SDavid du Colombier } 78*219b2ee8SDavid du Colombier Bterm(fin); 793e12c5d1SDavid du Colombier } 803e12c5d1SDavid du Colombier 813e12c5d1SDavid du Colombier int 823e12c5d1SDavid du Colombier isprint(Rune r) 833e12c5d1SDavid du Colombier { 843e12c5d1SDavid du Colombier if ((r >= ' ' && r <0x7f) || r > 0xA0) 853e12c5d1SDavid du Colombier return 1; 863e12c5d1SDavid du Colombier else 873e12c5d1SDavid du Colombier return 0; 883e12c5d1SDavid du Colombier } 89