From 4bb3a3529704989dd9112baece164b2f51b44e89 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Thu, 22 Jan 2015 02:18:30 -0600 Subject: Fix sed s//\[newline]/ line continuations. The problem was that readline() was returning a newline at the end of each string, which wasn't getting stripped in the parser and thus \ wasn't at the end of a line for -f, it was escaping a literal newline, so the continuation logic didn't trigger. Remove some redundant null checks while we're at it, and don't bother terminating a string we don't return (yes we leak memory in an error path, but it's about to error_exit() anyway). --- toys/posix/sed.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'toys/posix/sed.c') diff --git a/toys/posix/sed.c b/toys/posix/sed.c index e35325d3..d271c509 100644 --- a/toys/posix/sed.c +++ b/toys/posix/sed.c @@ -713,11 +713,7 @@ static char *unescape_delimited_string(char **pstr, char *delim, int regex) to = delim = xmalloc(strlen(*pstr)+1); while (mode || *from != d) { - if (!*from) { - *to = 0; - - return 0; - } + if (!*from) return 0; // delimiter in regex character range doesn't count if (*from == '[') { @@ -737,7 +733,7 @@ static char *unescape_delimited_string(char **pstr, char *delim, int regex) *(to++) = c; from+=2; continue; - } else if (from[1]) *(to++) = *(from++); + } else *(to++) = *(from++); } } *(to++) = *(from++); @@ -756,6 +752,7 @@ static void jewel_of_judgement(char **pline, long len) int i; line = errstart = pline ? *pline : ""; + if (len && line[len-1]=='\n') line[--len] = 0; // Append additional line to pattern argument string? // We temporarily repurpose "hit" to indicate line continuations @@ -857,7 +854,7 @@ resume_s: // processing later, after we replace \\ with \ we can't tell \\1 from \1 fiona = line; while (*fiona != corwin->hit) { - if (!*fiona) break; + if (!*fiona) goto brand; if (*fiona++ == '\\') { if (!*fiona || *fiona == '\n') { fiona[-1] = '\n'; -- cgit v1.2.3