diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2023-06-28 14:18:35 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2023-06-28 14:18:35 +0200 |
commit | 800207b90a4f5f78cbe65a0f4b3ecd3b93abbd7d (patch) | |
tree | c78ee209986946838faf337bf997c2f6fb7d84f7 | |
parent | e619a25a551ac6a5f215005166371074a9e2816f (diff) | |
download | busybox-w32-800207b90a4f5f78cbe65a0f4b3ecd3b93abbd7d.tar.gz busybox-w32-800207b90a4f5f78cbe65a0f4b3ecd3b93abbd7d.tar.bz2 busybox-w32-800207b90a4f5f78cbe65a0f4b3ecd3b93abbd7d.zip |
shell/math: code shrink
function old new delta
arith_apply 1015 1023 +8
evaluate_string 1309 1295 -14
.rodata 105344 105321 -23
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/2 up/down: 8/-37) Total: -29 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | shell/math.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/shell/math.c b/shell/math.c index 9e81d604c..e15b014aa 100644 --- a/shell/math.c +++ b/shell/math.c | |||
@@ -141,6 +141,7 @@ typedef unsigned char operator; | |||
141 | * but there are 11 of them, which doesn't fit into 3 bits for unique id. | 141 | * but there are 11 of them, which doesn't fit into 3 bits for unique id. |
142 | * Abusing another precedence level: | 142 | * Abusing another precedence level: |
143 | */ | 143 | */ |
144 | #define PREC_ASSIGN1 2 | ||
144 | #define TOK_ASSIGN tok_decl(2,0) | 145 | #define TOK_ASSIGN tok_decl(2,0) |
145 | #define TOK_AND_ASSIGN tok_decl(2,1) | 146 | #define TOK_AND_ASSIGN tok_decl(2,1) |
146 | #define TOK_OR_ASSIGN tok_decl(2,2) | 147 | #define TOK_OR_ASSIGN tok_decl(2,2) |
@@ -150,11 +151,12 @@ typedef unsigned char operator; | |||
150 | #define TOK_LSHIFT_ASSIGN tok_decl(2,6) | 151 | #define TOK_LSHIFT_ASSIGN tok_decl(2,6) |
151 | #define TOK_RSHIFT_ASSIGN tok_decl(2,7) | 152 | #define TOK_RSHIFT_ASSIGN tok_decl(2,7) |
152 | 153 | ||
154 | #define PREC_ASSIGN2 3 | ||
153 | #define TOK_MUL_ASSIGN tok_decl(3,0) | 155 | #define TOK_MUL_ASSIGN tok_decl(3,0) |
154 | #define TOK_DIV_ASSIGN tok_decl(3,1) | 156 | #define TOK_DIV_ASSIGN tok_decl(3,1) |
155 | #define TOK_REM_ASSIGN tok_decl(3,2) | 157 | #define TOK_REM_ASSIGN tok_decl(3,2) |
156 | 158 | ||
157 | #define fix_assignment_prec(prec) do { if (prec == 3) prec = 2; } while (0) | 159 | #define fix_assignment_prec(prec) do { prec -= (prec == 3); } while (0) |
158 | 160 | ||
159 | /* Ternary conditional operator is right associative too */ | 161 | /* Ternary conditional operator is right associative too */ |
160 | /* | 162 | /* |
@@ -211,25 +213,25 @@ typedef unsigned char operator; | |||
211 | #define TOK_UPLUS tok_decl(UNARYPREC+1,1) | 213 | #define TOK_UPLUS tok_decl(UNARYPREC+1,1) |
212 | 214 | ||
213 | #define PREC_PRE (UNARYPREC+2) | 215 | #define PREC_PRE (UNARYPREC+2) |
214 | #define TOK_PRE_INC tok_decl(PREC_PRE, 0) | 216 | #define TOK_PRE_INC tok_decl(PREC_PRE,0) |
215 | #define TOK_PRE_DEC tok_decl(PREC_PRE, 1) | 217 | #define TOK_PRE_DEC tok_decl(PREC_PRE,1) |
216 | 218 | ||
217 | #define PREC_POST (UNARYPREC+3) | 219 | #define PREC_POST (UNARYPREC+3) |
218 | #define TOK_POST_INC tok_decl(PREC_POST, 0) | 220 | #define TOK_POST_INC tok_decl(PREC_POST,0) |
219 | #define TOK_POST_DEC tok_decl(PREC_POST, 1) | 221 | #define TOK_POST_DEC tok_decl(PREC_POST,1) |
220 | 222 | ||
221 | /* TOK_VALUE marks a number, name, name++/name--, or (EXPR): | 223 | /* TOK_VALUE marks a number, name, name++/name--, or (EXPR): |
222 | * IOW: something which can be used as the left side of a binary op. | 224 | * IOW: something which can be used as the left side of a binary op. |
223 | * Since it's never pushed to opstack, its precedence does not matter. | 225 | * Since it's never pushed to opstack, its precedence does not matter. |
224 | */ | 226 | */ |
225 | #define TOK_VALUE tok_decl(PREC_POST, 2) | 227 | #define TOK_VALUE tok_decl(PREC_POST,2) |
226 | 228 | ||
227 | static int | 229 | static int |
228 | is_assign_op(operator op) | 230 | is_assign_op(operator op) |
229 | { | 231 | { |
230 | operator prec = PREC(op); | 232 | operator prec = PREC(op); |
231 | fix_assignment_prec(prec); | 233 | return prec == PREC_ASSIGN1 |
232 | return prec == PREC(TOK_ASSIGN) | 234 | || prec == PREC_ASSIGN2 |
233 | || prec == PREC_PRE | 235 | || prec == PREC_PRE |
234 | || prec == PREC_POST; | 236 | || prec == PREC_POST; |
235 | } | 237 | } |