hush: support $_NUMBERS variable names

This commit is contained in:
Denis Vlasenko 2008-07-31 10:34:48 +00:00
parent f173607520
commit d498131168
5 changed files with 19 additions and 4 deletions

View File

@ -587,7 +587,7 @@ static int glob_needed(const char *s)
static int is_assignment(const char *s)
{
if (!s || !isalpha(*s))
if (!s || !(isalpha(*s) || *s == '_'))
return 0;
s++;
while (isalnum(*s) || *s == '_')
@ -3529,22 +3529,24 @@ static int handle_dollar(o_string *dest, struct in_str *input)
debug_printf_parse("handle_dollar entered: ch='%c'\n", ch);
if (isalpha(ch)) {
i_getch(input);
make_var:
o_addchr(dest, SPECIAL_VAR_SYMBOL);
while (1) {
debug_printf_parse(": '%c'\n", ch);
i_getch(input);
o_addchr(dest, ch | quote_mask);
quote_mask = 0;
ch = i_peek(input);
if (!isalnum(ch) && ch != '_')
break;
i_getch(input);
}
o_addchr(dest, SPECIAL_VAR_SYMBOL);
} else if (isdigit(ch)) {
make_one_char_var:
i_getch(input);
o_addchr(dest, SPECIAL_VAR_SYMBOL);
debug_printf_parse(": '%c'\n", ch);
i_getch(input);
o_addchr(dest, ch | quote_mask);
o_addchr(dest, SPECIAL_VAR_SYMBOL);
} else switch (ch) {
@ -3586,8 +3588,15 @@ static int handle_dollar(o_string *dest, struct in_str *input)
break;
}
#endif
case '-':
case '_':
i_getch(input);
ch = i_peek(input);
if (isalnum(ch)) { /* it's $_name or $_123 */
ch = '_';
goto make_var;
}
/* else: it's $_ */
case '-':
/* still unhandled, but should be eventually */
bb_error_msg("unhandled syntax: $%c", ch);
return 1;

View File

@ -0,0 +1,2 @@
http://busybox.net
http://busybox.net_abc

View File

@ -0,0 +1,4 @@
_1=http://busybox.net
echo $_1
echo ${_1}_abc