summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLauri Kasanen2011-08-28 12:39:04 +0200
committerDenys Vlasenko2011-08-28 12:39:04 +0200
commit7b46220d922d7c6267a8442ff8c3a6d1ab106727 (patch)
tree599a640d94d61d38350d127c36cb234871e213ba
parent2390109dcbc7769c8cc373db32805206522ca9a6 (diff)
downloadbusybox-7b46220d922d7c6267a8442ff8c3a6d1ab106727.zip
busybox-7b46220d922d7c6267a8442ff8c3a6d1ab106727.tar.gz
grep: be GNU compatible with -f EMPTY_FILE
Signed-off-by: Lauri Kasanen <curaga@operamail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--findutils/grep.c22
-rwxr-xr-xtestsuite/grep.tests18
2 files changed, 30 insertions, 10 deletions
diff --git a/findutils/grep.c b/findutils/grep.c
index 3acfa91..5f42242 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 ffce033..006a215 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