summaryrefslogtreecommitdiff
path: root/shell/hush.c
diff options
context:
space:
mode:
authorDenys Vlasenko2018-01-25 13:20:50 +0100
committerDenys Vlasenko2018-01-25 13:20:50 +0100
commit0ca3198f9333b363ced46bfabf51c0d6b111c875 (patch)
tree8b6d3b18ad914f25f741784ff82986014f58c60a /shell/hush.c
parenta497231f537352c7ff7a80c07ef6191b00e7e30e (diff)
downloadbusybox-0ca3198f9333b363ced46bfabf51c0d6b111c875.zip
busybox-0ca3198f9333b363ced46bfabf51c0d6b111c875.tar.gz
hush: fix handling of $_ (so far it's an ordinary variable, no special meaning)
function old new delta parse_dollar 820 779 -41 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/hush.c')
-rw-r--r--shell/hush.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 7b83c73..a9183c8 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -4520,9 +4520,10 @@ static int parse_dollar(o_string *as_string,
debug_printf_parse("parse_dollar entered: ch='%c'\n", ch);
if (isalpha(ch)) {
+ make_var:
ch = i_getch(input);
nommu_addchr(as_string, ch);
- make_var:
+ /*make_var1:*/
o_addchr(dest, SPECIAL_VAR_SYMBOL);
while (1) {
debug_printf_parse(": '%c'\n", ch);
@@ -4715,19 +4716,22 @@ static int parse_dollar(o_string *as_string,
}
#endif
case '_':
+ goto make_var;
+#if 0
+ /* TODO: $_ and $-: */
+ /* $_ Shell or shell script name; or last argument of last command
+ * (if last command wasn't a pipe; if it was, bash sets $_ to "");
+ * but in command's env, set to full pathname used to invoke it */
+ /* $- Option flags set by set builtin or shell options (-i etc) */
ch = i_getch(input);
nommu_addchr(as_string, ch);
ch = i_peek_and_eat_bkslash_nl(input);
if (isalnum(ch)) { /* it's $_name or $_123 */
ch = '_';
- goto make_var;
+ goto make_var1;
}
/* else: it's $_ */
- /* TODO: $_ and $-: */
- /* $_ Shell or shell script name; or last argument of last command
- * (if last command wasn't a pipe; if it was, bash sets $_ to "");
- * but in command's env, set to full pathname used to invoke it */
- /* $- Option flags set by set builtin or shell options (-i etc) */
+#endif
default:
o_addQchr(dest, '$');
}
@@ -5669,9 +5673,9 @@ static char *replace_pattern(char *val, const char *pattern, const char *repl, c
*/
static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, char **pp)
{
- const char *val = NULL;
- char *to_be_freed = NULL;
- char *p = *pp;
+ const char *val;
+ char *to_be_freed;
+ char *p;
char *var;
char first_char;
char exp_op;
@@ -5680,6 +5684,9 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha
char *exp_word = exp_word; /* for compiler */
char arg0;
+ val = NULL;
+ to_be_freed = NULL;
+ p = *pp;
*p = '\0'; /* replace trailing SPECIAL_VAR_SYMBOL */
var = arg;
exp_saveptr = arg[1] ? strchr(VAR_ENCODED_SUBST_OPS, arg[1]) : NULL;