From 37ca36a71114a6fc5303d33cabc311cd8b9bf19a Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 8 Jun 2012 10:25:31 +0200 Subject: sed: yet another fix on top of zero length match code Signed-off-by: Denys Vlasenko --- editors/sed.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'editors/sed.c') diff --git a/editors/sed.c b/editors/sed.c index 0fe82f337..652aaf573 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -768,8 +768,11 @@ static int do_subst_command(sed_cmd_t *sed_cmd, char **line_p) * Second match is NOT replaced! */ 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); do_subst_w_backrefs(line, sed_cmd->string); + /* Flag that something has changed */ + altered = 1; } else { 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 */ prev_match_empty = (start == end); - if (prev_match_empty && line[end]) { - pipe_putc(line[end]); - end++; + if (prev_match_empty) { + if (!line[end]) { + tried_at_eol = 1; + } else { + pipe_putc(line[end]); + end++; + } } /* Advance past the match */ dbg("line += %d", end); line += end; - /* Flag that something has changed */ - altered = 1; /* if we're not doing this globally, get out now */ if (sed_cmd->which_match != 0) -- cgit v1.2.3