aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/sed.test11
-rw-r--r--toys/pending/sed.c13
2 files changed, 20 insertions, 4 deletions
diff --git a/tests/sed.test b/tests/sed.test
index 86738854..789a1a51 100644
--- a/tests/sed.test
+++ b/tests/sed.test
@@ -119,6 +119,17 @@ testing "sed D further processing depends on whether line is blank" \
"sed -e '/one/,/three/{' -e 'i meep' -e'N;2D;}'" \
"meep\nmeep\ntwo\nthree\n" "" "one\ntwo\nthree\n"
+# Different ways of parsing line continuations
+
+testing "" "sed -e '1a\' -e 'huh'" "meep\nhuh\n" "" "meep"
+testing "" "sed -f input" "blah\nboom\n" '1a\\\nboom' 'blah'
+testing "" "sed '1a\
+hello'" "merp\nhello\n" "" "merp"
+#echo meep | sed/sed -e '1a\' -e 'huh'
+#echo blah | sed/sed -f <(echo -e "1a\\\\\nboom")
+#echo merp | sed/sed "1a\\
+#hello"
+
# -i with $ last line test
exit $FAILCOUNT
diff --git a/toys/pending/sed.c b/toys/pending/sed.c
index 6c025f0d..fd5352a0 100644
--- a/toys/pending/sed.c
+++ b/toys/pending/sed.c
@@ -913,10 +913,15 @@ append:
reg = extend_string((void *)&corwin, line, reg - (char *)corwin, end);
line += end;
- // Line continuation?
- if (class && reg[-1] == '\\') {
- reg[-1] = 0;
- corwin->hit++;
+ // Line continuation? (Two slightly different input methods, -e with
+ // embedded newline vs -f line by line. Must parse both correctly.)
+ if (class && line[-1] == '\\') {
+ reg[-2] = 0;
+ if (*line && line[1]) {
+ reg -= 2;
+ line++;
+ goto append;
+ } else corwin->hit++;
}
// Commands that take no arguments