aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2023-06-18 18:31:55 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2023-06-18 18:31:55 +0200
commit2d06c83b87e8c8330ef82bbdf4314112400877f7 (patch)
tree5114e354fdf6b3fffd38faf79ad0b34cb00b3b4c
parentc72c5552edecb8a2f97cd7e2d9a09a3059986cca (diff)
downloadbusybox-w32-2d06c83b87e8c8330ef82bbdf4314112400877f7.tar.gz
busybox-w32-2d06c83b87e8c8330ef82bbdf4314112400877f7.tar.bz2
busybox-w32-2d06c83b87e8c8330ef82bbdf4314112400877f7.zip
shell/math: code shrink
function old new delta evaluate_string 1489 1486 -3 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--shell/math.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/shell/math.c b/shell/math.c
index 4c1b1b762..fee325307 100644
--- a/shell/math.c
+++ b/shell/math.c
@@ -264,10 +264,9 @@ static ALWAYS_INLINE int isalnum_(int c)
264static arith_t 264static arith_t
265evaluate_string(arith_state_t *math_state, const char *expr); 265evaluate_string(arith_state_t *math_state, const char *expr);
266 266
267static const char* 267static arith_t
268arith_lookup_val(arith_state_t *math_state, var_or_num_t *t) 268arith_lookup_val(arith_state_t *math_state, const char *name)
269{ 269{
270 const char *name = t->var_name;
271 char c; 270 char c;
272 const char *p; 271 const char *p;
273 char *e = (char*)endofname(name); 272 char *e = (char*)endofname(name);
@@ -277,6 +276,7 @@ arith_lookup_val(arith_state_t *math_state, var_or_num_t *t)
277 p = math_state->lookupvar(name); 276 p = math_state->lookupvar(name);
278 *e = c; 277 *e = c;
279 if (p) { 278 if (p) {
279 arith_t val;
280 size_t len = e - name; 280 size_t len = e - name;
281 remembered_name *cur; 281 remembered_name *cur;
282 remembered_name remember; 282 remembered_name remember;
@@ -289,7 +289,8 @@ arith_lookup_val(arith_state_t *math_state, var_or_num_t *t)
289 && !isalnum_(cur->var_name[len]) 289 && !isalnum_(cur->var_name[len])
290 ) { 290 ) {
291 /* yes */ 291 /* yes */
292 return "expression recursion loop detected"; 292 math_state->errmsg = "expression recursion loop detected";
293 return -1;
293 } 294 }
294 } 295 }
295 296
@@ -299,16 +300,16 @@ arith_lookup_val(arith_state_t *math_state, var_or_num_t *t)
299 math_state->list_of_recursed_names = &remember; 300 math_state->list_of_recursed_names = &remember;
300 301
301 /* recursively evaluate p as expression */ 302 /* recursively evaluate p as expression */
302 t->val = evaluate_string(math_state, p); 303 /* this sets math_state->errmsg on error */
304 val = evaluate_string(math_state, p);
303 305
304 /* pop current var name */ 306 /* pop current var name */
305 math_state->list_of_recursed_names = remember.next; 307 math_state->list_of_recursed_names = remember.next;
306 308
307 return math_state->errmsg; 309 return val;
308 } 310 }
309 /* treat undefined var as 0 */ 311 /* treat undefined var as 0 */
310 t->val = 0; 312 return 0;
311 return NULL;
312} 313}
313 314
314/* "Applying" a token means performing it on the top elements on the integer 315/* "Applying" a token means performing it on the top elements on the integer
@@ -684,9 +685,9 @@ evaluate_string(arith_state_t *math_state, const char *expr)
684 || expr[1] == '=' /* or "==..." */ 685 || expr[1] == '=' /* or "==..." */
685 ) { 686 ) {
686 /* Evaluate variable to value */ 687 /* Evaluate variable to value */
687 errmsg = arith_lookup_val(math_state, numstackptr); 688 numstackptr->val = arith_lookup_val(math_state, numstackptr->var_name);
688 if (errmsg) 689 if (math_state->errmsg)
689 goto err_with_custom_msg; 690 return numstackptr->val; /* -1 */
690 } 691 }
691 } else { 692 } else {
692 dbg("[%d] var:IGNORED", (int)(numstackptr - numstack)); 693 dbg("[%d] var:IGNORED", (int)(numstackptr - numstack));