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