xref: /original-bsd/usr.bin/soelim/soelim.c (revision 552e81d8)
1 static char *sccsid = "@(#)soelim.c	4.1 (Berkeley) 10/01/80";
2 #include <stdio.h>
3 /*
4  * soelim - a filter to process n/troff input eliminating .so's
5  *
6  * Author: Bill Joy UCB July 8, 1977
7  *
8  * This program eliminates .so's from a n/troff input stream.
9  * It can be used to prepare safe input for submission to the
10  * phototypesetter since the software supporting the operator
11  * doesn't let him do chdir.
12  *
13  * This is a kludge and the operator should be given the
14  * ability to do chdir.
15  *
16  * This program is more generally useful, it turns out, because
17  * the program tbl doesn't understand ".so" directives.
18  */
19 
20 main(argc, argv)
21 	int argc;
22 	char *argv[];
23 {
24 
25 	argc--;
26 	argv++;
27 	if (argc == 0) {
28 		fprintf(stderr, "Usage: %s file [ file ... ]\n", argv[-1]);
29 		exit(1);
30 	}
31 	do {
32 		process(argv[0]);
33 		argv++;
34 		argc--;
35 	} while (argc > 0);
36 	exit(0);
37 }
38 
39 process(file)
40 	char *file;
41 {
42 	register char *cp;
43 	register int c;
44 	char fname[BUFSIZ];
45 	FILE *soee;
46 
47 	soee = fopen(file, "r");
48 	if (soee == NULL) {
49 		perror(file);
50 		return;
51 	}
52 	for (;;) {
53 		c = getc(soee);
54 		if (c < 0)
55 			break;
56 		if (c != '.')
57 			goto simple;
58 		c = getc(soee);
59 		if (c != 's') {
60 			putchar('.');
61 			goto simple;
62 		}
63 		c = getc(soee);
64 		if (c != 'o') {
65 			printf(".s");
66 			goto simple;
67 		}
68 		do
69 			c = getc(soee);
70 		while (c == ' ' || c == '\t');
71 		cp = fname;
72 		for (;;) {
73 			switch (c) {
74 
75 			case ' ':
76 			case '\t':
77 			case '\n':
78 			case EOF:
79 				goto donename;
80 
81 			default:
82 				*cp++ = c;
83 				c = getc(soee);
84 				continue;
85 			}
86 		}
87 donename:
88 		if (cp == fname) {
89 			printf(".so");
90 			goto simple;
91 		}
92 		*cp++ = 0;
93 		process(fname);
94 		continue;
95 simple:
96 		if (c == EOF)
97 			break;
98 		putchar(c);
99 	}
100 	fclose(soee);
101 }
102