diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-05-03 20:34:41 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-05-03 20:34:41 -0700 |
commit | fdda5c19432ad7dc7f1b1823a058f6444f463372 (patch) | |
tree | 61cf6371e4ffbfc1ac6b1c638b4aff72fbee2844 /pw.c | |
parent | 906d31bf059bd206ef6054c668fe10b93f33b336 (diff) | |
download | pw-fdda5c19432ad7dc7f1b1823a058f6444f463372.tar.gz pw-fdda5c19432ad7dc7f1b1823a058f6444f463372.tar.bz2 pw-fdda5c19432ad7dc7f1b1823a058f6444f463372.zip |
New -g option to pre-load the grep stack.
Diffstat (limited to 'pw.c')
-rw-r--r-- | pw.c | 32 |
1 files changed, 31 insertions, 1 deletions
@@ -245,6 +245,7 @@ static void usage(void) "-d do not quit on end-of-input\n" "-E treat regular expressions as extended\n" "-B treat regular expressions as basic (default)\n\n" + "-g [!]pattern add pattern to grep stack; ! inverts.\n\n" "<command> represents an arbitrary command that generates the\n" "output to be monitored by %s.\n\n" "Standard input must be redirected; it cannot be the same device\n" @@ -725,7 +726,7 @@ int main(int argc, char **argv) } } - while ((opt = getopt(argc, argv, "n:i:l:dEB")) != -1) { + while ((opt = getopt(argc, argv, "n:i:l:dEBg:")) != -1) { switch (opt) { case 'n': { @@ -761,6 +762,35 @@ int main(int argc, char **argv) case 'B': regex_flags = 0; break; + case 'g': + { + grep *gr = &grepstack[ngrep]; + char *pat = optarg; + int inv = 0; + + if (ngrep >= maxgrep) { + error("too many patterns specified with -g\n"); + return EXIT_FAILURE; + } + + if (*pat == '!') { + inv = 1; + pat++; + } else if (strncmp(pat, "\\!", 2) == 0) { + pat++; + } + + if ((grinit(gr, dsdup(pat), inv, dsdrop)) != 0) { + char grmsg[cmdsize]; + grerrstr(gr, grmsg, sizeof grmsg); + error("-%c option: bad pattern %s: %s\n", opt, pat, grmsg); + return EXIT_FAILURE; + } + + ngrep++; + stat |= stat_grep; + } + break; default: usage(); } |