xref: /freebsd/usr.bin/what/what.c (revision 0b8224d1cc9dc6c9778ba04a75b2c8d47e5d7481)
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 
3205c5fed8SPhilippe Charnier #include <err.h>
3336f45138SJuli Mallett #include <stdbool.h>
349b50d902SRodney W. Grimes #include <stdio.h>
351879eba7SRobert Nordier #include <stdlib.h>
361879eba7SRobert Nordier #include <unistd.h>
371879eba7SRobert Nordier 
38*cccdaf50SAlfonso Gregory static void usage(void) __dead2;
3936f45138SJuli Mallett static bool search(bool, bool, FILE *);
4005c5fed8SPhilippe Charnier 
4105c5fed8SPhilippe Charnier int
main(int argc,char * argv[])4236f45138SJuli Mallett main(int argc, char *argv[])
439b50d902SRodney W. Grimes {
4436f45138SJuli Mallett 	const char *file;
4536f45138SJuli Mallett 	FILE *in;
4636f45138SJuli Mallett 	bool found, qflag, sflag;
471879eba7SRobert Nordier 	int c;
481879eba7SRobert Nordier 
4936f45138SJuli Mallett 	qflag = sflag = false;
5036f45138SJuli Mallett 
5136f45138SJuli Mallett 	while ((c = getopt(argc, argv, "qs")) != -1) {
521879eba7SRobert Nordier 		switch (c) {
5336f45138SJuli Mallett 		case 'q':
5436f45138SJuli Mallett 			qflag = true;
5536f45138SJuli Mallett 			break;
561879eba7SRobert Nordier 		case 's':
5736f45138SJuli Mallett 			sflag = true;
581879eba7SRobert Nordier 			break;
591879eba7SRobert Nordier 		default:
60110ab594SPhilippe Charnier 			usage();
611879eba7SRobert Nordier 		}
6236f45138SJuli Mallett 	}
6336f45138SJuli Mallett 	argc -= optind;
641879eba7SRobert Nordier 	argv += optind;
651879eba7SRobert Nordier 
6636f45138SJuli Mallett 	found = false;
6736f45138SJuli Mallett 
6836f45138SJuli Mallett 	if (argc == 0) {
6936f45138SJuli Mallett 		if (search(sflag, qflag, stdin))
7036f45138SJuli Mallett 			found = true;
7136f45138SJuli Mallett 	} else {
7236f45138SJuli Mallett 		while (argc--) {
7336f45138SJuli Mallett 			file = *argv++;
7436f45138SJuli Mallett 			in = fopen(file, "r");
7536f45138SJuli Mallett 			if (in == NULL) {
7636f45138SJuli Mallett 				if (!qflag)
7736f45138SJuli Mallett 					warn("%s", file);
7836f45138SJuli Mallett 				continue;
791879eba7SRobert Nordier 			}
8036f45138SJuli Mallett 			if (!qflag)
8136f45138SJuli Mallett 				printf("%s:\n", file);
8236f45138SJuli Mallett 			if (search(sflag, qflag, in))
8336f45138SJuli Mallett 				found = true;
8436f45138SJuli Mallett 			fclose(in);
8536f45138SJuli Mallett 		}
8636f45138SJuli Mallett 	}
8736f45138SJuli Mallett 	exit(found ? 0 : 1);
889b50d902SRodney W. Grimes }
899b50d902SRodney W. Grimes 
90110ab594SPhilippe Charnier static void
usage(void)91f4ac32deSDavid Malone usage(void)
92110ab594SPhilippe Charnier {
9336f45138SJuli Mallett 	fprintf(stderr, "usage: what [-qs] [file ...]\n");
94110ab594SPhilippe Charnier 	exit(1);
95110ab594SPhilippe Charnier }
96110ab594SPhilippe Charnier 
9736f45138SJuli Mallett bool
search(bool one,bool quiet,FILE * in)9836f45138SJuli Mallett search(bool one, bool quiet, FILE *in)
999b50d902SRodney W. Grimes {
10036f45138SJuli Mallett 	bool found;
101f4ac32deSDavid Malone 	int c;
1029b50d902SRodney W. Grimes 
10336f45138SJuli Mallett 	found = false;
10436f45138SJuli Mallett 
10536f45138SJuli Mallett 	while ((c = getc(in)) != EOF) {
1069b50d902SRodney W. Grimes loop:		if (c != '@')
1079b50d902SRodney W. Grimes 			continue;
10836f45138SJuli Mallett 		if ((c = getc(in)) != '(')
1099b50d902SRodney W. Grimes 			goto loop;
11036f45138SJuli Mallett 		if ((c = getc(in)) != '#')
1119b50d902SRodney W. Grimes 			goto loop;
11236f45138SJuli Mallett 		if ((c = getc(in)) != ')')
1139b50d902SRodney W. Grimes 			goto loop;
11436f45138SJuli Mallett 		if (!quiet)
1159b50d902SRodney W. Grimes 			putchar('\t');
11636f45138SJuli Mallett 		while ((c = getc(in)) != EOF && c && c != '"' &&
1171879eba7SRobert Nordier 		    c != '>' && c != '\\' && c != '\n')
1189b50d902SRodney W. Grimes 			putchar(c);
1199b50d902SRodney W. Grimes 		putchar('\n');
12036f45138SJuli Mallett 		found = true;
12136f45138SJuli Mallett 		if (one)
12236f45138SJuli Mallett 			break;
1239b50d902SRodney W. Grimes 	}
12436f45138SJuli Mallett 	return (found);
1259b50d902SRodney W. Grimes }
126