Fix sed s//\[newline]/ line continuations.
authorRob Landley <rob@landley.net>
Thu, 22 Jan 2015 08:18:30 +0000 (02:18 -0600)
committerRob Landley <rob@landley.net>
Thu, 22 Jan 2015 08:18:30 +0000 (02:18 -0600)
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

index e35325d..d271c50 100644 (file)
@@ -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';