xref: /minix3/minix/commands/prep/prep.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
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 Sambuc int 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 Sambuc void 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 Sambuc int 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 Sambuc void usage()
133*433d6423SLionel Sambuc {
134*433d6423SLionel Sambuc   printf("Usage: prep [file]\n");
135*433d6423SLionel Sambuc   exit(1);
136*433d6423SLionel Sambuc }
137