[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