hush: handle ${var:NUM:} too

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko
2010-05-21 15:24:12 +02:00
parent a88585a931
commit 73e013fca7
3 changed files with 32 additions and 2 deletions

View File

@ -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); beg = bb_strtou(exp_word, &end, 0);
//bb_error_msg("beg:'%s'=%u end:'%s'", exp_word, beg, end); //bb_error_msg("beg:'%s'=%u end:'%s'", exp_word, beg, end);
if (*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); //bb_error_msg("len:%u end:'%s'", len, end);
} }
if (*end == '\0') { if (*end == '\0') {
//bb_error_msg("from val:'%s'", val); //bb_error_msg("from val:'%s'", val);
if (!val || beg >= strlen(val)) if (len == 0 || !val || beg >= strlen(val))
val = ""; val = "";
else else
val = dyn_val = xstrndup(val + beg, len); 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 #endif
{ {
die_if_script("malformed ${%s...}", var); die_if_script("malformed ${%s...}", var);
val = "";
} }
} else { /* one of "-=+?" */ } else { /* one of "-=+?" */
/* Standard-mandated substitution ops: /* Standard-mandated substitution ops:

View File

@ -7,23 +7,35 @@ hush: syntax error: unterminated ${name}
1:1 =|| 1:1 =||
1:1:2=|| 1:1:2=||
1::2 =|| 1::2 =||
1:1: =||
1:: =||
1 =|0123| 1 =|0123|
1:1 =|123| 1:1 =|123|
1:1:2=|12| 1:1:2=|12|
1::2 =|01| 1::2 =|01|
1:1: =||
1:: =||
f =|| f =||
f:1 =|| f:1 =||
f:1:2=|| f:1:2=||
f::2 =|| f::2 =||
f:1: =||
f:: =||
f =|| f =||
f:1 =|| f:1 =||
f:1:2=|| f:1:2=||
f::2 =|| f::2 =||
f:1: =||
f:: =||
f =|a| f =|a|
f:1 =|| f:1 =||
f:1:2=|| f:1:2=||
f::2 =|a| f::2 =|a|
f:1: =||
f:: =||
f =|0123456789| f =|0123456789|
f:1 =|123456789| f:1 =|123456789|
f:1:2=|12| f:1:2=|12|
f::2 =|01| f::2 =|01|
f:1: =||
f:: =||

View File

@ -19,28 +19,40 @@ export var=0123456789
"$THIS_SH" -c 'set --; echo "1:1 =|${1:1}|"' "$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:1:2=|${1:1:2}|"'
"$THIS_SH" -c 'set --; echo "1::2 =|${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}|"'
"$THIS_SH" -c 'set -- 0123; echo "1:1 =|${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:1:2=|${1:1:2}|"'
"$THIS_SH" -c 'set -- 0123; echo "1::2 =|${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 =|$f|"'
"$THIS_SH" -c 'unset f; echo "f:1 =|${f:1}|"' "$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:1:2=|${f:1:2}|"'
"$THIS_SH" -c 'unset f; echo "f::2 =|${f::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 =|$f|"'
"$THIS_SH" -c 'f=; echo "f:1 =|${f:1}|"' "$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:1:2=|${f:1:2}|"'
"$THIS_SH" -c 'f=; echo "f::2 =|${f::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 =|$f|"'
"$THIS_SH" -c 'f=a; echo "f:1 =|${f:1}|"' "$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:1:2=|${f:1:2}|"'
"$THIS_SH" -c 'f=a; echo "f::2 =|${f::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 =|$f|"'
"$THIS_SH" -c 'f=0123456789; echo "f:1 =|${f:1}|"' "$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:1:2=|${f:1:2}|"'
"$THIS_SH" -c 'f=0123456789; echo "f::2 =|${f::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::}|"'