aboutsummaryrefslogtreecommitdiff
path: root/findutils/grep.c
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2013-08-27 16:10:53 +0100
committerRon Yorston <rmy@pobox.com>2013-08-27 16:10:53 +0100
commit3fd34651ea72ea1c335d3170f234cb0517fd897f (patch)
tree36e8fc40cffd464ffda4759020777dd3ca23ca31 /findutils/grep.c
parente3ac39098326de084a805d0dd31db9666b734f20 (diff)
parentd6ae4fb446daedfe3073d67be655942e9fa7eb18 (diff)
downloadbusybox-w32-3fd34651ea72ea1c335d3170f234cb0517fd897f.tar.gz
busybox-w32-3fd34651ea72ea1c335d3170f234cb0517fd897f.tar.bz2
busybox-w32-3fd34651ea72ea1c335d3170f234cb0517fd897f.zip
Merge branch 'busybox' into merge
Diffstat (limited to 'findutils/grep.c')
-rw-r--r--findutils/grep.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/findutils/grep.c b/findutils/grep.c
index 6b47f4327..5bbe61100 100644
--- a/findutils/grep.c
+++ b/findutils/grep.c
@@ -381,6 +381,8 @@ static int grep_file(FILE *file)
381 opt_f_not_found: ; 381 opt_f_not_found: ;
382 } 382 }
383 } else { 383 } else {
384 char *match_at;
385
384 if (!(gl->flg_mem_alocated_compiled & COMPILED)) { 386 if (!(gl->flg_mem_alocated_compiled & COMPILED)) {
385 gl->flg_mem_alocated_compiled |= COMPILED; 387 gl->flg_mem_alocated_compiled |= COMPILED;
386#if !ENABLE_EXTRA_COMPAT 388#if !ENABLE_EXTRA_COMPAT
@@ -396,32 +398,36 @@ static int grep_file(FILE *file)
396 gl->matched_range.rm_so = 0; 398 gl->matched_range.rm_so = 0;
397 gl->matched_range.rm_eo = 0; 399 gl->matched_range.rm_eo = 0;
398#endif 400#endif
401 match_at = line;
402 opt_w_again:
399 if ( 403 if (
400#if !ENABLE_EXTRA_COMPAT 404#if !ENABLE_EXTRA_COMPAT
401 regexec(&gl->compiled_regex, line, 1, &gl->matched_range, 0) == 0 405 regexec(&gl->compiled_regex, match_at, 1, &gl->matched_range, 0) == 0
402#else 406#else
403 re_search(&gl->compiled_regex, line, line_len, 407 re_search(&gl->compiled_regex, match_at, line_len,
404 /*start:*/ 0, /*range:*/ line_len, 408 /*start:*/ 0, /*range:*/ line_len,
405 &gl->matched_range) >= 0 409 &gl->matched_range) >= 0
406#endif 410#endif
407 ) { 411 ) {
408 if (option_mask32 & OPT_x) { 412 if (option_mask32 & OPT_x) {
409 found = (gl->matched_range.rm_so == 0 413 found = (gl->matched_range.rm_so == 0
410 && line[gl->matched_range.rm_eo] == '\0'); 414 && match_at[gl->matched_range.rm_eo] == '\0');
411 } else 415 } else
412 if (!(option_mask32 & OPT_w)) { 416 if (!(option_mask32 & OPT_w)) {
413 found = 1; 417 found = 1;
414 } else { 418 } else {
415 char c = ' '; 419 char c = ' ';
416 if (gl->matched_range.rm_so) 420 if (gl->matched_range.rm_so)
417 c = line[gl->matched_range.rm_so - 1]; 421 c = match_at[gl->matched_range.rm_so - 1];
418 if (!isalnum(c) && c != '_') { 422 if (!isalnum(c) && c != '_') {
419 c = line[gl->matched_range.rm_eo]; 423 c = match_at[gl->matched_range.rm_eo];
420 if (!c || (!isalnum(c) && c != '_')) 424 if (!c || (!isalnum(c) && c != '_')) {
421 found = 1; 425 found = 1;
426 } else {
427 match_at += gl->matched_range.rm_eo;
428 goto opt_w_again;
429 }
422 } 430 }
423//BUG: "echo foop foo | grep -w foo" should match, but doesn't:
424//we bail out on first "mismatch" because it's not a word.
425 } 431 }
426 } 432 }
427 } 433 }
@@ -718,7 +724,7 @@ int grep_main(int argc UNUSED_PARAM, char **argv)
718 option_mask32 |= OPT_F; 724 option_mask32 |= OPT_F;
719 725
720#if !ENABLE_EXTRA_COMPAT 726#if !ENABLE_EXTRA_COMPAT
721 if (!(option_mask32 & (OPT_o | OPT_w))) 727 if (!(option_mask32 & (OPT_o | OPT_w | OPT_x)))
722 reflags = REG_NOSUB; 728 reflags = REG_NOSUB;
723#endif 729#endif
724 730