diff options
-rw-r--r-- | tests/sed.test | 11 | ||||
-rw-r--r-- | toys/pending/sed.c | 13 |
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 |