diff options
author | Ari Sundholm <ari@tuxera.com> | 2019-01-28 19:41:12 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2019-01-29 14:53:22 +0100 |
commit | d4b568c108b89fb726181b0fabb19f2d62bc1930 (patch) | |
tree | d3c2a54c68123890c055d334a1cb41623abc2f9f /findutils | |
parent | 9a9c6e39ba4c8f4f2cecb147c7e6464bec2d8b55 (diff) | |
download | busybox-d4b568c108b89fb726181b0fabb19f2d62bc1930.tar.gz |
grep: short-circuit -v to bail out on first match
A small optimization. There is no need to try matching the current
input line against any further patterns if a match was already
found and -v is specified.
function old new delta
grep_file 1463 1440 -23
Signed-off-by: Ari Sundholm <ari@tuxera.com>
Signed-off-by: Niko Vähäsarja <niko@tuxera.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'findutils')
-rw-r--r-- | findutils/grep.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/findutils/grep.c b/findutils/grep.c index 9d9da422c..2cbe7ea91 100644 --- a/findutils/grep.c +++ b/findutils/grep.c @@ -443,15 +443,23 @@ static int grep_file(FILE *file) } } } - /* If it's non-inverted search, we can stop - * at first match */ - if (found && !invert_search) - goto do_found; + /* If it's a non-inverted search, we can stop + * at first match and report it. + * If it's an inverted search, we can move on + * to the next line of input, ignoring the + * rest of the patterns. + */ + if (found) { + //if (invert_search) + // goto do_not_found; + //goto do_found; + break; // this accomplishes both + } pattern_ptr = pattern_ptr->link; } /* while (pattern_ptr) */ if (found ^ invert_search) { - do_found: + //do_found: /* keep track of matches */ nmatches++; @@ -552,6 +560,7 @@ static int grep_file(FILE *file) } #if ENABLE_FEATURE_GREP_CONTEXT else { /* no match */ + //do_not_found: /* if we need to print some context lines after the last match, do so */ if (print_n_lines_after) { print_line(line, strlen(line), linenum, '-'); |