hush: fix for nested $()s with escapes + testsuite
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 12 Jun 2008 12:58:20 +0000 (12:58 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 12 Jun 2008 12:58:20 +0000 (12:58 -0000)
shell/hush.c
shell/hush_test/hush-psubst/tick3.tests
shell/hush_test/hush-psubst/tick4.right [new file with mode: 0644]
shell/hush_test/hush-psubst/tick4.tests [new file with mode: 0755]

index 735526a1d42b210e2a128dee8cec3143b25fd356..77a3051913c9fc9973f01edf5fd61b6344b66f41 100644 (file)
@@ -3498,6 +3498,13 @@ static void add_till_closing_curly_brace(o_string *dest, struct in_str *input)
                        o_addqchr(dest, ch, 1);
                        continue;
                }
+               if (ch == '\\') { /* \x. Copy verbatim. Important for  \(, \) */
+                       ch = i_getch(input);
+                       if (ch == EOF)
+                               break;
+                       o_addqchr(dest, ch, 1);
+                       continue;
+               }
        }
 }
 #endif /* ENABLE_HUSH_TICK */
@@ -3556,13 +3563,16 @@ static int handle_dollar(o_string *dest, struct in_str *input)
                        o_addchr(dest, SPECIAL_VAR_SYMBOL);
                        break;
 #if ENABLE_HUSH_TICK
-               case '(':
+               case '(': {
+                       //int pos = dest->length;
                        i_getch(input);
                        o_addchr(dest, SPECIAL_VAR_SYMBOL);
                        o_addchr(dest, quote_mask | '`');
                        add_till_closing_curly_brace(dest, input);
+                       //bb_error_msg("RES '%s'", dest->data + pos);
                        o_addchr(dest, SPECIAL_VAR_SYMBOL);
                        break;
+               }
 #endif
                case '-':
                case '_':
index 97b45e4b425db03f640635dedaec9fe7864d1377..2b055bb69ca23dd8d9bb4a55f44d6c356323d112 100755 (executable)
@@ -1,4 +1,3 @@
-#!/bin/sh
 TEST=Q
 # \` is special
 echo `echo '\'TEST\`echo ZZ\`BEST`
diff --git a/shell/hush_test/hush-psubst/tick4.right b/shell/hush_test/hush-psubst/tick4.right
new file mode 100644 (file)
index 0000000..d8030ea
--- /dev/null
@@ -0,0 +1,7 @@
+(TEST) BEST
+TEST) BEST
+((TEST) BEST
+)
+abc
+a)c
+OK: 0
diff --git a/shell/hush_test/hush-psubst/tick4.tests b/shell/hush_test/hush-psubst/tick4.tests
new file mode 100755 (executable)
index 0000000..f2305fb
--- /dev/null
@@ -0,0 +1,7 @@
+echo $(echo '(TEST)' BEST)
+echo $(echo 'TEST)' BEST)
+echo $(echo \(\(TEST\) BEST)
+echo $(echo \))
+echo $(echo a"`echo "b"`"c )
+echo $(echo a"`echo ")"`"c )
+echo OK: $?