/* prep - prepare file for statistics Author: Andy Tanenbaum */ #include #include #include #define TROFF_CHAR '.' /* troff commands begin with this char */ #define EOL '\n' /* end of line char */ #define APOSTROPHE 047 /* single quote */ #define BACKSLASH '\\' /* troff code */ int lfread; /* set when last char read was lf */ int lfwritten = 1; /* set when last char written was lf */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void skipline, (void)); _PROTOTYPE(int backslash, (void)); _PROTOTYPE(void usage, (void)); int main(argc, argv) int argc; char *argv[]; { int c; if (argc > 2) usage(); if (argc == 2) { if (freopen(argv[1], "r", stdin) == NULL) { printf("prep: cannot open %s\n", argv[1]); exit(1); } } while ((c = getchar()) != EOF) { /* Lines beginning with "." are troff commands -- skip them. */ if (lfread && c == TROFF_CHAR) { skipline(); continue; } while (c == BACKSLASH) c = backslash(); /* eat troff stuff */ if (isupper(c)) { putchar(tolower(c)); lfwritten = 0; lfread = 0; continue; } if (islower(c)) { putchar(c); lfwritten = 0; lfread = 0; continue; } if (c == APOSTROPHE) { putchar(c); lfwritten = 0; lfread = 0; continue; } lfread = (c == EOL ? 1 : 0); if (lfwritten) continue; putchar(EOL); lfwritten = 1; } return(0); } void skipline() { char c; while ((c = getchar()) != EOL); } int backslash() { /* A backslash has been seen. Eat troff stuff. */ int c, c1, c2; c = getchar(); switch (c) { case 'f': c = getchar(); c = getchar(); return(c); case 's': /* \s7 or \s14 */ c = getchar(); c = getchar(); if (isdigit(c)) c = getchar(); return(c); case 'n': /* \na or \n(xx */ c = getchar(); if (c == '(') { c = getchar(); c = getchar(); } c = getchar(); return(c); case '*': /* / * (XX */ c = getchar(); if (c == '(') { c = getchar(); c = getchar(); c = getchar(); return(c); } case '(': /* troff 4-character escape sequence */ c1 = getchar(); c2 = getchar(); if (c1 == 'e' && c2 == 'm') return(' '); if (c1 == 'e' && c2 == 'n') return(' '); c = getchar(); return(c); case '%': /* soft hyphen: \% */ c = getchar(); return(c); default: return(c); } } void usage() { printf("Usage: prep [file]\n"); exit(1); }