diff options
-rw-r--r-- | findutils/grep.c | 22 | ||||
-rwxr-xr-x | testsuite/grep.tests | 18 |
2 files changed, 30 insertions, 10 deletions
diff --git a/findutils/grep.c b/findutils/grep.c index 3acfa9197..5f4224203 100644 --- a/findutils/grep.c +++ b/findutils/grep.c @@ -562,20 +562,20 @@ static char *add_grep_list_data(char *pattern) static void load_regexes_from_file(llist_t *fopt) { - char *line; - FILE *f; - while (fopt) { + char *line; + FILE *fp; llist_t *cur = fopt; char *ffile = cur->data; fopt = cur->link; free(cur); - f = xfopen_stdin(ffile); - while ((line = xmalloc_fgetline(f)) != NULL) { + fp = xfopen_stdin(ffile); + while ((line = xmalloc_fgetline(fp)) != NULL) { llist_add_to(&pattern_head, new_grep_list_data(line, ALLOCATED)); } + fclose_if_not_stdin(fp); } } @@ -659,15 +659,19 @@ int grep_main(int argc UNUSED_PARAM, char **argv) #endif invert_search = ((option_mask32 & OPT_v) != 0); /* 0 | 1 */ - if (pattern_head != NULL) { - /* convert char **argv to grep_list_data_t */ + { /* convert char **argv to grep_list_data_t */ llist_t *cur; - for (cur = pattern_head; cur; cur = cur->link) cur->data = new_grep_list_data(cur->data, 0); } - if (option_mask32 & OPT_f) + if (option_mask32 & OPT_f) { load_regexes_from_file(fopt); + if (!pattern_head) { /* -f EMPTY_FILE? */ + /* GNU grep treats it as "nothing matches" */ + llist_add_to(&pattern_head, new_grep_list_data((char*) "", 0)); + invert_search ^= 1; + } + } if (ENABLE_FEATURE_GREP_FGREP_ALIAS && applet_name[0] == 'f') option_mask32 |= OPT_F; diff --git a/testsuite/grep.tests b/testsuite/grep.tests index ffce033e6..006a215e1 100755 --- a/testsuite/grep.tests +++ b/testsuite/grep.tests @@ -7,7 +7,7 @@ . ./testing.sh -# testing "test name" "options" "expected result" "file input" "stdin" +# testing "test name" "commands" "expected result" "file input" "stdin" # file input will be file called "input" # test can create a file "actual" instead of writing to stdout @@ -103,4 +103,20 @@ testing "grep -o does not loop forever on zero-length match" \ "" \ "" "test\n" +testing "grep -f EMPTY_FILE" \ + "grep -f input" \ + "" \ + "" \ + "test\n" + +testing "grep -v -f EMPTY_FILE" \ + "grep -v -f input" \ + "test\n" \ + "" \ + "test\n" + +# testing "test name" "commands" "expected result" "file input" "stdin" +# file input will be file called "input" +# test can create a file "actual" instead of writing to stdout + exit $FAILCOUNT |