sed: yet another fix on top of zero length match code

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2012-06-08 10:25:31 +02:00
parent ba1d561d76
commit 37ca36a711
2 changed files with 15 additions and 6 deletions

View File

@ -768,8 +768,11 @@ static int do_subst_command(sed_cmd_t *sed_cmd, char **line_p)
* Second match is NOT replaced! * Second match is NOT replaced!
*/ */
if (prev_match_empty || start != 0 || start != end) { if (prev_match_empty || start != 0 || start != end) {
//dbg("%d %d %d", prev_match_empty, start, end);
dbg("inserting replacement at %d in '%s'", start, line); dbg("inserting replacement at %d in '%s'", start, line);
do_subst_w_backrefs(line, sed_cmd->string); do_subst_w_backrefs(line, sed_cmd->string);
/* Flag that something has changed */
altered = 1;
} else { } else {
dbg("NOT inserting replacement at %d in '%s'", start, line); dbg("NOT inserting replacement at %d in '%s'", start, line);
} }
@ -778,16 +781,18 @@ static int do_subst_command(sed_cmd_t *sed_cmd, char **line_p)
* copy verbatim one char after it before attempting more matches * copy verbatim one char after it before attempting more matches
*/ */
prev_match_empty = (start == end); prev_match_empty = (start == end);
if (prev_match_empty && line[end]) { if (prev_match_empty) {
pipe_putc(line[end]); if (!line[end]) {
end++; tried_at_eol = 1;
} else {
pipe_putc(line[end]);
end++;
}
} }
/* Advance past the match */ /* Advance past the match */
dbg("line += %d", end); dbg("line += %d", end);
line += end; line += end;
/* Flag that something has changed */
altered = 1;
/* if we're not doing this globally, get out now */ /* if we're not doing this globally, get out now */
if (sed_cmd->which_match != 0) if (sed_cmd->which_match != 0)

View File

@ -302,10 +302,14 @@ testing "sed zero chars match/replace advances correctly 2" \
"sed 's [^ .]* x g'" \ "sed 's [^ .]* x g'" \
"x x.x\n" "" " a.b\n" "x x.x\n" "" " a.b\n"
testing "sed zero chars match/replace logic must not falsely trigger here" \ testing "sed zero chars match/replace logic must not falsely trigger here 1" \
"sed 's/a/A/g'" \ "sed 's/a/A/g'" \
"_AAA1AA\n" "" "_aaa1aa\n" "_AAA1AA\n" "" "_aaa1aa\n"
testing "sed zero chars match/replace logic must not falsely trigger here 2" \
"sed 's/ *$/_/g'" \
"qwerty_\n" "" "qwerty\n"
# testing "description" "commands" "result" "infile" "stdin" # testing "description" "commands" "result" "infile" "stdin"
exit $FAILCOUNT exit $FAILCOUNT