xref: /freebsd/usr.bin/what/what.c (revision fbbd9655e5107c68e4e0146ff22b73d7350475bc)
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.
13*fbbd9655SWarner Losh  * 3. Neither the name of the University nor the names of its contributors
149b50d902SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
159b50d902SRodney W. Grimes  *    without specific prior written permission.
169b50d902SRodney W. Grimes  *
179b50d902SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
189b50d902SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
199b50d902SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
209b50d902SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
219b50d902SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
229b50d902SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
239b50d902SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
249b50d902SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
259b50d902SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
269b50d902SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
279b50d902SRodney W. Grimes  * SUCH DAMAGE.
289b50d902SRodney W. Grimes  */
299b50d902SRodney W. Grimes 
30d46847c0SMark Murray #include <sys/cdefs.h>
31d46847c0SMark Murray 
32d46847c0SMark Murray __FBSDID("$FreeBSD$");
33d46847c0SMark Murray 
349b50d902SRodney W. Grimes #ifndef lint
3505c5fed8SPhilippe Charnier static const char copyright[] =
369b50d902SRodney W. Grimes "@(#) Copyright (c) 1980, 1988, 1993\n\
379b50d902SRodney W. Grimes 	The Regents of the University of California.  All rights reserved.\n";
38d46847c0SMark Murray #endif
399b50d902SRodney W. Grimes 
409b50d902SRodney W. Grimes #ifndef lint
41d46847c0SMark Murray static const char sccsid[] = "@(#)what.c	8.1 (Berkeley) 6/6/93";
4205c5fed8SPhilippe Charnier #endif
439b50d902SRodney W. Grimes 
4405c5fed8SPhilippe Charnier #include <err.h>
4536f45138SJuli Mallett #include <stdbool.h>
469b50d902SRodney W. Grimes #include <stdio.h>
471879eba7SRobert Nordier #include <stdlib.h>
481879eba7SRobert Nordier #include <unistd.h>
491879eba7SRobert Nordier 
503f330d7dSWarner Losh static void usage(void);
5136f45138SJuli Mallett static bool search(bool, bool, FILE *);
5205c5fed8SPhilippe Charnier 
5305c5fed8SPhilippe Charnier int
5436f45138SJuli Mallett main(int argc, char *argv[])
559b50d902SRodney W. Grimes {
5636f45138SJuli Mallett 	const char *file;
5736f45138SJuli Mallett 	FILE *in;
5836f45138SJuli Mallett 	bool found, qflag, sflag;
591879eba7SRobert Nordier 	int c;
601879eba7SRobert Nordier 
6136f45138SJuli Mallett 	qflag = sflag = false;
6236f45138SJuli Mallett 
6336f45138SJuli Mallett 	while ((c = getopt(argc, argv, "qs")) != -1) {
641879eba7SRobert Nordier 		switch (c) {
6536f45138SJuli Mallett 		case 'q':
6636f45138SJuli Mallett 			qflag = true;
6736f45138SJuli Mallett 			break;
681879eba7SRobert Nordier 		case 's':
6936f45138SJuli Mallett 			sflag = true;
701879eba7SRobert Nordier 			break;
711879eba7SRobert Nordier 		default:
72110ab594SPhilippe Charnier 			usage();
731879eba7SRobert Nordier 		}
7436f45138SJuli Mallett 	}
7536f45138SJuli Mallett 	argc -= optind;
761879eba7SRobert Nordier 	argv += optind;
771879eba7SRobert Nordier 
7836f45138SJuli Mallett 	found = false;
7936f45138SJuli Mallett 
8036f45138SJuli Mallett 	if (argc == 0) {
8136f45138SJuli Mallett 		if (search(sflag, qflag, stdin))
8236f45138SJuli Mallett 			found = true;
8336f45138SJuli Mallett 	} else {
8436f45138SJuli Mallett 		while (argc--) {
8536f45138SJuli Mallett 			file = *argv++;
8636f45138SJuli Mallett 			in = fopen(file, "r");
8736f45138SJuli Mallett 			if (in == NULL) {
8836f45138SJuli Mallett 				if (!qflag)
8936f45138SJuli Mallett 					warn("%s", file);
9036f45138SJuli Mallett 				continue;
911879eba7SRobert Nordier 			}
9236f45138SJuli Mallett 			if (!qflag)
9336f45138SJuli Mallett 				printf("%s:\n", file);
9436f45138SJuli Mallett 			if (search(sflag, qflag, in))
9536f45138SJuli Mallett 				found = true;
9636f45138SJuli Mallett 			fclose(in);
9736f45138SJuli Mallett 		}
9836f45138SJuli Mallett 	}
9936f45138SJuli Mallett 	exit(found ? 0 : 1);
1009b50d902SRodney W. Grimes }
1019b50d902SRodney W. Grimes 
102110ab594SPhilippe Charnier static void
103f4ac32deSDavid Malone usage(void)
104110ab594SPhilippe Charnier {
10536f45138SJuli Mallett 	fprintf(stderr, "usage: what [-qs] [file ...]\n");
106110ab594SPhilippe Charnier 	exit(1);
107110ab594SPhilippe Charnier }
108110ab594SPhilippe Charnier 
10936f45138SJuli Mallett bool
11036f45138SJuli Mallett search(bool one, bool quiet, FILE *in)
1119b50d902SRodney W. Grimes {
11236f45138SJuli Mallett 	bool found;
113f4ac32deSDavid Malone 	int c;
1149b50d902SRodney W. Grimes 
11536f45138SJuli Mallett 	found = false;
11636f45138SJuli Mallett 
11736f45138SJuli Mallett 	while ((c = getc(in)) != EOF) {
1189b50d902SRodney W. Grimes loop:		if (c != '@')
1199b50d902SRodney W. Grimes 			continue;
12036f45138SJuli Mallett 		if ((c = getc(in)) != '(')
1219b50d902SRodney W. Grimes 			goto loop;
12236f45138SJuli Mallett 		if ((c = getc(in)) != '#')
1239b50d902SRodney W. Grimes 			goto loop;
12436f45138SJuli Mallett 		if ((c = getc(in)) != ')')
1259b50d902SRodney W. Grimes 			goto loop;
12636f45138SJuli Mallett 		if (!quiet)
1279b50d902SRodney W. Grimes 			putchar('\t');
12836f45138SJuli Mallett 		while ((c = getc(in)) != EOF && c && c != '"' &&
1291879eba7SRobert Nordier 		    c != '>' && c != '\\' && c != '\n')
1309b50d902SRodney W. Grimes 			putchar(c);
1319b50d902SRodney W. Grimes 		putchar('\n');
13236f45138SJuli Mallett 		found = true;
13336f45138SJuli Mallett 		if (one)
13436f45138SJuli Mallett 			break;
1359b50d902SRodney W. Grimes 	}
13636f45138SJuli Mallett 	return (found);
1379b50d902SRodney W. Grimes }
138