xref: /freebsd/usr.bin/what/what.c (revision 36f45138fb3dac31694d8b0f01b57b56ec4066bb)
19b50d902SRodney W. Grimes /*
29b50d902SRodney W. Grimes  * Copyright (c) 1980, 1988, 1993
39b50d902SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
49b50d902SRodney W. Grimes  *
59b50d902SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
69b50d902SRodney W. Grimes  * modification, are permitted provided that the following conditions
79b50d902SRodney W. Grimes  * are met:
89b50d902SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
99b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
109b50d902SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
119b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
129b50d902SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
139b50d902SRodney W. Grimes  * 3. All advertising materials mentioning features or use of this software
149b50d902SRodney W. Grimes  *    must display the following acknowledgement:
159b50d902SRodney W. Grimes  *	This product includes software developed by the University of
169b50d902SRodney W. Grimes  *	California, Berkeley and its contributors.
179b50d902SRodney W. Grimes  * 4. Neither the name of the University nor the names of its contributors
189b50d902SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
199b50d902SRodney W. Grimes  *    without specific prior written permission.
209b50d902SRodney W. Grimes  *
219b50d902SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
229b50d902SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
239b50d902SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
249b50d902SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
259b50d902SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
269b50d902SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
279b50d902SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
289b50d902SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
299b50d902SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
309b50d902SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
319b50d902SRodney W. Grimes  * SUCH DAMAGE.
329b50d902SRodney W. Grimes  */
339b50d902SRodney W. Grimes 
34d46847c0SMark Murray #include <sys/cdefs.h>
35d46847c0SMark Murray 
36d46847c0SMark Murray __FBSDID("$FreeBSD$");
37d46847c0SMark Murray 
389b50d902SRodney W. Grimes #ifndef lint
3905c5fed8SPhilippe Charnier static const char copyright[] =
409b50d902SRodney W. Grimes "@(#) Copyright (c) 1980, 1988, 1993\n\
419b50d902SRodney W. Grimes 	The Regents of the University of California.  All rights reserved.\n";
42d46847c0SMark Murray #endif
439b50d902SRodney W. Grimes 
449b50d902SRodney W. Grimes #ifndef lint
45d46847c0SMark Murray static const char sccsid[] = "@(#)what.c	8.1 (Berkeley) 6/6/93";
4605c5fed8SPhilippe Charnier #endif
479b50d902SRodney W. Grimes 
4805c5fed8SPhilippe Charnier #include <err.h>
4936f45138SJuli Mallett #include <stdbool.h>
509b50d902SRodney W. Grimes #include <stdio.h>
511879eba7SRobert Nordier #include <stdlib.h>
521879eba7SRobert Nordier #include <unistd.h>
531879eba7SRobert Nordier 
543f330d7dSWarner Losh static void usage(void);
5536f45138SJuli Mallett static bool search(bool, bool, FILE *);
5605c5fed8SPhilippe Charnier 
5705c5fed8SPhilippe Charnier int
5836f45138SJuli Mallett main(int argc, char *argv[])
599b50d902SRodney W. Grimes {
6036f45138SJuli Mallett 	const char *file;
6136f45138SJuli Mallett 	FILE *in;
6236f45138SJuli Mallett 	bool found, qflag, sflag;
631879eba7SRobert Nordier 	int c;
641879eba7SRobert Nordier 
6536f45138SJuli Mallett 	qflag = sflag = false;
6636f45138SJuli Mallett 
6736f45138SJuli Mallett 	while ((c = getopt(argc, argv, "qs")) != -1) {
681879eba7SRobert Nordier 		switch (c) {
6936f45138SJuli Mallett 		case 'q':
7036f45138SJuli Mallett 			qflag = true;
7136f45138SJuli Mallett 			break;
721879eba7SRobert Nordier 		case 's':
7336f45138SJuli Mallett 			sflag = true;
741879eba7SRobert Nordier 			break;
751879eba7SRobert Nordier 		default:
76110ab594SPhilippe Charnier 			usage();
771879eba7SRobert Nordier 		}
7836f45138SJuli Mallett 	}
7936f45138SJuli Mallett 	argc -= optind;
801879eba7SRobert Nordier 	argv += optind;
811879eba7SRobert Nordier 
8236f45138SJuli Mallett 	found = false;
8336f45138SJuli Mallett 
8436f45138SJuli Mallett 	if (argc == 0) {
8536f45138SJuli Mallett 		if (search(sflag, qflag, stdin))
8636f45138SJuli Mallett 			found = true;
8736f45138SJuli Mallett 	} else {
8836f45138SJuli Mallett 		while (argc--) {
8936f45138SJuli Mallett 			file = *argv++;
9036f45138SJuli Mallett 			in = fopen(file, "r");
9136f45138SJuli Mallett 			if (in == NULL) {
9236f45138SJuli Mallett 				if (!qflag)
9336f45138SJuli Mallett 					warn("%s", file);
9436f45138SJuli Mallett 				continue;
951879eba7SRobert Nordier 			}
9636f45138SJuli Mallett 			if (!qflag)
9736f45138SJuli Mallett 				printf("%s:\n", file);
9836f45138SJuli Mallett 			if (search(sflag, qflag, in))
9936f45138SJuli Mallett 				found = true;
10036f45138SJuli Mallett 			fclose(in);
10136f45138SJuli Mallett 		}
10236f45138SJuli Mallett 	}
10336f45138SJuli Mallett 	exit(found ? 0 : 1);
1049b50d902SRodney W. Grimes }
1059b50d902SRodney W. Grimes 
106110ab594SPhilippe Charnier static void
107f4ac32deSDavid Malone usage(void)
108110ab594SPhilippe Charnier {
10936f45138SJuli Mallett 	fprintf(stderr, "usage: what [-qs] [file ...]\n");
110110ab594SPhilippe Charnier 	exit(1);
111110ab594SPhilippe Charnier }
112110ab594SPhilippe Charnier 
11336f45138SJuli Mallett bool
11436f45138SJuli Mallett search(bool one, bool quiet, FILE *in)
1159b50d902SRodney W. Grimes {
11636f45138SJuli Mallett 	bool found;
117f4ac32deSDavid Malone 	int c;
1189b50d902SRodney W. Grimes 
11936f45138SJuli Mallett 	found = false;
12036f45138SJuli Mallett 
12136f45138SJuli Mallett 	while ((c = getc(in)) != EOF) {
1229b50d902SRodney W. Grimes loop:		if (c != '@')
1239b50d902SRodney W. Grimes 			continue;
12436f45138SJuli Mallett 		if ((c = getc(in)) != '(')
1259b50d902SRodney W. Grimes 			goto loop;
12636f45138SJuli Mallett 		if ((c = getc(in)) != '#')
1279b50d902SRodney W. Grimes 			goto loop;
12836f45138SJuli Mallett 		if ((c = getc(in)) != ')')
1299b50d902SRodney W. Grimes 			goto loop;
13036f45138SJuli Mallett 		if (!quiet)
1319b50d902SRodney W. Grimes 			putchar('\t');
13236f45138SJuli Mallett 		while ((c = getc(in)) != EOF && c && c != '"' &&
1331879eba7SRobert Nordier 		    c != '>' && c != '\\' && c != '\n')
1349b50d902SRodney W. Grimes 			putchar(c);
1359b50d902SRodney W. Grimes 		putchar('\n');
13636f45138SJuli Mallett 		found = true;
13736f45138SJuli Mallett 		if (one)
13836f45138SJuli Mallett 			break;
1399b50d902SRodney W. Grimes 	}
14036f45138SJuli Mallett 	return (found);
1419b50d902SRodney W. Grimes }
142