diff options
-rw-r--r-- | Changelog | 4 | ||||
-rw-r--r-- | docs/busybox.pod | 3 | ||||
-rw-r--r-- | findutils/grep.c | 27 | ||||
-rw-r--r-- | grep.c | 27 |
4 files changed, 36 insertions, 25 deletions
@@ -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 diff --git a/docs/busybox.pod b/docs/busybox.pod index da89045..71444c0 100644 --- a/docs/busybox.pod +++ b/docs/busybox.pod @@ -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 $ diff --git a/findutils/grep.c b/findutils/grep.c index abdd442..06b6980 100644 --- a/findutils/grep.c +++ b/findutils/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); @@ -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); |