Home | History | Annotate | Line # | Download | only in soelim
soelim.c revision 1.4
      1 /*	$NetBSD: soelim.c,v 1.4 1997/10/19 23:25:51 lukem Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1980, 1993
      5  *	The Regents of the University of California.  All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  * 3. All advertising materials mentioning features or use of this software
     16  *    must display the following acknowledgement:
     17  *	This product includes software developed by the University of
     18  *	California, Berkeley and its contributors.
     19  * 4. Neither the name of the University nor the names of its contributors
     20  *    may be used to endorse or promote products derived from this software
     21  *    without specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33  * SUCH DAMAGE.
     34  */
     35 
     36 #include <sys/cdefs.h>
     37 #ifndef lint
     38 __COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\
     39 	The Regents of the University of California.  All rights reserved.\n");
     40 #endif /* not lint */
     41 
     42 #ifndef lint
     43 #if 0
     44 static char sccsid[] = "@(#)soelim.c	8.1 (Berkeley) 6/6/93";
     45 #endif
     46 __RCSID("$NetBSD: soelim.c,v 1.4 1997/10/19 23:25:51 lukem Exp $");
     47 #endif /* not lint */
     48 
     49 #include <stdio.h>
     50 /*
     51  * soelim - a filter to process n/troff input eliminating .so's
     52  *
     53  * Author: Bill Joy UCB July 8, 1977
     54  *
     55  * This program eliminates .so's from a n/troff input stream.
     56  * It can be used to prepare safe input for submission to the
     57  * phototypesetter since the software supporting the operator
     58  * doesn't let him do chdir.
     59  *
     60  * This is a kludge and the operator should be given the
     61  * ability to do chdir.
     62  *
     63  * This program is more generally useful, it turns out, because
     64  * the program tbl doesn't understand ".so" directives.
     65  */
     66 #define	STDIN_NAME	"-"
     67 
     68 int	main __P((int, char **));
     69 int	process __P((char *));
     70 
     71 int
     72 main(argc, argv)
     73 	int argc;
     74 	char *argv[];
     75 {
     76 
     77 	argc--;
     78 	argv++;
     79 	if (argc == 0) {
     80 		(void)process(STDIN_NAME);
     81 		exit(0);
     82 	}
     83 	do {
     84 		(void)process(argv[0]);
     85 		argv++;
     86 		argc--;
     87 	} while (argc > 0);
     88 	exit(0);
     89 }
     90 
     91 int
     92 process(file)
     93 	char *file;
     94 {
     95 	char *cp;
     96 	int c;
     97 	char fname[BUFSIZ];
     98 	FILE *soee;
     99 	int isfile;
    100 
    101 	if (!strcmp(file, STDIN_NAME)) {
    102 		soee = stdin;
    103 	} else {
    104 		soee = fopen(file, "r");
    105 		if (soee == NULL) {
    106 			perror(file);
    107 			return(-1);
    108 		}
    109 	}
    110 	for (;;) {
    111 		c = getc(soee);
    112 		if (c == EOF)
    113 			break;
    114 		if (c != '.')
    115 			goto simple;
    116 		c = getc(soee);
    117 		if (c != 's') {
    118 			putchar('.');
    119 			goto simple;
    120 		}
    121 		c = getc(soee);
    122 		if (c != 'o') {
    123 			printf(".s");
    124 			goto simple;
    125 		}
    126 		do
    127 			c = getc(soee);
    128 		while (c == ' ' || c == '\t');
    129 		cp = fname;
    130 		isfile = 0;
    131 		for (;;) {
    132 			switch (c) {
    133 
    134 			case ' ':
    135 			case '\t':
    136 			case '\n':
    137 			case EOF:
    138 				goto donename;
    139 
    140 			default:
    141 				*cp++ = c;
    142 				c = getc(soee);
    143 				isfile++;
    144 				continue;
    145 			}
    146 		}
    147 donename:
    148 		if (cp == fname) {
    149 			printf(".so");
    150 			goto simple;
    151 		}
    152 		*cp = 0;
    153 		if (process(fname) < 0)
    154 			if (isfile)
    155 				printf(".so %s\n", fname);
    156 		continue;
    157 simple:
    158 		if (c == EOF)
    159 			break;
    160 		putchar(c);
    161 		if (c != '\n') {
    162 			c = getc(soee);
    163 			goto simple;
    164 		}
    165 	}
    166 	if (soee != stdin) {
    167 		fclose(soee);
    168 	}
    169 	return(0);
    170 }
    171