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