xref: /netbsd-src/libexec/getNAME/getNAME.c (revision ce0bb6e8d2e560ecacbe865a848624f94498063b)
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[] = "from: @(#)getNAME.c	5.4 (Berkeley) 1/20/91";*/
42 static char rcsid[] = "$Id: getNAME.c,v 1.2 1993/08/01 18:30:33 mycroft Exp $";
43 #endif /* not lint */
44 
45 /*
46  * Get name sections from manual pages.
47  *	-t	for building toc
48  *	-i	for building intro entries
49  *	other	apropos database
50  */
51 #include <stdio.h>
52 #include <string.h>
53 
54 int tocrc;
55 int intro;
56 
57 main(argc, argv)
58 	int argc;
59 	char **argv;
60 {
61 	extern int optind;
62 	int ch;
63 
64 	while ((ch = getopt(argc, argv, "it")) != EOF)
65 		switch(ch) {
66 		case 'i':
67 			intro = 1;
68 			break;
69 		case 't':
70 			tocrc = 1;
71 			break;
72 		case '?':
73 		default:
74 			usage();
75 		}
76 	argc -= optind;
77 	argv += optind;
78 
79 	if (!*argv)
80 		usage();
81 
82 	for (; *argv; ++argv)
83 		getfrom(*argv);
84 	exit(0);
85 }
86 
87 getfrom(name)
88 	char *name;
89 {
90 	int i = 0;
91 	char headbuf[BUFSIZ];
92 	char linbuf[BUFSIZ];
93 
94 	if (freopen(name, "r", stdin) == 0) {
95 		perror(name);
96 		return;
97 	}
98 	for (;;) {
99 		if (fgets(headbuf, sizeof headbuf, stdin) == NULL)
100 			return;
101 		if (headbuf[0] != '.')
102 			continue;
103 		if (headbuf[1] == 'T' && headbuf[2] == 'H')
104 			break;
105 		if (headbuf[1] == 't' && headbuf[2] == 'h')
106 			break;
107 	}
108 	for (;;) {
109 		if (fgets(linbuf, sizeof linbuf, stdin) == NULL)
110 			return;
111 		if (linbuf[0] != '.')
112 			continue;
113 		if (linbuf[1] == 'S' && linbuf[2] == 'H')
114 			break;
115 		if (linbuf[1] == 's' && linbuf[2] == 'h')
116 			break;
117 	}
118 	trimln(headbuf);
119 	if (tocrc)
120 		doname(name);
121 	if (!intro)
122 		printf("%s\t", headbuf);
123 	for (;;) {
124 		if (fgets(linbuf, sizeof linbuf, stdin) == NULL)
125 			break;
126 		if (linbuf[0] == '.') {
127 			if (linbuf[1] == 'S' && linbuf[2] == 'H')
128 				break;
129 			if (linbuf[1] == 's' && linbuf[2] == 'h')
130 				break;
131 		}
132 		trimln(linbuf);
133 		if (intro) {
134 			split(linbuf, name);
135 			continue;
136 		}
137 		if (i != 0)
138 			printf(" ");
139 		i++;
140 		printf("%s", linbuf);
141 	}
142 	printf("\n");
143 }
144 
145 trimln(cp)
146 	register char *cp;
147 {
148 
149 	while (*cp)
150 		cp++;
151 	if (*--cp == '\n')
152 		*cp = 0;
153 }
154 
155 doname(name)
156 	char *name;
157 {
158 	register char *dp = name, *ep;
159 
160 again:
161 	while (*dp && *dp != '.')
162 		putchar(*dp++);
163 	if (*dp)
164 		for (ep = dp+1; *ep; ep++)
165 			if (*ep == '.') {
166 				putchar(*dp++);
167 				goto again;
168 			}
169 	putchar('(');
170 	if (*dp)
171 		dp++;
172 	while (*dp)
173 		putchar (*dp++);
174 	putchar(')');
175 	putchar(' ');
176 }
177 
178 split(line, name)
179 	char *line, *name;
180 {
181 	register char *cp, *dp;
182 	char *sp, *sep;
183 
184 	cp = index(line, '-');
185 	if (cp == 0)
186 		return;
187 	sp = cp + 1;
188 	for (--cp; *cp == ' ' || *cp == '\t' || *cp == '\\'; cp--)
189 		;
190 	*++cp = '\0';
191 	while (*sp && (*sp == ' ' || *sp == '\t'))
192 		sp++;
193 	for (sep = "", dp = line; dp && *dp; dp = cp, sep = "\n") {
194 		cp = index(dp, ',');
195 		if (cp) {
196 			register char *tp;
197 
198 			for (tp = cp - 1; *tp == ' ' || *tp == '\t'; tp--)
199 				;
200 			*++tp = '\0';
201 			for (++cp; *cp == ' ' || *cp == '\t'; cp++)
202 				;
203 		}
204 		printf("%s%s\t", sep, dp);
205 		dorefname(name);
206 		printf("\t%s", sp);
207 	}
208 }
209 
210 dorefname(name)
211 	char *name;
212 {
213 	register char *dp = name, *ep;
214 
215 again:
216 	while (*dp && *dp != '.')
217 		putchar(*dp++);
218 	if (*dp)
219 		for (ep = dp+1; *ep; ep++)
220 			if (*ep == '.') {
221 				putchar(*dp++);
222 				goto again;
223 			}
224 	putchar('.');
225 	if (*dp)
226 		dp++;
227 	while (*dp)
228 		putchar (*dp++);
229 }
230 
231 usage()
232 {
233 	(void)fprintf(stderr, "usage: getNAME [-it] file ...\n");
234 	exit(1);
235 }
236