xref: /freebsd/usr.bin/what/what.c (revision cccdaf507eee8fb34494b4624eb85bb951e323c8)
18a16b7a1SPedro F. Giffuni /*-
28a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
38a16b7a1SPedro F. Giffuni  *
49b50d902SRodney W. Grimes  * Copyright (c) 1980, 1988, 1993
59b50d902SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
69b50d902SRodney W. Grimes  *
79b50d902SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
89b50d902SRodney W. Grimes  * modification, are permitted provided that the following conditions
99b50d902SRodney W. Grimes  * are met:
109b50d902SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
119b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
129b50d902SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
139b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
149b50d902SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
15fbbd9655SWarner Losh  * 3. Neither the name of the University nor the names of its contributors
169b50d902SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
179b50d902SRodney W. Grimes  *    without specific prior written permission.
189b50d902SRodney W. Grimes  *
199b50d902SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
209b50d902SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
219b50d902SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
229b50d902SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
239b50d902SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
249b50d902SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
259b50d902SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
269b50d902SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
279b50d902SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
289b50d902SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
299b50d902SRodney W. Grimes  * SUCH DAMAGE.
309b50d902SRodney W. Grimes  */
319b50d902SRodney W. Grimes 
32d46847c0SMark Murray #include <sys/cdefs.h>
33d46847c0SMark Murray 
34d46847c0SMark Murray __FBSDID("$FreeBSD$");
35d46847c0SMark Murray 
369b50d902SRodney W. Grimes #ifndef lint
3705c5fed8SPhilippe Charnier static const char copyright[] =
389b50d902SRodney W. Grimes "@(#) Copyright (c) 1980, 1988, 1993\n\
399b50d902SRodney W. Grimes 	The Regents of the University of California.  All rights reserved.\n";
40d46847c0SMark Murray #endif
419b50d902SRodney W. Grimes 
429b50d902SRodney W. Grimes #ifndef lint
43d46847c0SMark Murray static const char sccsid[] = "@(#)what.c	8.1 (Berkeley) 6/6/93";
4405c5fed8SPhilippe Charnier #endif
459b50d902SRodney W. Grimes 
4605c5fed8SPhilippe Charnier #include <err.h>
4736f45138SJuli Mallett #include <stdbool.h>
489b50d902SRodney W. Grimes #include <stdio.h>
491879eba7SRobert Nordier #include <stdlib.h>
501879eba7SRobert Nordier #include <unistd.h>
511879eba7SRobert Nordier 
52*cccdaf50SAlfonso Gregory static void usage(void) __dead2;
5336f45138SJuli Mallett static bool search(bool, bool, FILE *);
5405c5fed8SPhilippe Charnier 
5505c5fed8SPhilippe Charnier int
5636f45138SJuli Mallett main(int argc, char *argv[])
579b50d902SRodney W. Grimes {
5836f45138SJuli Mallett 	const char *file;
5936f45138SJuli Mallett 	FILE *in;
6036f45138SJuli Mallett 	bool found, qflag, sflag;
611879eba7SRobert Nordier 	int c;
621879eba7SRobert Nordier 
6336f45138SJuli Mallett 	qflag = sflag = false;
6436f45138SJuli Mallett 
6536f45138SJuli Mallett 	while ((c = getopt(argc, argv, "qs")) != -1) {
661879eba7SRobert Nordier 		switch (c) {
6736f45138SJuli Mallett 		case 'q':
6836f45138SJuli Mallett 			qflag = true;
6936f45138SJuli Mallett 			break;
701879eba7SRobert Nordier 		case 's':
7136f45138SJuli Mallett 			sflag = true;
721879eba7SRobert Nordier 			break;
731879eba7SRobert Nordier 		default:
74110ab594SPhilippe Charnier 			usage();
751879eba7SRobert Nordier 		}
7636f45138SJuli Mallett 	}
7736f45138SJuli Mallett 	argc -= optind;
781879eba7SRobert Nordier 	argv += optind;
791879eba7SRobert Nordier 
8036f45138SJuli Mallett 	found = false;
8136f45138SJuli Mallett 
8236f45138SJuli Mallett 	if (argc == 0) {
8336f45138SJuli Mallett 		if (search(sflag, qflag, stdin))
8436f45138SJuli Mallett 			found = true;
8536f45138SJuli Mallett 	} else {
8636f45138SJuli Mallett 		while (argc--) {
8736f45138SJuli Mallett 			file = *argv++;
8836f45138SJuli Mallett 			in = fopen(file, "r");
8936f45138SJuli Mallett 			if (in == NULL) {
9036f45138SJuli Mallett 				if (!qflag)
9136f45138SJuli Mallett 					warn("%s", file);
9236f45138SJuli Mallett 				continue;
931879eba7SRobert Nordier 			}
9436f45138SJuli Mallett 			if (!qflag)
9536f45138SJuli Mallett 				printf("%s:\n", file);
9636f45138SJuli Mallett 			if (search(sflag, qflag, in))
9736f45138SJuli Mallett 				found = true;
9836f45138SJuli Mallett 			fclose(in);
9936f45138SJuli Mallett 		}
10036f45138SJuli Mallett 	}
10136f45138SJuli Mallett 	exit(found ? 0 : 1);
1029b50d902SRodney W. Grimes }
1039b50d902SRodney W. Grimes 
104110ab594SPhilippe Charnier static void
105f4ac32deSDavid Malone usage(void)
106110ab594SPhilippe Charnier {
10736f45138SJuli Mallett 	fprintf(stderr, "usage: what [-qs] [file ...]\n");
108110ab594SPhilippe Charnier 	exit(1);
109110ab594SPhilippe Charnier }
110110ab594SPhilippe Charnier 
11136f45138SJuli Mallett bool
11236f45138SJuli Mallett search(bool one, bool quiet, FILE *in)
1139b50d902SRodney W. Grimes {
11436f45138SJuli Mallett 	bool found;
115f4ac32deSDavid Malone 	int c;
1169b50d902SRodney W. Grimes 
11736f45138SJuli Mallett 	found = false;
11836f45138SJuli Mallett 
11936f45138SJuli Mallett 	while ((c = getc(in)) != EOF) {
1209b50d902SRodney W. Grimes loop:		if (c != '@')
1219b50d902SRodney W. Grimes 			continue;
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 ((c = getc(in)) != ')')
1279b50d902SRodney W. Grimes 			goto loop;
12836f45138SJuli Mallett 		if (!quiet)
1299b50d902SRodney W. Grimes 			putchar('\t');
13036f45138SJuli Mallett 		while ((c = getc(in)) != EOF && c && c != '"' &&
1311879eba7SRobert Nordier 		    c != '>' && c != '\\' && c != '\n')
1329b50d902SRodney W. Grimes 			putchar(c);
1339b50d902SRodney W. Grimes 		putchar('\n');
13436f45138SJuli Mallett 		found = true;
13536f45138SJuli Mallett 		if (one)
13636f45138SJuli Mallett 			break;
1379b50d902SRodney W. Grimes 	}
13836f45138SJuli Mallett 	return (found);
1399b50d902SRodney W. Grimes }
140