aboutsummaryrefslogtreecommitdiff
path: root/findutils/grep.c
diff options
context:
space:
mode:
Diffstat (limited to 'findutils/grep.c')
-rw-r--r--findutils/grep.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/findutils/grep.c b/findutils/grep.c
index 5bbe61100..f5f95cb95 100644
--- a/findutils/grep.c
+++ b/findutils/grep.c
@@ -381,6 +381,9 @@ static int grep_file(FILE *file)
381 opt_f_not_found: ; 381 opt_f_not_found: ;
382 } 382 }
383 } else { 383 } else {
384#if ENABLE_EXTRA_COMPAT
385 unsigned start_pos;
386#endif
384 char *match_at; 387 char *match_at;
385 388
386 if (!(gl->flg_mem_alocated_compiled & COMPILED)) { 389 if (!(gl->flg_mem_alocated_compiled & COMPILED)) {
@@ -397,15 +400,18 @@ static int grep_file(FILE *file)
397#if !ENABLE_EXTRA_COMPAT 400#if !ENABLE_EXTRA_COMPAT
398 gl->matched_range.rm_so = 0; 401 gl->matched_range.rm_so = 0;
399 gl->matched_range.rm_eo = 0; 402 gl->matched_range.rm_eo = 0;
403#else
404 start_pos = 0;
400#endif 405#endif
401 match_at = line; 406 match_at = line;
402 opt_w_again: 407 opt_w_again:
408//bb_error_msg("'%s' start_pos:%d line_len:%d", match_at, start_pos, line_len);
403 if ( 409 if (
404#if !ENABLE_EXTRA_COMPAT 410#if !ENABLE_EXTRA_COMPAT
405 regexec(&gl->compiled_regex, match_at, 1, &gl->matched_range, 0) == 0 411 regexec(&gl->compiled_regex, match_at, 1, &gl->matched_range, 0) == 0
406#else 412#else
407 re_search(&gl->compiled_regex, match_at, line_len, 413 re_search(&gl->compiled_regex, match_at, line_len,
408 /*start:*/ 0, /*range:*/ line_len, 414 start_pos, /*range:*/ line_len,
409 &gl->matched_range) >= 0 415 &gl->matched_range) >= 0
410#endif 416#endif
411 ) { 417 ) {
@@ -424,8 +430,24 @@ static int grep_file(FILE *file)
424 if (!c || (!isalnum(c) && c != '_')) { 430 if (!c || (!isalnum(c) && c != '_')) {
425 found = 1; 431 found = 1;
426 } else { 432 } else {
427 match_at += gl->matched_range.rm_eo; 433 /*
428 goto opt_w_again; 434 * Why check gl->matched_range.rm_eo?
435 * Zero-length match makes -w skip the line:
436 * "echo foo | grep ^" prints "foo",
437 * "echo foo | grep -w ^" prints nothing.
438 * Without such check, we can loop forever.
439 */
440#if !ENABLE_EXTRA_COMPAT
441 if (gl->matched_range.rm_eo != 0) {
442 match_at += gl->matched_range.rm_eo;
443 goto opt_w_again;
444 }
445#else
446 if (gl->matched_range.rm_eo > start_pos) {
447 start_pos = gl->matched_range.rm_eo;
448 goto opt_w_again;
449 }
450#endif
429 } 451 }
430 } 452 }
431 } 453 }