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