+ grep -v # yay!
authorJohn Beppu <beppu@lbox.org>
Mon, 24 Apr 2000 18:07:30 +0000 (18:07 -0000)
committerJohn Beppu <beppu@lbox.org>
Mon, 24 Apr 2000 18:07:30 +0000 (18:07 -0000)
Changelog
docs/busybox.pod
findutils/grep.c
grep.c

index d6f7a489ca87a68e49293dd3665b704fdbf7f5d1..823f9eef686ab20b64af0370f42954af14eb59fb 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,7 @@
+0.44
+        * added the -v option (inverted search) to grep,
+            updated docs/busybox.pod accordingly.  -beppu
+
 0.43
        * Major update to the provided documentation.
        * Busybox now includes a shell!  It currently costs 7.5 k (plus an
index da890458cf15f3d90046516e768ea1bd52526c66..71444c0828c1548a982df1c14ac56eb9cf2d5244 100644 (file)
@@ -542,6 +542,7 @@ OPTIONS:
        -i      ignore case distinctions
        -n      print line number with output lines
        -q      be quiet. Returns 0 if result was found, 1 otherwise
+    -v      select non-matching lines
 
 This version of grep matches full regular expresions.
 
@@ -1816,4 +1817,4 @@ Enrique Zanardi <ezanardi@ull.es>
 
 =cut
 
-# $Id: busybox.pod,v 1.21 2000/04/21 21:53:58 erik Exp $
+# $Id: busybox.pod,v 1.22 2000/04/24 18:07:30 beppu Exp $
index abdd4423602ea0cb0e3717c761bc728348f37614..06b6980bc02fd64a92e7d1bc5a75d9f57fa0cf73 100644 (file)
@@ -47,7 +47,8 @@ static const char grep_usage[] =
        "\t-h\tsuppress the prefixing filename on output\n"
        "\t-i\tignore case distinctions\n"
        "\t-n\tprint line number with output lines\n"
-       "\t-q\tbe quiet. Returns 0 if result was found, 1 otherwise\n\n"
+       "\t-q\tbe quiet. Returns 0 if result was found, 1 otherwise\n"
+       "\t-v\tselect non-matching lines\n\n"
 #if defined BB_REGEXP
        "This version of grep matches full regular expresions.\n";
 #else
@@ -57,11 +58,12 @@ static const char grep_usage[] =
 static int match = FALSE, beQuiet = FALSE;
 
 static void do_grep(FILE * fp, char *needle, char *fileName, int tellName,
-                                       int ignoreCase, int tellLine)
+                                       int ignoreCase, int tellLine, int invertSearch)
 {
        char *cp;
        long line = 0;
        char haystack[BUF_SIZE];
+       int  truth = !invertSearch;
 
        while (fgets(haystack, sizeof(haystack), fp)) {
                line++;
@@ -70,7 +72,7 @@ static void do_grep(FILE * fp, char *needle, char *fileName, int tellName,
                if (*cp != '\n')
                        fprintf(stderr, "%s: Line too long\n", fileName);
 
-               if (find_match(haystack, needle, ignoreCase) == TRUE) {
+               if (find_match(haystack, needle, ignoreCase) == truth) {
                        if (tellName == TRUE)
                                printf("%s:", fileName);
 
@@ -92,13 +94,10 @@ extern int grep_main(int argc, char **argv)
        char *cp;
        char *needle;
        char *fileName;
-       int tellName = TRUE;
-       int ignoreCase = TRUE;
-       int tellLine = FALSE;
-
-
-       ignoreCase = FALSE;
-       tellLine = FALSE;
+       int tellName     = TRUE;
+       int ignoreCase   = FALSE;
+       int tellLine     = FALSE;
+       int invertSearch = FALSE;
 
        argc--;
        argv++;
@@ -128,6 +127,10 @@ extern int grep_main(int argc, char **argv)
                                beQuiet = TRUE;
                                break;
 
+                       case 'v':
+                               invertSearch = TRUE;
+                               break;
+
                        default:
                                usage(grep_usage);
                        }
@@ -137,7 +140,7 @@ extern int grep_main(int argc, char **argv)
        argc--;
 
        if (argc == 0) {
-               do_grep(stdin, needle, "stdin", FALSE, ignoreCase, tellLine);
+               do_grep(stdin, needle, "stdin", FALSE, ignoreCase, tellLine, invertSearch);
        } else {
                /* Never print the filename for just one file */
                if (argc == 1)
@@ -151,7 +154,7 @@ extern int grep_main(int argc, char **argv)
                                continue;
                        }
 
-                       do_grep(fp, needle, fileName, tellName, ignoreCase, tellLine);
+                       do_grep(fp, needle, fileName, tellName, ignoreCase, tellLine, invertSearch);
 
                        if (ferror(fp))
                                perror(fileName);
diff --git a/grep.c b/grep.c
index abdd4423602ea0cb0e3717c761bc728348f37614..06b6980bc02fd64a92e7d1bc5a75d9f57fa0cf73 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -47,7 +47,8 @@ static const char grep_usage[] =
        "\t-h\tsuppress the prefixing filename on output\n"
        "\t-i\tignore case distinctions\n"
        "\t-n\tprint line number with output lines\n"
-       "\t-q\tbe quiet. Returns 0 if result was found, 1 otherwise\n\n"
+       "\t-q\tbe quiet. Returns 0 if result was found, 1 otherwise\n"
+       "\t-v\tselect non-matching lines\n\n"
 #if defined BB_REGEXP
        "This version of grep matches full regular expresions.\n";
 #else
@@ -57,11 +58,12 @@ static const char grep_usage[] =
 static int match = FALSE, beQuiet = FALSE;
 
 static void do_grep(FILE * fp, char *needle, char *fileName, int tellName,
-                                       int ignoreCase, int tellLine)
+                                       int ignoreCase, int tellLine, int invertSearch)
 {
        char *cp;
        long line = 0;
        char haystack[BUF_SIZE];
+       int  truth = !invertSearch;
 
        while (fgets(haystack, sizeof(haystack), fp)) {
                line++;
@@ -70,7 +72,7 @@ static void do_grep(FILE * fp, char *needle, char *fileName, int tellName,
                if (*cp != '\n')
                        fprintf(stderr, "%s: Line too long\n", fileName);
 
-               if (find_match(haystack, needle, ignoreCase) == TRUE) {
+               if (find_match(haystack, needle, ignoreCase) == truth) {
                        if (tellName == TRUE)
                                printf("%s:", fileName);
 
@@ -92,13 +94,10 @@ extern int grep_main(int argc, char **argv)
        char *cp;
        char *needle;
        char *fileName;
-       int tellName = TRUE;
-       int ignoreCase = TRUE;
-       int tellLine = FALSE;
-
-
-       ignoreCase = FALSE;
-       tellLine = FALSE;
+       int tellName     = TRUE;
+       int ignoreCase   = FALSE;
+       int tellLine     = FALSE;
+       int invertSearch = FALSE;
 
        argc--;
        argv++;
@@ -128,6 +127,10 @@ extern int grep_main(int argc, char **argv)
                                beQuiet = TRUE;
                                break;
 
+                       case 'v':
+                               invertSearch = TRUE;
+                               break;
+
                        default:
                                usage(grep_usage);
                        }
@@ -137,7 +140,7 @@ extern int grep_main(int argc, char **argv)
        argc--;
 
        if (argc == 0) {
-               do_grep(stdin, needle, "stdin", FALSE, ignoreCase, tellLine);
+               do_grep(stdin, needle, "stdin", FALSE, ignoreCase, tellLine, invertSearch);
        } else {
                /* Never print the filename for just one file */
                if (argc == 1)
@@ -151,7 +154,7 @@ extern int grep_main(int argc, char **argv)
                                continue;
                        }
 
-                       do_grep(fp, needle, fileName, tellName, ignoreCase, tellLine);
+                       do_grep(fp, needle, fileName, tellName, ignoreCase, tellLine, invertSearch);
 
                        if (ferror(fp))
                                perror(fileName);