hush: fix \<newline> handling on NOMMU
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 12 Aug 2009 17:47:44 +0000 (19:47 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 12 Aug 2009 17:47:44 +0000 (19:47 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/hush.c
shell/hush_test/hush-misc/nommu1.right [new file with mode: 0644]
shell/hush_test/hush-misc/nommu1.tests [new file with mode: 0755]
shell/hush_test/run-all

index f49630a757014a0a6649aab454b609f02eea14da..08e7f505257989eabb9c114ebbbb5f63334296e5 100644 (file)
@@ -6038,6 +6038,8 @@ static struct pipe *parse_stream(char **pstring,
                        dest.o_assignment = NOT_ASSIGNMENT;
                }
 
+               /* Note: nommu_addchr(&ctx.as_string, ch) is already done */
+
                switch (ch) {
                case '#':
                        if (dest.length == 0) {
@@ -6061,12 +6063,17 @@ static struct pipe *parse_stream(char **pstring,
                        ch = i_getch(input);
                        if (ch != '\n') {
                                o_addchr(&dest, '\\');
-                               nommu_addchr(&ctx.as_string, '\\');
+                               /*nommu_addchr(&ctx.as_string, '\\'); - already done */
                                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;
+                       } else {
+#if !BB_MMU
+                               /* It's "\<newline>". Remove trailing '\' from ctx.as_string */
+                               ctx.as_string.data[--ctx.as_string.length] = '\0';
+#endif
                        }
                        break;
                case '$':
diff --git a/shell/hush_test/hush-misc/nommu1.right b/shell/hush_test/hush-misc/nommu1.right
new file mode 100644 (file)
index 0000000..d206a85
--- /dev/null
@@ -0,0 +1,7 @@
+Ok
+Ok
+Ok
+Ok
+Ok
+Ok
+Done
diff --git a/shell/hush_test/hush-misc/nommu1.tests b/shell/hush_test/hush-misc/nommu1.tests
new file mode 100755 (executable)
index 0000000..e14ada5
--- /dev/null
@@ -0,0 +1,12 @@
+(echo \
+Ok)
+( (echo \
+Ok) )
+( ( (echo \
+Ok) ) )
+
+(echo \Ok)
+( (echo \Ok) )
+( ( (echo \Ok) ) )
+
+echo Done
index cde841e6606bdcdd486c0211a865d2300072aff9..ee8327f0d8018c3299a083592afe3787185a2896 100755 (executable)
@@ -38,16 +38,16 @@ do_test()
        tret=0
        cd "$1" || { echo "cannot cd $1!"; exit 1; }
        for x in run-*; do
-       test -f "$x" || continue
-       case "$x" in
-               "$0"|run-minimal|run-gprof) ;;
-               *.orig|*~) ;;
-               #*) echo $x ; sh $x ;;
-               *)
-               sh "$x" >"../$1-$x.fail" 2>&1 && \
-               { echo "$1/$x: ok"; rm "../$1-$x.fail"; } || echo "$1/$x: fail";
-               ;;
-       esac
+               test -f "$x" || continue
+               case "$x" in
+                       "$0"|run-minimal|run-gprof) ;;
+                       *.orig|*~) ;;
+                       #*) echo $x ; sh $x ;;
+                       *)
+                       sh "$x" >"../$1-$x.fail" 2>&1 && \
+                       { echo "$1/$x: ok"; rm "../$1-$x.fail"; } || echo "$1/$x: fail";
+                       ;;
+               esac
        done
        # Many bash run-XXX scripts just do this,
        # no point in duplication it all over the place