diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2023-06-13 16:15:18 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2023-06-13 16:15:18 +0200 |
commit | c1d7507a4d36bbeba88b09e8f0269fe81e1cb33f (patch) | |
tree | 82e24eb57e83df270997b9fff4cd19e32101c151 | |
parent | 8ccb3f7b1375862f8ef82cd9d225da986b80f054 (diff) | |
download | busybox-w32-c1d7507a4d36bbeba88b09e8f0269fe81e1cb33f.tar.gz busybox-w32-c1d7507a4d36bbeba88b09e8f0269fe81e1cb33f.tar.bz2 busybox-w32-c1d7507a4d36bbeba88b09e8f0269fe81e1cb33f.zip |
shell/math: fix one name check, other minor cleanups
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | shell/math.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/shell/math.c b/shell/math.c index af8e691fe..57eb56952 100644 --- a/shell/math.c +++ b/shell/math.c | |||
@@ -245,6 +245,9 @@ typedef struct { | |||
245 | char *var_name; | 245 | char *var_name; |
246 | } var_or_num_t; | 246 | } var_or_num_t; |
247 | 247 | ||
248 | #define VALID_NAME(name) ((name) && (name) != SECOND_VAL_VALID) | ||
249 | #define NOT_NAME(name) (!(name) || (name) == SECOND_VAL_VALID) | ||
250 | |||
248 | 251 | ||
249 | typedef struct remembered_name { | 252 | typedef struct remembered_name { |
250 | struct remembered_name *next; | 253 | struct remembered_name *next; |
@@ -258,7 +261,7 @@ evaluate_string(arith_state_t *math_state, const char *expr); | |||
258 | static const char* | 261 | static const char* |
259 | arith_lookup_val(arith_state_t *math_state, var_or_num_t *t) | 262 | arith_lookup_val(arith_state_t *math_state, var_or_num_t *t) |
260 | { | 263 | { |
261 | if (t->var_name && t->var_name != SECOND_VAL_VALID) { | 264 | if (VALID_NAME(t->var_name)) { |
262 | const char *p = math_state->lookupvar(t->var_name); | 265 | const char *p = math_state->lookupvar(t->var_name); |
263 | if (p) { | 266 | if (p) { |
264 | remembered_name *cur; | 267 | remembered_name *cur; |
@@ -275,16 +278,15 @@ arith_lookup_val(arith_state_t *math_state, var_or_num_t *t) | |||
275 | } | 278 | } |
276 | 279 | ||
277 | /* push current var name */ | 280 | /* push current var name */ |
278 | cur = math_state->list_of_recursed_names; | ||
279 | remember.var_name = t->var_name; | 281 | remember.var_name = t->var_name; |
280 | remember.next = cur; | 282 | remember.next = math_state->list_of_recursed_names; |
281 | math_state->list_of_recursed_names = &remember; | 283 | math_state->list_of_recursed_names = &remember; |
282 | 284 | ||
283 | /* recursively evaluate p as expression */ | 285 | /* recursively evaluate p as expression */ |
284 | t->val = evaluate_string(math_state, p); | 286 | t->val = evaluate_string(math_state, p); |
285 | 287 | ||
286 | /* pop current var name */ | 288 | /* pop current var name */ |
287 | math_state->list_of_recursed_names = cur; | 289 | math_state->list_of_recursed_names = remember.next; |
288 | 290 | ||
289 | return math_state->errmsg; | 291 | return math_state->errmsg; |
290 | } | 292 | } |
@@ -446,7 +448,7 @@ arith_apply(arith_state_t *math_state, operator op, var_or_num_t *numstack, var_ | |||
446 | if (is_assign_op(op)) { | 448 | if (is_assign_op(op)) { |
447 | char buf[sizeof(arith_t)*3 + 2]; | 449 | char buf[sizeof(arith_t)*3 + 2]; |
448 | 450 | ||
449 | if (!top_of_stack->var_name || top_of_stack->var_name == SECOND_VAL_VALID) { | 451 | if (NOT_NAME(top_of_stack->var_name)) { |
450 | /* Hmm, 1=2 ? */ | 452 | /* Hmm, 1=2 ? */ |
451 | goto syntax_err; | 453 | goto syntax_err; |
452 | } | 454 | } |
@@ -708,9 +710,11 @@ evaluate_string(arith_state_t *math_state, const char *expr) | |||
708 | if ((expr[0] == '+' || expr[0] == '-') | 710 | if ((expr[0] == '+' || expr[0] == '-') |
709 | && (expr[1] == expr[0]) | 711 | && (expr[1] == expr[0]) |
710 | ) { | 712 | ) { |
711 | if (numstackptr == numstack || !numstackptr[-1].var_name) { /* not a VAR++ */ | 713 | if (numstackptr == numstack || NOT_NAME(numstackptr[-1].var_name)) { |
714 | /* not a VAR++ */ | ||
712 | char next = skip_whitespace(expr + 2)[0]; | 715 | char next = skip_whitespace(expr + 2)[0]; |
713 | if (!(isalpha(next) || next == '_')) { /* not a ++VAR */ | 716 | if (!(isalpha(next) || next == '_')) { |
717 | /* not a ++VAR */ | ||
714 | //bb_error_msg("special %c%c", expr[0], expr[0]); | 718 | //bb_error_msg("special %c%c", expr[0], expr[0]); |
715 | op = (expr[0] == '+' ? TOK_ADD : TOK_SUB); | 719 | op = (expr[0] == '+' ? TOK_ADD : TOK_SUB); |
716 | expr++; | 720 | expr++; |
@@ -802,7 +806,7 @@ evaluate_string(arith_state_t *math_state, const char *expr) | |||
802 | if (prev_op == TOK_LPAREN) { | 806 | if (prev_op == TOK_LPAREN) { |
803 | //bb_error_msg("prev_op == TOK_LPAREN"); | 807 | //bb_error_msg("prev_op == TOK_LPAREN"); |
804 | //bb_error_msg(" %p %p numstackptr[-1].var_name:'%s'", numstack, numstackptr-1, numstackptr[-1].var_name); | 808 | //bb_error_msg(" %p %p numstackptr[-1].var_name:'%s'", numstack, numstackptr-1, numstackptr[-1].var_name); |
805 | if (numstackptr[-1].var_name && numstackptr[-1].var_name != SECOND_VAL_VALID) { | 809 | if (VALID_NAME(numstackptr[-1].var_name)) { |
806 | /* Expression is (var), lookup now */ | 810 | /* Expression is (var), lookup now */ |
807 | errmsg = arith_lookup_val(math_state, &numstackptr[-1]); | 811 | errmsg = arith_lookup_val(math_state, &numstackptr[-1]); |
808 | if (errmsg) | 812 | if (errmsg) |