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