aboutsummaryrefslogtreecommitdiff
path: root/findutils/grep.c
diff options
context:
space:
mode:
Diffstat (limited to 'findutils/grep.c')
-rw-r--r--findutils/grep.c33
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 }