diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2023-06-17 10:40:29 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2023-06-17 10:40:29 +0200 |
commit | 6221832bc15d9037360e3bdc9405df08ed801cc1 (patch) | |
tree | 1bed0a30a665f8c57f588888720b908d76dcaf14 | |
parent | d6f98f214b3bd242f7404b68a4f9d777114fffa3 (diff) | |
download | busybox-w32-6221832bc15d9037360e3bdc9405df08ed801cc1.tar.gz busybox-w32-6221832bc15d9037360e3bdc9405df08ed801cc1.tar.bz2 busybox-w32-6221832bc15d9037360e3bdc9405df08ed801cc1.zip |
shell/math.h: update comments, rearrange struct members for smaller code
function old new delta
arith_apply 1000 998 -2
evaluate_string 1414 1406 -8
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-10) Total: -10 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | shell/math.c | 2 | ||||
-rw-r--r-- | shell/math.h | 26 |
2 files changed, 5 insertions, 23 deletions
diff --git a/shell/math.c b/shell/math.c index 56f866bf2..6196a6ad9 100644 --- a/shell/math.c +++ b/shell/math.c | |||
@@ -926,9 +926,9 @@ dbg(" numstack:%d val:%lld '%s'", (int)(numstackptr - numstack), numstackptr[ | |||
926 | arith_t FAST_FUNC | 926 | arith_t FAST_FUNC |
927 | arith(arith_state_t *math_state, const char *expr) | 927 | arith(arith_state_t *math_state, const char *expr) |
928 | { | 928 | { |
929 | math_state->evaluation_disabled = 0; | ||
929 | math_state->errmsg = NULL; | 930 | math_state->errmsg = NULL; |
930 | math_state->list_of_recursed_names = NULL; | 931 | math_state->list_of_recursed_names = NULL; |
931 | math_state->evaluation_disabled = 0; | ||
932 | return evaluate_string(math_state, expr); | 932 | return evaluate_string(math_state, expr); |
933 | } | 933 | } |
934 | 934 | ||
diff --git a/shell/math.h b/shell/math.h index 452ddaddd..9812184f1 100644 --- a/shell/math.h +++ b/shell/math.h | |||
@@ -6,7 +6,6 @@ | |||
6 | * | 6 | * |
7 | * See math.c for internal documentation. | 7 | * See math.c for internal documentation. |
8 | */ | 8 | */ |
9 | |||
10 | /* The math library has just one function: | 9 | /* The math library has just one function: |
11 | * | 10 | * |
12 | * arith_t arith(arith_state_t *state, const char *expr); | 11 | * arith_t arith(arith_state_t *state, const char *expr); |
@@ -22,7 +21,6 @@ | |||
22 | * "1 + 2 + 3" | 21 | * "1 + 2 + 3" |
23 | * you would obviously get back 6. | 22 | * you would obviously get back 6. |
24 | */ | 23 | */ |
25 | |||
26 | /* To add support to a shell, you need to implement three functions: | 24 | /* To add support to a shell, you need to implement three functions: |
27 | * | 25 | * |
28 | * lookupvar() - look up and return the value of a variable | 26 | * lookupvar() - look up and return the value of a variable |
@@ -36,28 +34,12 @@ | |||
36 | * setvar() - set a variable to some value | 34 | * setvar() - set a variable to some value |
37 | * | 35 | * |
38 | * If the arithmetic expansion does something like: | 36 | * If the arithmetic expansion does something like: |
39 | * $(( i = 1)) | 37 | * $((i = 1)) |
40 | * then the math code will make a call like so: | 38 | * then the math code will make a call like so: |
41 | * setvar("i", "1", 0); | 39 | * setvar("i", "1"); |
42 | * The storage for the first two parameters are not allocated, so your | 40 | * The storage for the first two parameters are not allocated, so your |
43 | * shell implementation will most likely need to strdup() them to save. | 41 | * shell implementation will most likely need to strdup() them to save. |
44 | * | ||
45 | * endofname() - return the end of a variable name from input | ||
46 | * | ||
47 | * The arithmetic code does not know about variable naming conventions. | ||
48 | * So when it is given an experession, it knows something is not numeric, | ||
49 | * but it is up to the shell to dictate what is a valid identifiers. | ||
50 | * So when it encounters something like: | ||
51 | * $(( some_var + 123 )) | ||
52 | * It will make a call like so: | ||
53 | * end = endofname("some_var + 123"); | ||
54 | * So the shell needs to scan the input string and return a pointer to the | ||
55 | * first non-identifier string. In this case, it should return the input | ||
56 | * pointer with an offset pointing to the first space. The typical | ||
57 | * implementation will return the offset of first char that does not match | ||
58 | * the regex (in C locale): ^[a-zA-Z_][a-zA-Z_0-9]* | ||
59 | */ | 42 | */ |
60 | |||
61 | #ifndef SHELL_MATH_H | 43 | #ifndef SHELL_MATH_H |
62 | #define SHELL_MATH_H 1 | 44 | #define SHELL_MATH_H 1 |
63 | 45 | ||
@@ -75,11 +57,11 @@ typedef const char* FAST_FUNC (*arith_var_lookup_t)(const char *name); | |||
75 | typedef void FAST_FUNC (*arith_var_set_t)(const char *name, const char *val); | 57 | typedef void FAST_FUNC (*arith_var_set_t)(const char *name, const char *val); |
76 | 58 | ||
77 | typedef struct arith_state_t { | 59 | typedef struct arith_state_t { |
60 | uint64_t evaluation_disabled; | ||
78 | const char *errmsg; | 61 | const char *errmsg; |
62 | void *list_of_recursed_names; | ||
79 | arith_var_lookup_t lookupvar; | 63 | arith_var_lookup_t lookupvar; |
80 | arith_var_set_t setvar; | 64 | arith_var_set_t setvar; |
81 | uint64_t evaluation_disabled; | ||
82 | void *list_of_recursed_names; | ||
83 | } arith_state_t; | 65 | } arith_state_t; |
84 | 66 | ||
85 | arith_t FAST_FUNC arith(arith_state_t *state, const char *expr); | 67 | arith_t FAST_FUNC arith(arith_state_t *state, const char *expr); |