aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2023-06-13 16:15:18 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2023-06-13 16:15:18 +0200
commitc1d7507a4d36bbeba88b09e8f0269fe81e1cb33f (patch)
tree82e24eb57e83df270997b9fff4cd19e32101c151
parent8ccb3f7b1375862f8ef82cd9d225da986b80f054 (diff)
downloadbusybox-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.c20
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
249typedef struct remembered_name { 252typedef 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);
258static const char* 261static const char*
259arith_lookup_val(arith_state_t *math_state, var_or_num_t *t) 262arith_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)