hush: fix \<newline> handling
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 3 May 2009 00:15:18 +0000 (02:15 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 3 May 2009 00:15:18 +0000 (02:15 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/hush.c
shell/hush_test/hush-parsing/escape4.right [new file with mode: 0644]
shell/hush_test/hush-parsing/escape4.tests [new file with mode: 0755]
shell/hush_test/hush-parsing/group1.tests [changed mode: 0644->0755]

index 255caef..c6e9405 100644 (file)
  *
  * TODOs:
  *      grep for "TODO" and fix (some of them are easy)
- *      change { and } from special chars to reserved words
  *      $var refs in function do not pick up values set by "var=val func"
  *      builtins: ulimit
  *      follow IFS rules more precisely, including update semantics
- *      figure out what to do with backslash-newline
- *      continuation lines, both explicit and implicit - done?
- *      separate job control from interactiveness
- *      (testcase: booting with init=/bin/hush does not show prompt (2009-04))
  *
  * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
  */
@@ -5347,10 +5342,12 @@ static int parse_stream_dquoted(o_string *as_string,
                 * $, `, ", \, or <newline>.  A double quote may be quoted
                 * within double quotes by preceding it with a backslash.
                 */
-               if (strchr("$`\"\\", next) != NULL) {
+               if (strchr("$`\"\\\n", next) != NULL) {
                        ch = i_getch(input);
-                       o_addqchr(dest, ch);
-                       nommu_addchr(as_string, ch);
+                       if (ch != '\n') {
+                               o_addqchr(dest, ch);
+                               nommu_addchr(as_string, ch);
+                       }
                } else {
                        o_addqchr(dest, '\\');
                        nommu_addchr(as_string, '\\');
@@ -5677,13 +5674,16 @@ static struct pipe *parse_stream(char **pstring,
                                syntax_error("\\<eof>");
                                xfunc_die();
                        }
-                       o_addchr(&dest, '\\');
                        ch = i_getch(input);
-                       nommu_addchr(&ctx.as_string, ch);
-                       o_addchr(&dest, ch);
-                       /* Example: echo Hello \2>file
-                        * we need to know that word 2 is quoted */
-                       dest.o_quoted = 1;
+                       if (ch != '\n') {
+                               o_addchr(&dest, '\\');
+                               nommu_addchr(&ctx.as_string, '\\');
+                               o_addchr(&dest, ch);
+                               nommu_addchr(&ctx.as_string, ch);
+                               /* Example: echo Hello \2>file
+                                * we need to know that word 2 is quoted */
+                               dest.o_quoted = 1;
+                       }
                        break;
                case '$':
                        if (handle_dollar(&ctx.as_string, &dest, input) != 0) {
diff --git a/shell/hush_test/hush-parsing/escape4.right b/shell/hush_test/hush-parsing/escape4.right
new file mode 100644 (file)
index 0000000..5de3e0c
--- /dev/null
@@ -0,0 +1,2 @@
+Ok
+End
diff --git a/shell/hush_test/hush-parsing/escape4.tests b/shell/hush_test/hush-parsing/escape4.tests
new file mode 100755 (executable)
index 0000000..df8bf0a
--- /dev/null
@@ -0,0 +1,6 @@
+i\
+f tr\
+ue; th\
+en echo "O\
+k"; fi; echo "\
+End"
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)