[Toybox] [PATCH] grep: cleanup, add -Hs
Isaac
idunham at lavabit.com
Sat Jul 20 11:32:00 PDT 2013
On Sat, Jul 20, 2013 at 11:42:48AM -0500, Strake wrote:
> # HG changeset patch
> # User Strake
> # Date 1374338194 18000
> # Node ID 24cd187521c1c89f16cddb9b346c1da7e900ecdd
> # Parent 1cf9c28012a76dd30cd1a7fcba8251b189d7df5a
> grep
>
> partly due to Isaac Dunham
>
See inline comments below.
> diff -r 1cf9c28012a7 -r 24cd187521c1 toys/pending/grep.c
> --- a/toys/pending/grep.c Wed Jul 17 17:27:14 2013 -0500
> +++ b/toys/pending/grep.c Sat Jul 20 11:36:34 2013 -0500
> @@ -5,13 +5,13 @@
> * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/
> * See http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/cmdbehav.html
>
> -USE_GREP(NEWTOY(grep, "EFhinovclqe*f*m#", TOYFLAG_BIN))
> +USE_GREP(NEWTOY(grep, "EFHahinosvclqe*f*m#", TOYFLAG_BIN))
>
> config GREP
> bool "grep"
> default n
> help
> - usage: grep [-clq] [-EFhinov] (-e RE | -f REfile | RE) [file...]
> + usage: grep [-clq] [-EFHhinosv] (-e RE | -f REfile | RE) [file...]
>
> modes:
> default: print lines from each file what match regular expression RE.
> @@ -22,20 +22,18 @@
> flags:
> -E: extended RE syntax
> -F: fixed RE syntax, i.e. all characters literal
> + -H: print file name
> -h: not print file name
> -i: case insensitive
> -n: print line numbers
> -o: print only matching part
> + -s: keep silent on error
> -v: invert match
> */
>
> #define FOR_grep
> #include "toys.h"
> #include <regex.h>
> -#include <err.h>
> -
> -/* could be in GLOBALS but so need initialization code */
> -static int c = 1;
>
> static regex_t re; /* fails in GLOBALS */
>
> @@ -60,10 +58,12 @@
>
> while (regexec (&re, y, 1, &match, atBOL ? 0 : REG_NOTBOL) == 0) {
> if (atBOL) nMatch++;
> - c = 0; atBOL = 0;
> + toys.exitval = 0;
> + atBOL = 0;
> switch (TT.mode) {
> case 'q':
> - exit (0);
> + toys.exitval = 0;
I don't think switch(TT.mode) is changing toys.exitval.
> + xexit ();
> case 'l':
> if (!(toys.optflags & FLAG_h)) printf ("%s\n", name);
> free (x);
> @@ -121,7 +121,8 @@
> for (;;) {
> if (getline (&x, &l, f) < 0) {
> if (feof (f)) break;
> - err (2, "failed to read");
> + toys.exitval = 2;
> + perror_exit ("failed to read");
I'd think this should be "warn and see if there are more REs"...
But I could be wrong.
And this reminds me:
Any particular reason that buildRE() needs to be a one-call monster that
does all the regexes in a single pass?
I would have thought that the code used to parse TT.eArgu could be shared
with parsing each line of TT.fArgu.
Also, Rob: does error_exit really need toys.exitval to be set?
> }
> y = x + strlen (x) - 1;
> if (y[0] == '\n') y[0] = 0;
> @@ -129,14 +130,17 @@
> y = toys.optflags & FLAG_F ? regfix (x) : x;
> if (re_xs) re_xs = xastrcat (re_xs, "|");
> re_xs = xastrcat (re_xs, y);
> - free (y);
> + if (toys.optflags & FLAG_F) free (y);
> }
> free (x);
> fclose (f);
> }
>
> if (!re_xs) {
> - if (toys.optc < 1) errx (2, "no RE");
> + if (toys.optc < 1) {
> + toys.exitval = 2;
> + error_exit ("no RE");
> + }
> re_xs = toys.optflags & FLAG_F ? regfix (toys.optargs[0]) :
> toys.optargs[0];
> toys.optc--; toys.optargs++;
> }
> @@ -144,7 +148,8 @@
> if (regcomp (&re, re_xs,
> (toys.optflags & (FLAG_E | FLAG_F) ? REG_EXTENDED : 0) |
> (toys.optflags & FLAG_i ? REG_ICASE : 0)) != 0) {
You can remove the != 0.
> - errx (2, "bad RE");
> + toys.exitval = 2;
> + error_exit ("bad RE");
> }
> }
>
> @@ -155,8 +160,9 @@
> if (toys.optflags & FLAG_l) TT.mode = 'l';
> if (toys.optflags & FLAG_q) TT.mode = 'q';
>
> - if (toys.optc > 0) loopfiles (toys.optargs, do_grep);
> - else do_grep (0, "-");
> + if (!(toys.optflags & FLAG_H) && (toys.optc < 2)) toys.optflags |= FLAG_h;
>
> - exit (c);
> + toys.exitval = 1;
> + loopfiles_rw (toys.optargs, O_RDONLY, 0, toys.optflags & FLAG_s, do_grep);
> + xexit ();
> }
1374345120.0
More information about the Toybox
mailing list