aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAri Sundholm <ari@tuxera.com>2019-01-28 19:41:12 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2019-01-29 14:53:22 +0100
commitd4b568c108b89fb726181b0fabb19f2d62bc1930 (patch)
treed3c2a54c68123890c055d334a1cb41623abc2f9f
parent9a9c6e39ba4c8f4f2cecb147c7e6464bec2d8b55 (diff)
downloadbusybox-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>
-rw-r--r--findutils/grep.c19
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, '-');