1*433d6423SLionel Sambuc /* prep - prepare file for statistics Author: Andy Tanenbaum */ 2*433d6423SLionel Sambuc 3*433d6423SLionel Sambuc #include <ctype.h> 4*433d6423SLionel Sambuc #include <stdlib.h> 5*433d6423SLionel Sambuc #include <stdio.h> 6*433d6423SLionel Sambuc 7*433d6423SLionel Sambuc #define TROFF_CHAR '.' /* troff commands begin with this char */ 8*433d6423SLionel Sambuc #define EOL '\n' /* end of line char */ 9*433d6423SLionel Sambuc #define APOSTROPHE 047 /* single quote */ 10*433d6423SLionel Sambuc #define BACKSLASH '\\' /* troff code */ 11*433d6423SLionel Sambuc 12*433d6423SLionel Sambuc int lfread; /* set when last char read was lf */ 13*433d6423SLionel Sambuc int lfwritten = 1; /* set when last char written was lf */ 14*433d6423SLionel Sambuc 15*433d6423SLionel Sambuc int main(int argc, char **argv); 16*433d6423SLionel Sambuc void skipline(void); 17*433d6423SLionel Sambuc int backslash(void); 18*433d6423SLionel Sambuc void usage(void); 19*433d6423SLionel Sambuc main(argc,argv)20*433d6423SLionel Sambucint main(argc, argv) 21*433d6423SLionel Sambuc int argc; 22*433d6423SLionel Sambuc char *argv[]; 23*433d6423SLionel Sambuc { 24*433d6423SLionel Sambuc 25*433d6423SLionel Sambuc int c; 26*433d6423SLionel Sambuc 27*433d6423SLionel Sambuc if (argc > 2) usage(); 28*433d6423SLionel Sambuc if (argc == 2) { 29*433d6423SLionel Sambuc if (freopen(argv[1], "r", stdin) == NULL) { 30*433d6423SLionel Sambuc printf("prep: cannot open %s\n", argv[1]); 31*433d6423SLionel Sambuc exit(1); 32*433d6423SLionel Sambuc } 33*433d6423SLionel Sambuc } 34*433d6423SLionel Sambuc while ((c = getchar()) != EOF) { 35*433d6423SLionel Sambuc /* Lines beginning with "." are troff commands -- skip them. */ 36*433d6423SLionel Sambuc if (lfread && c == TROFF_CHAR) { 37*433d6423SLionel Sambuc skipline(); 38*433d6423SLionel Sambuc continue; 39*433d6423SLionel Sambuc } 40*433d6423SLionel Sambuc while (c == BACKSLASH) c = backslash(); /* eat troff stuff */ 41*433d6423SLionel Sambuc 42*433d6423SLionel Sambuc if (isupper(c)) { 43*433d6423SLionel Sambuc putchar(tolower(c)); 44*433d6423SLionel Sambuc lfwritten = 0; 45*433d6423SLionel Sambuc lfread = 0; 46*433d6423SLionel Sambuc continue; 47*433d6423SLionel Sambuc } 48*433d6423SLionel Sambuc if (islower(c)) { 49*433d6423SLionel Sambuc putchar(c); 50*433d6423SLionel Sambuc lfwritten = 0; 51*433d6423SLionel Sambuc lfread = 0; 52*433d6423SLionel Sambuc continue; 53*433d6423SLionel Sambuc } 54*433d6423SLionel Sambuc if (c == APOSTROPHE) { 55*433d6423SLionel Sambuc putchar(c); 56*433d6423SLionel Sambuc lfwritten = 0; 57*433d6423SLionel Sambuc lfread = 0; 58*433d6423SLionel Sambuc continue; 59*433d6423SLionel Sambuc } 60*433d6423SLionel Sambuc lfread = (c == EOL ? 1 : 0); 61*433d6423SLionel Sambuc if (lfwritten) continue; 62*433d6423SLionel Sambuc putchar(EOL); 63*433d6423SLionel Sambuc lfwritten = 1; 64*433d6423SLionel Sambuc } 65*433d6423SLionel Sambuc return(0); 66*433d6423SLionel Sambuc } 67*433d6423SLionel Sambuc 68*433d6423SLionel Sambuc skipline()69*433d6423SLionel Sambucvoid skipline() 70*433d6423SLionel Sambuc { 71*433d6423SLionel Sambuc char c; 72*433d6423SLionel Sambuc 73*433d6423SLionel Sambuc while ((c = getchar()) != EOL); 74*433d6423SLionel Sambuc } 75*433d6423SLionel Sambuc 76*433d6423SLionel Sambuc backslash()77*433d6423SLionel Sambucint backslash() 78*433d6423SLionel Sambuc { 79*433d6423SLionel Sambuc /* A backslash has been seen. Eat troff stuff. */ 80*433d6423SLionel Sambuc 81*433d6423SLionel Sambuc int c, c1, c2; 82*433d6423SLionel Sambuc 83*433d6423SLionel Sambuc c = getchar(); 84*433d6423SLionel Sambuc switch (c) { 85*433d6423SLionel Sambuc case 'f': 86*433d6423SLionel Sambuc c = getchar(); 87*433d6423SLionel Sambuc c = getchar(); 88*433d6423SLionel Sambuc return(c); 89*433d6423SLionel Sambuc 90*433d6423SLionel Sambuc case 's': /* \s7 or \s14 */ 91*433d6423SLionel Sambuc c = getchar(); 92*433d6423SLionel Sambuc c = getchar(); 93*433d6423SLionel Sambuc if (isdigit(c)) c = getchar(); 94*433d6423SLionel Sambuc return(c); 95*433d6423SLionel Sambuc 96*433d6423SLionel Sambuc case 'n': /* \na or \n(xx */ 97*433d6423SLionel Sambuc c = getchar(); 98*433d6423SLionel Sambuc if (c == '(') { 99*433d6423SLionel Sambuc c = getchar(); 100*433d6423SLionel Sambuc c = getchar(); 101*433d6423SLionel Sambuc } 102*433d6423SLionel Sambuc c = getchar(); 103*433d6423SLionel Sambuc return(c); 104*433d6423SLionel Sambuc 105*433d6423SLionel Sambuc case '*': /* / * (XX */ 106*433d6423SLionel Sambuc c = getchar(); 107*433d6423SLionel Sambuc if (c == '(') { 108*433d6423SLionel Sambuc c = getchar(); 109*433d6423SLionel Sambuc c = getchar(); 110*433d6423SLionel Sambuc c = getchar(); 111*433d6423SLionel Sambuc return(c); 112*433d6423SLionel Sambuc } 113*433d6423SLionel Sambuc 114*433d6423SLionel Sambuc case '(': /* troff 4-character escape sequence */ 115*433d6423SLionel Sambuc c1 = getchar(); 116*433d6423SLionel Sambuc c2 = getchar(); 117*433d6423SLionel Sambuc if (c1 == 'e' && c2 == 'm') return(' '); 118*433d6423SLionel Sambuc if (c1 == 'e' && c2 == 'n') return(' '); 119*433d6423SLionel Sambuc c = getchar(); 120*433d6423SLionel Sambuc return(c); 121*433d6423SLionel Sambuc 122*433d6423SLionel Sambuc case '%': /* soft hyphen: \% */ 123*433d6423SLionel Sambuc c = getchar(); 124*433d6423SLionel Sambuc return(c); 125*433d6423SLionel Sambuc 126*433d6423SLionel Sambuc default: 127*433d6423SLionel Sambuc return(c); 128*433d6423SLionel Sambuc 129*433d6423SLionel Sambuc } 130*433d6423SLionel Sambuc } 131*433d6423SLionel Sambuc usage()132*433d6423SLionel Sambucvoid usage() 133*433d6423SLionel Sambuc { 134*433d6423SLionel Sambuc printf("Usage: prep [file]\n"); 135*433d6423SLionel Sambuc exit(1); 136*433d6423SLionel Sambuc } 137