1 /*
2 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
4 * Copyright (c) 2016 by Delphix. All rights reserved.
5 */
6
7 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
8 /* All Rights Reserved */
9
10
11 /*
12 * Copyright (c) 1980 Regents of the University of California.
13 * All rights reserved. The Berkeley software License Agreement
14 * specifies the terms and conditions for redistribution.
15 */
16
17 #include <stdio.h>
18 /*
19 * soelim - a filter to process n/troff input eliminating .so's
20 *
21 * Author: Bill Joy UCB July 8, 1977
22 *
23 * This program eliminates .so's from a n/troff input stream.
24 * It can be used to prepare safe input for submission to the
25 * phototypesetter since the software supporting the operator
26 * doesn't let them do chdir.
27 *
28 * This is a kludge and the operator should be given the
29 * ability to do chdir.
30 *
31 * This program is more generally useful, it turns out, because
32 * the program tbl doesn't understand ".so" directives.
33 */
34 #define STDIN_NAME "-"
35
36 int
main(int argc,char * argv[])37 main(int argc, char *argv[])
38 {
39
40 argc--;
41 argv++;
42 if (argc == 0) {
43 (void)process(STDIN_NAME);
44 exit(0);
45 }
46 do {
47 (void)process(argv[0]);
48 argv++;
49 argc--;
50 } while (argc > 0);
51 return (0);
52 }
53
process(file)54 int process(file)
55 char *file;
56 {
57 register char *cp;
58 register int c;
59 char fname[BUFSIZ];
60 FILE *soee;
61 int isfile;
62
63 if (!strcmp(file, STDIN_NAME)) {
64 soee = stdin;
65 } else {
66 soee = fopen(file, "r");
67 if (soee == NULL) {
68 perror(file);
69 return(-1);
70 }
71 }
72 for (;;) {
73 c = getc(soee);
74 if (c == EOF)
75 break;
76 if (c != '.')
77 goto simple;
78 c = getc(soee);
79 if (c != 's') {
80 putchar('.');
81 goto simple;
82 }
83 c = getc(soee);
84 if (c != 'o') {
85 printf(".s");
86 goto simple;
87 }
88 do
89 c = getc(soee);
90 while (c == ' ' || c == '\t');
91 cp = fname;
92 isfile = 0;
93 for (;;) {
94 switch (c) {
95
96 case ' ':
97 case '\t':
98 case '\n':
99 case EOF:
100 goto donename;
101
102 default:
103 *cp++ = c;
104 c = getc(soee);
105 isfile++;
106 continue;
107 }
108 }
109 donename:
110 if (cp == fname) {
111 printf(".so");
112 goto simple;
113 }
114 *cp = 0;
115 if (process(fname) < 0)
116 if (isfile)
117 printf(".so %s\n", fname);
118 continue;
119 simple:
120 if (c == EOF)
121 break;
122 putchar(c);
123 if (c != '\n') {
124 c = getc(soee);
125 goto simple;
126 }
127 }
128 if (soee != stdin) {
129 fclose(soee);
130 }
131 return(0);
132 }
133