grep: fix -o match with empty string (suggested by Colin Watson <cjwatson@ubuntu.com>)

function                                             old     new   delta
grep_file                                           1216    1251     +35

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2010-08-23 02:39:47 +02:00
parent b276e41835
commit 3d8b96d58d
2 changed files with 11 additions and 3 deletions

View File

@ -461,15 +461,19 @@ static int grep_file(FILE *file)
if (found)
print_line(gl->pattern, strlen(gl->pattern), linenum, ':');
} else while (1) {
unsigned start = gl->matched_range.rm_so;
unsigned end = gl->matched_range.rm_eo;
unsigned len = end - start;
char old = line[end];
line[end] = '\0';
print_line(line + gl->matched_range.rm_so,
end - gl->matched_range.rm_so,
linenum, ':');
/* Empty match is not printed: try "echo test | grep -o ''" */
if (len != 0)
print_line(line + start, len, linenum, ':');
if (old == '\0')
break;
line[end] = old;
if (len == 0)
end++;
#if !ENABLE_EXTRA_COMPAT
if (regexec(&gl->compiled_regex, line + end,
1, &gl->matched_range, REG_NOTBOL) != 0)

View File

@ -98,5 +98,9 @@ testing "grep -o does not loop forever" \
'grep -o "[^/]*$"' \
"test\n" \
"" "/var/test\n"
testing "grep -o does not loop forever on zero-length match" \
'grep -o "" | head -n1' \
"" \
"" "test\n"
exit $FAILCOUNT