[git commit master] hush: handle ${var:NUM:} too

Denys Vlasenko vda.linux at googlemail.com
Fri May 21 13:24:12 UTC 2010


commit: http://git.busybox.net/busybox/commit/?id=73e013fca7afd2edc9ba8530df77c8210a14700b
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/hush.c                                       |   10 ++++++++--
 .../hush-vars/param_expand_bash_substring.right    |   12 ++++++++++++
 .../hush-vars/param_expand_bash_substring.tests    |   12 ++++++++++++
 3 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/shell/hush.c b/shell/hush.c
index 945077d..6cf8899 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -2649,12 +2649,17 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg, char
 						beg = bb_strtou(exp_word, &end, 0);
 					//bb_error_msg("beg:'%s'=%u end:'%s'", exp_word, beg, end);
 					if (*end == ':') {
-						len = bb_strtou(end + 1, &end, 0);
+						if (end[1] != '\0') /* not ${var:NUM:} */
+							len = bb_strtou(end + 1, &end, 0);
+						else {
+							len = 0;
+							end++;
+						}
 						//bb_error_msg("len:%u end:'%s'", len, end);
 					}
 					if (*end == '\0') {
 						//bb_error_msg("from val:'%s'", val);
-						if (!val || beg >= strlen(val))
+						if (len == 0 || !val || beg >= strlen(val))
 							val = "";
 						else
 							val = dyn_val = xstrndup(val + beg, len);
@@ -2663,6 +2668,7 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg, char
 #endif
 					{
 						die_if_script("malformed ${%s...}", var);
+						val = "";
 					}
 				} else { /* one of "-=+?" */
 	/* Standard-mandated substitution ops:
diff --git a/shell/hush_test/hush-vars/param_expand_bash_substring.right b/shell/hush_test/hush-vars/param_expand_bash_substring.right
index 9cd4659..6e3eb3b 100644
--- a/shell/hush_test/hush-vars/param_expand_bash_substring.right
+++ b/shell/hush_test/hush-vars/param_expand_bash_substring.right
@@ -7,23 +7,35 @@ hush: syntax error: unterminated ${name}
 1:1  =||
 1:1:2=||
 1::2 =||
+1:1: =||
+1::  =||
 1    =|0123|
 1:1  =|123|
 1:1:2=|12|
 1::2 =|01|
+1:1: =||
+1::  =||
 f    =||
 f:1  =||
 f:1:2=||
 f::2 =||
+f:1: =||
+f::  =||
 f    =||
 f:1  =||
 f:1:2=||
 f::2 =||
+f:1: =||
+f::  =||
 f    =|a|
 f:1  =||
 f:1:2=||
 f::2 =|a|
+f:1: =||
+f::  =||
 f    =|0123456789|
 f:1  =|123456789|
 f:1:2=|12|
 f::2 =|01|
+f:1: =||
+f::  =||
diff --git a/shell/hush_test/hush-vars/param_expand_bash_substring.tests b/shell/hush_test/hush-vars/param_expand_bash_substring.tests
index 6a17655..eedd435 100755
--- a/shell/hush_test/hush-vars/param_expand_bash_substring.tests
+++ b/shell/hush_test/hush-vars/param_expand_bash_substring.tests
@@ -19,28 +19,40 @@ export var=0123456789
 "$THIS_SH" -c 'set --; echo "1:1  =|${1:1}|"'
 "$THIS_SH" -c 'set --; echo "1:1:2=|${1:1:2}|"'
 "$THIS_SH" -c 'set --; echo "1::2 =|${1::2}|"'
+"$THIS_SH" -c 'set --; echo "1:1: =|${1:1:}|"'
+"$THIS_SH" -c 'set --; echo "1::  =|${1::}|"'
 
 "$THIS_SH" -c 'set -- 0123; echo "1    =|${1}|"'
 "$THIS_SH" -c 'set -- 0123; echo "1:1  =|${1:1}|"'
 "$THIS_SH" -c 'set -- 0123; echo "1:1:2=|${1:1:2}|"'
 "$THIS_SH" -c 'set -- 0123; echo "1::2 =|${1::2}|"'
+"$THIS_SH" -c 'set -- 0123; echo "1:1: =|${1:1:}|"'
+"$THIS_SH" -c 'set -- 0123; echo "1::  =|${1::}|"'
 
 "$THIS_SH" -c 'unset f; echo "f    =|$f|"'
 "$THIS_SH" -c 'unset f; echo "f:1  =|${f:1}|"'
 "$THIS_SH" -c 'unset f; echo "f:1:2=|${f:1:2}|"'
 "$THIS_SH" -c 'unset f; echo "f::2 =|${f::2}|"'
+"$THIS_SH" -c 'unset f; echo "f:1: =|${f:1:}|"'
+"$THIS_SH" -c 'unset f; echo "f::  =|${f::}|"'
 
 "$THIS_SH" -c 'f=; echo "f    =|$f|"'
 "$THIS_SH" -c 'f=; echo "f:1  =|${f:1}|"'
 "$THIS_SH" -c 'f=; echo "f:1:2=|${f:1:2}|"'
 "$THIS_SH" -c 'f=; echo "f::2 =|${f::2}|"'
+"$THIS_SH" -c 'f=; echo "f:1: =|${f:1:}|"'
+"$THIS_SH" -c 'f=; echo "f::  =|${f::}|"'
 
 "$THIS_SH" -c 'f=a; echo "f    =|$f|"'
 "$THIS_SH" -c 'f=a; echo "f:1  =|${f:1}|"'
 "$THIS_SH" -c 'f=a; echo "f:1:2=|${f:1:2}|"'
 "$THIS_SH" -c 'f=a; echo "f::2 =|${f::2}|"'
+"$THIS_SH" -c 'f=a; echo "f:1: =|${f:1:}|"'
+"$THIS_SH" -c 'f=a; echo "f::  =|${f::}|"'
 
 "$THIS_SH" -c 'f=0123456789; echo "f    =|$f|"'
 "$THIS_SH" -c 'f=0123456789; echo "f:1  =|${f:1}|"'
 "$THIS_SH" -c 'f=0123456789; echo "f:1:2=|${f:1:2}|"'
 "$THIS_SH" -c 'f=0123456789; echo "f::2 =|${f::2}|"'
+"$THIS_SH" -c 'f=0123456789; echo "f:1: =|${f:1:}|"'
+"$THIS_SH" -c 'f=0123456789; echo "f::  =|${f::}|"'
-- 
1.6.3.3



More information about the busybox-cvs mailing list