diff options
Diffstat (limited to 'findutils/grep.c')
-rw-r--r-- | findutils/grep.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/findutils/grep.c b/findutils/grep.c index f5f95cb95..615cacac4 100644 --- a/findutils/grep.c +++ b/findutils/grep.c | |||
@@ -383,6 +383,8 @@ static int grep_file(FILE *file) | |||
383 | } else { | 383 | } else { |
384 | #if ENABLE_EXTRA_COMPAT | 384 | #if ENABLE_EXTRA_COMPAT |
385 | unsigned start_pos; | 385 | unsigned start_pos; |
386 | #else | ||
387 | int match_flg; | ||
386 | #endif | 388 | #endif |
387 | char *match_at; | 389 | char *match_at; |
388 | 390 | ||
@@ -400,6 +402,7 @@ static int grep_file(FILE *file) | |||
400 | #if !ENABLE_EXTRA_COMPAT | 402 | #if !ENABLE_EXTRA_COMPAT |
401 | gl->matched_range.rm_so = 0; | 403 | gl->matched_range.rm_so = 0; |
402 | gl->matched_range.rm_eo = 0; | 404 | gl->matched_range.rm_eo = 0; |
405 | match_flg = 0; | ||
403 | #else | 406 | #else |
404 | start_pos = 0; | 407 | start_pos = 0; |
405 | #endif | 408 | #endif |
@@ -408,7 +411,7 @@ static int grep_file(FILE *file) | |||
408 | //bb_error_msg("'%s' start_pos:%d line_len:%d", match_at, start_pos, line_len); | 411 | //bb_error_msg("'%s' start_pos:%d line_len:%d", match_at, start_pos, line_len); |
409 | if ( | 412 | if ( |
410 | #if !ENABLE_EXTRA_COMPAT | 413 | #if !ENABLE_EXTRA_COMPAT |
411 | regexec(&gl->compiled_regex, match_at, 1, &gl->matched_range, 0) == 0 | 414 | regexec(&gl->compiled_regex, match_at, 1, &gl->matched_range, match_flg) == 0 |
412 | #else | 415 | #else |
413 | re_search(&gl->compiled_regex, match_at, line_len, | 416 | re_search(&gl->compiled_regex, match_at, line_len, |
414 | start_pos, /*range:*/ line_len, | 417 | start_pos, /*range:*/ line_len, |
@@ -423,13 +426,15 @@ static int grep_file(FILE *file) | |||
423 | found = 1; | 426 | found = 1; |
424 | } else { | 427 | } else { |
425 | char c = ' '; | 428 | char c = ' '; |
426 | if (gl->matched_range.rm_so) | 429 | if (match_at > line || gl->matched_range.rm_so != 0) { |
427 | c = match_at[gl->matched_range.rm_so - 1]; | 430 | c = match_at[gl->matched_range.rm_so - 1]; |
431 | } | ||
428 | if (!isalnum(c) && c != '_') { | 432 | if (!isalnum(c) && c != '_') { |
429 | c = match_at[gl->matched_range.rm_eo]; | 433 | c = match_at[gl->matched_range.rm_eo]; |
430 | if (!c || (!isalnum(c) && c != '_')) { | 434 | } |
431 | found = 1; | 435 | if (!isalnum(c) && c != '_') { |
432 | } else { | 436 | found = 1; |
437 | } else { | ||
433 | /* | 438 | /* |
434 | * Why check gl->matched_range.rm_eo? | 439 | * Why check gl->matched_range.rm_eo? |
435 | * Zero-length match makes -w skip the line: | 440 | * Zero-length match makes -w skip the line: |
@@ -438,17 +443,17 @@ static int grep_file(FILE *file) | |||
438 | * Without such check, we can loop forever. | 443 | * Without such check, we can loop forever. |
439 | */ | 444 | */ |
440 | #if !ENABLE_EXTRA_COMPAT | 445 | #if !ENABLE_EXTRA_COMPAT |
441 | if (gl->matched_range.rm_eo != 0) { | 446 | if (gl->matched_range.rm_eo != 0) { |
442 | match_at += gl->matched_range.rm_eo; | 447 | match_at += gl->matched_range.rm_eo; |
443 | goto opt_w_again; | 448 | match_flg |= REG_NOTBOL; |
444 | } | 449 | goto opt_w_again; |
450 | } | ||
445 | #else | 451 | #else |
446 | if (gl->matched_range.rm_eo > start_pos) { | 452 | if (gl->matched_range.rm_eo > start_pos) { |
447 | start_pos = gl->matched_range.rm_eo; | 453 | start_pos = gl->matched_range.rm_eo; |
448 | goto opt_w_again; | 454 | goto opt_w_again; |
449 | } | ||
450 | #endif | ||
451 | } | 455 | } |
456 | #endif | ||
452 | } | 457 | } |
453 | } | 458 | } |
454 | } | 459 | } |