From 09449630fbf0331a76a9d055fcbff0774c57ab65 Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <vda.linux@googlemail.com>
Date: Wed, 29 Jul 2009 01:20:09 +0200
Subject: grep: fix -E  + {range}; fix -o not printing all matches (bug 489)

two different bugs, one with EXTRA_COMPAT, other without.

function                                             old     new   delta
grep_file                                           1132    1129      -3

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
---
 findutils/grep.c | 36 +++++++++++++++++++++---------------
 1 file changed, 21 insertions(+), 15 deletions(-)

(limited to 'findutils/grep.c')

diff --git a/findutils/grep.c b/findutils/grep.c
index 774f04d5d..776a629be 100644
--- a/findutils/grep.c
+++ b/findutils/grep.c
@@ -120,17 +120,18 @@ struct globals {
 } while (0)
 #define max_matches       (G.max_matches         )
 #if !ENABLE_EXTRA_COMPAT
-#define reflags           (G.reflags             )
+# define reflags          (G.reflags             )
 #else
-#define case_fold         (G.case_fold           )
+# define case_fold        (G.case_fold           )
 /* http://www.delorie.com/gnu/docs/regex/regex_46.html */
-#define reflags           re_syntax_options
-#undef REG_NOSUB
-#undef REG_EXTENDED
-#undef REG_ICASE
-#define REG_NOSUB    bug:is:here /* should not be used */
-#define REG_EXTENDED RE_SYNTAX_EGREP
-#define REG_ICASE    bug:is:here /* should not be used */
+# define reflags           re_syntax_options
+# undef REG_NOSUB
+# undef REG_EXTENDED
+# undef REG_ICASE
+# define REG_NOSUB    bug:is:here /* should not be used */
+/* Just RE_SYNTAX_EGREP is not enough, need to enable {n[,[m]]} too */
+# define REG_EXTENDED (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
+# define REG_ICASE    bug:is:here /* should not be used */
 #endif
 #define invert_search     (G.invert_search       )
 #define print_filename    (G.print_filename      )
@@ -370,17 +371,22 @@ static int grep_file(FILE *file)
 						if (found)
 							print_line(gl->pattern, strlen(gl->pattern), linenum, ':');
 					} else while (1) {
-						char old = line[gl->matched_range.rm_eo];
-						line[gl->matched_range.rm_eo] = '\0';
+						unsigned end = gl->matched_range.rm_eo;
+						char old = line[end];
+						line[end] = '\0';
 						print_line(line + gl->matched_range.rm_so,
-								gl->matched_range.rm_eo - gl->matched_range.rm_so,
+								end - gl->matched_range.rm_so,
 								linenum, ':');
-						line[gl->matched_range.rm_eo] = old;
+						line[end] = old;
 #if !ENABLE_EXTRA_COMPAT
-						break;
+						if (regexec(&gl->compiled_regex, line + end,
+								1, &gl->matched_range, REG_NOTBOL) != 0)
+							break;
+						gl->matched_range.rm_so += end;
+						gl->matched_range.rm_eo += end;
 #else
 						if (re_search(&gl->compiled_regex, line, line_len,
-								gl->matched_range.rm_eo, line_len - gl->matched_range.rm_eo,
+								end, line_len - end,
 								&gl->matched_range) < 0)
 							break;
 #endif
-- 
cgit v1.2.3-55-g6feb