diff options
author | Ron Yorston <rmy@pobox.com> | 2013-08-27 16:10:53 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2013-08-27 16:10:53 +0100 |
commit | 3fd34651ea72ea1c335d3170f234cb0517fd897f (patch) | |
tree | 36e8fc40cffd464ffda4759020777dd3ca23ca31 /findutils/grep.c | |
parent | e3ac39098326de084a805d0dd31db9666b734f20 (diff) | |
parent | d6ae4fb446daedfe3073d67be655942e9fa7eb18 (diff) | |
download | busybox-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.c | 24 |
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 | ||