/* output each sequence of non-whitespace characters on a separate line preceded by a tab. Think of this as a finite state machine with two states: inword and !inword Mark A. Sheldon, Spring 2005 */ #include #include #include #define TRUE 1 #define FALSE 0 #define isdelimiter(c) !isalnum((c)) void parse_stream(FILE *in) { int c, inword = FALSE; while ((c = getc(in)) != EOF) { if (inword) { if (isdelimiter(c)) { inword = FALSE; putchar('\n'); } else putchar(c); } else { if (!isdelimiter(c)) { inword = TRUE; printf("\t%c", c); } } } } int main(int argc, char *argv[]) { char *prog = argv[0]; FILE *in; if (argc < 2) { fprintf(stderr, "Usage: %s -f\n %s file1,...\n", argv[0], argv[0]); return 1; } if (strncmp(argv[1], "-f", 2) == 0) { if ( (strlen(argv[1]) != 2) || (argc != 2) ) { fprintf(stderr, "Usage: %s -f\n%s file1,...\n", argv[0]); return 1; } /* FILTER MODE */ parse_stream(stdin); return 0; } /* FILE MODE */ /* skip to first file name */ argv++; for (; argv != NULL; argv++) { in = fopen(*argv, "r"); if (in == NULL) { perror(prog); return errno; } printf("%s\n", *argv); parse_stream(in); } }