/* strings.c -- find ascii sequences on binary data */ /* $Id$ */ /* Carlos Duarte , 980722/990314 */ #include #include #include #include #define ARG() \ s[1] ? (t=s+1, s+=strlen(s)-1, t) : ++i =32 && (c)<127) int strings(char *fn) { FILE *f; int state=1; int c; char *seq = 0; f = stdin; if (fn && (f = fopen(fn, "r")) == NULL) return -1; if (!fn) fn = "standard input"; while ((c = getc(f)) != EOF) { redo: switch (state) { case 0: /* searching for ascii */ if (VALID(c)) { state=1; seq = seq_hold; goto redo; } break; case 1: /* holding sequence */ if (VALID(c)) { *seq++ = c; if (seq-seq_hold >= opts.minlen) { *seq++ = 0; if (opts.pr_fn) printf("%s: ", fn); printf("%s", seq_hold); state = 2; } } else state = 0; break; case 2: /* write sequences */ if (VALID(c)) { putchar(c); } else { putchar('\n'); state = 0; } break; } } if (state == 2) putchar('\n'); if (f != stdin) fclose(f); return 0; } int main(int argc, char *argv[]) { int i; opts.minlen = 4; for (i=1; i