Add a flag (-q) which prints no header for the file and which doesn't indent the

match text; it also doesn't warn() for files which can't be opened.  Remove
global variables.  Use bool.  fopen(3) the files instead of freopen(3)ing stdin.
This commit is contained in:
Juli Mallett 2005-05-12 18:57:37 +00:00
parent 3b7d275a3d
commit 36f45138fb
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=146163
2 changed files with 61 additions and 33 deletions

View File

@ -41,7 +41,7 @@
.Nd "show what versions of object modules were used to construct a file" .Nd "show what versions of object modules were used to construct a file"
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl s .Op Fl qs
.Op Ar .Op Ar
.Sh DESCRIPTION .Sh DESCRIPTION
The The
@ -59,6 +59,8 @@ character, or backslash.
.Pp .Pp
The following option is available: The following option is available:
.Bl -tag -width Ds .Bl -tag -width Ds
.It Fl q
Only output the match text, rather than formatting it.
.It Fl s .It Fl s
Stop searching each file after the first match. Stop searching each file after the first match.
.El .El
@ -72,6 +74,11 @@ The
.Nm .Nm
utility conforms to utility conforms to
.St -p1003.1-2001 . .St -p1003.1-2001 .
The
.Fl q
option is a non-standard
.Fx
extension which may not be available on other operating systems.
.Sh HISTORY .Sh HISTORY
The The
.Nm .Nm

View File

@ -46,75 +46,96 @@ static const char sccsid[] = "@(#)what.c 8.1 (Berkeley) 6/6/93";
#endif #endif
#include <err.h> #include <err.h>
#include <stdbool.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
static int sflag;
static int found;
void search(void);
static void usage(void); static void usage(void);
static bool search(bool, bool, FILE *);
/*
* what
*/
int int
main(int argc, char **argv) main(int argc, char *argv[])
{ {
const char *file;
FILE *in;
bool found, qflag, sflag;
int c; int c;
while ((c = getopt(argc, argv, "s")) != -1) qflag = sflag = false;
while ((c = getopt(argc, argv, "qs")) != -1) {
switch (c) { switch (c) {
case 'q':
qflag = true;
break;
case 's': case 's':
sflag = 1; sflag = true;
break; break;
default: default:
usage(); usage();
} }
}
argc -= optind;
argv += optind; argv += optind;
if (!*argv) found = false;
search();
else do { if (argc == 0) {
if (!freopen(*argv, "r", stdin)) if (search(sflag, qflag, stdin))
warn("%s", *argv); found = true;
else { } else {
printf("%s:\n", *argv); while (argc--) {
search(); file = *argv++;
in = fopen(file, "r");
if (in == NULL) {
if (!qflag)
warn("%s", file);
continue;
}
if (!qflag)
printf("%s:\n", file);
if (search(sflag, qflag, in))
found = true;
fclose(in);
} }
} while(*++argv); }
exit(!found); exit(found ? 0 : 1);
} }
static void static void
usage(void) usage(void)
{ {
(void)fprintf(stderr, "usage: what [-s] [file ...]\n"); fprintf(stderr, "usage: what [-qs] [file ...]\n");
exit(1); exit(1);
} }
void bool
search(void) search(bool one, bool quiet, FILE *in)
{ {
bool found;
int c; int c;
while ((c = getchar()) != EOF) { found = false;
while ((c = getc(in)) != EOF) {
loop: if (c != '@') loop: if (c != '@')
continue; continue;
if ((c = getchar()) != '(') if ((c = getc(in)) != '(')
goto loop; goto loop;
if ((c = getchar()) != '#') if ((c = getc(in)) != '#')
goto loop; goto loop;
if ((c = getchar()) != ')') if ((c = getc(in)) != ')')
goto loop; goto loop;
putchar('\t'); if (!quiet)
while ((c = getchar()) != EOF && c && c != '"' && putchar('\t');
while ((c = getc(in)) != EOF && c && c != '"' &&
c != '>' && c != '\\' && c != '\n') c != '>' && c != '\\' && c != '\n')
putchar(c); putchar(c);
putchar('\n'); putchar('\n');
found = 1; found = true;
if (sflag) if (one)
return; break;
} }
return (found);
} }