BSD 2 development
[unix-history] / src / soelim.c
CommitLineData
308b2e01
BJ
1/* Copyright (c) 1979 Regents of the University of California */
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
20main(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
39process(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 }
87donename:
88 if (cp == fname) {
89 printf(".so");
90 goto simple;
91 }
92 *cp++ = 0;
93 process(fname);
94 continue;
95simple:
96 if (c == EOF)
97 break;
98 putchar(c);
99 }
100 fclose(soee);
101}