diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2023-06-18 18:31:55 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2023-06-18 18:31:55 +0200 |
commit | 2d06c83b87e8c8330ef82bbdf4314112400877f7 (patch) | |
tree | 5114e354fdf6b3fffd38faf79ad0b34cb00b3b4c | |
parent | c72c5552edecb8a2f97cd7e2d9a09a3059986cca (diff) | |
download | busybox-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.c | 23 |
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) | |||
264 | static arith_t | 264 | static arith_t |
265 | evaluate_string(arith_state_t *math_state, const char *expr); | 265 | evaluate_string(arith_state_t *math_state, const char *expr); |
266 | 266 | ||
267 | static const char* | 267 | static arith_t |
268 | arith_lookup_val(arith_state_t *math_state, var_or_num_t *t) | 268 | arith_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)); |