grep: be GNU compatible with -f EMPTY_FILE
authorLauri Kasanen <curaga@operamail.com>
Sun, 28 Aug 2011 10:39:04 +0000 (12:39 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 28 Aug 2011 10:39:04 +0000 (12:39 +0200)
Signed-off-by: Lauri Kasanen <curaga@operamail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
findutils/grep.c
testsuite/grep.tests

index 3acfa91..5f42242 100644 (file)
@@ -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;
index ffce033..006a215 100755 (executable)
@@ -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