diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-02 18:44:40 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-05 15:43:35 +0100 |
commit | e3b4f23cf301c7fe525d58caf66ad0dd136275fe (patch) | |
tree | 81ccb4b4807c6912dfe9a6677dc4618ef3fdedad | |
parent | a1d3ca24559254e10549746833a878a3a3273cbe (diff) | |
download | busybox-w32-e3b4f23cf301c7fe525d58caf66ad0dd136275fe.tar.gz busybox-w32-e3b4f23cf301c7fe525d58caf66ad0dd136275fe.tar.bz2 busybox-w32-e3b4f23cf301c7fe525d58caf66ad0dd136275fe.zip |
bc: bc_num_ulong2num(), bc_program_pushGlobal(), bc_program_stackLen() never fail
function old new delta
bc_num_ulong2num 66 62 -4
bc_num_printNum 572 563 -9
bc_program_exec 4562 4544 -18
bc_program_num 1147 1126 -21
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/4 up/down: 0/-52) Total: -52 bytes
text data bss dec hex filename
988575 485 7296 996356 f3404 busybox_old
988523 485 7296 996304 f33d0 busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | miscutils/bc.c | 68 |
1 files changed, 26 insertions, 42 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index 221e1529f..25b03a95d 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c | |||
@@ -299,7 +299,7 @@ static void bc_num_copy(BcNum *d, BcNum *s); | |||
299 | static void bc_num_free(void *num); | 299 | static void bc_num_free(void *num); |
300 | 300 | ||
301 | static BcStatus bc_num_ulong(BcNum *n, unsigned long *result); | 301 | static BcStatus bc_num_ulong(BcNum *n, unsigned long *result); |
302 | static BcStatus bc_num_ulong2num(BcNum *n, unsigned long val); | 302 | static void bc_num_ulong2num(BcNum *n, unsigned long val); |
303 | 303 | ||
304 | static BcStatus bc_num_add(BcNum *a, BcNum *b, BcNum *c, size_t scale); | 304 | static BcStatus bc_num_add(BcNum *a, BcNum *b, BcNum *c, size_t scale); |
305 | static BcStatus bc_num_sub(BcNum *a, BcNum *b, BcNum *c, size_t scale); | 305 | static BcStatus bc_num_sub(BcNum *a, BcNum *b, BcNum *c, size_t scale); |
@@ -1404,6 +1404,7 @@ static BcStatus bc_read_file(const char *path, char **buf) | |||
1404 | read_err: | 1404 | read_err: |
1405 | free(*buf); | 1405 | free(*buf); |
1406 | return s; | 1406 | return s; |
1407 | ///convert to better return convention | ||
1407 | } | 1408 | } |
1408 | 1409 | ||
1409 | static void bc_args(int argc, char **argv) | 1410 | static void bc_args(int argc, char **argv) |
@@ -1469,6 +1470,7 @@ static BcStatus bc_num_subArrays(BcDig *restrict a, BcDig *restrict b, | |||
1469 | a[i + j] -= 1; | 1470 | a[i + j] -= 1; |
1470 | } | 1471 | } |
1471 | } | 1472 | } |
1473 | ///move ^C detection to bc_num_binary() (can make bc_num_s() return void) | ||
1472 | return G_interrupt ? BC_STATUS_EXEC_SIGNAL : BC_STATUS_SUCCESS; | 1474 | return G_interrupt ? BC_STATUS_EXEC_SIGNAL : BC_STATUS_SUCCESS; |
1473 | } | 1475 | } |
1474 | 1476 | ||
@@ -1695,6 +1697,7 @@ static BcStatus bc_num_a(BcNum *a, BcNum *b, BcNum *restrict c, size_t sub) | |||
1695 | 1697 | ||
1696 | if (carry != 0) c->num[c->len++] = (BcDig) carry; | 1698 | if (carry != 0) c->num[c->len++] = (BcDig) carry; |
1697 | 1699 | ||
1700 | ///move ^C detection to bc_num_binary() | ||
1698 | return G_interrupt ? BC_STATUS_EXEC_SIGNAL : BC_STATUS_SUCCESS; | 1701 | return G_interrupt ? BC_STATUS_EXEC_SIGNAL : BC_STATUS_SUCCESS; |
1699 | } | 1702 | } |
1700 | 1703 | ||
@@ -1770,6 +1773,7 @@ static BcStatus bc_num_k(BcNum *restrict a, BcNum *restrict b, | |||
1770 | BcNum l1, h1, l2, h2, m2, m1, z0, z1, z2, temp; | 1773 | BcNum l1, h1, l2, h2, m2, m1, z0, z1, z2, temp; |
1771 | bool aone = BC_NUM_ONE(a); | 1774 | bool aone = BC_NUM_ONE(a); |
1772 | 1775 | ||
1776 | ///move ^C detection to bc_num_binary() | ||
1773 | if (G_interrupt) return BC_STATUS_EXEC_SIGNAL; | 1777 | if (G_interrupt) return BC_STATUS_EXEC_SIGNAL; |
1774 | if (a->len == 0 || b->len == 0) { | 1778 | if (a->len == 0 || b->len == 0) { |
1775 | bc_num_zero(c); | 1779 | bc_num_zero(c); |
@@ -1804,6 +1808,7 @@ static BcStatus bc_num_k(BcNum *restrict a, BcNum *restrict b, | |||
1804 | 1808 | ||
1805 | c->len = len; | 1809 | c->len = len; |
1806 | 1810 | ||
1811 | ///move ^C detection to bc_num_binary() | ||
1807 | return G_interrupt ? BC_STATUS_EXEC_SIGNAL : BC_STATUS_SUCCESS; | 1812 | return G_interrupt ? BC_STATUS_EXEC_SIGNAL : BC_STATUS_SUCCESS; |
1808 | } | 1813 | } |
1809 | 1814 | ||
@@ -2061,6 +2066,7 @@ static BcStatus bc_num_p(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) | |||
2061 | } | 2066 | } |
2062 | 2067 | ||
2063 | if (G_interrupt) { | 2068 | if (G_interrupt) { |
2069 | ///move ^C detection to bc_num_binary() | ||
2064 | s = BC_STATUS_EXEC_SIGNAL; | 2070 | s = BC_STATUS_EXEC_SIGNAL; |
2065 | goto err; | 2071 | goto err; |
2066 | } | 2072 | } |
@@ -2086,6 +2092,7 @@ static BcStatus bc_num_p(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) | |||
2086 | } | 2092 | } |
2087 | 2093 | ||
2088 | if (G_interrupt) { | 2094 | if (G_interrupt) { |
2095 | ///move ^C detection to bc_num_binary() | ||
2089 | s = BC_STATUS_EXEC_SIGNAL; | 2096 | s = BC_STATUS_EXEC_SIGNAL; |
2090 | goto err; | 2097 | goto err; |
2091 | } | 2098 | } |
@@ -2135,6 +2142,8 @@ static BcStatus bc_num_binary(BcNum *a, BcNum *b, BcNum *c, size_t scale, | |||
2135 | 2142 | ||
2136 | if (init) bc_num_free(&num2); | 2143 | if (init) bc_num_free(&num2); |
2137 | 2144 | ||
2145 | ///move ^C detection here: | ||
2146 | // if (s == 0 && G_interrupt) s = BC_STATUS_EXEC_SIGNAL; | ||
2138 | return s; | 2147 | return s; |
2139 | } | 2148 | } |
2140 | 2149 | ||
@@ -2222,8 +2231,7 @@ static void bc_num_parseBase(BcNum *n, const char *val, BcNum *base) | |||
2222 | 2231 | ||
2223 | s = bc_num_mul(n, base, &mult, 0); | 2232 | s = bc_num_mul(n, base, &mult, 0); |
2224 | if (s) goto int_err; | 2233 | if (s) goto int_err; |
2225 | s = bc_num_ulong2num(&temp, v); | 2234 | bc_num_ulong2num(&temp, v); |
2226 | if (s) goto int_err; | ||
2227 | s = bc_num_add(&mult, &temp, n, 0); | 2235 | s = bc_num_add(&mult, &temp, n, 0); |
2228 | if (s) goto int_err; | 2236 | if (s) goto int_err; |
2229 | } | 2237 | } |
@@ -2246,8 +2254,7 @@ static void bc_num_parseBase(BcNum *n, const char *val, BcNum *base) | |||
2246 | 2254 | ||
2247 | s = bc_num_mul(&result, base, &result, 0); | 2255 | s = bc_num_mul(&result, base, &result, 0); |
2248 | if (s) goto err; | 2256 | if (s) goto err; |
2249 | s = bc_num_ulong2num(&temp, v); | 2257 | bc_num_ulong2num(&temp, v); |
2250 | if (s) goto err; | ||
2251 | s = bc_num_add(&result, &temp, &result, 0); | 2258 | s = bc_num_add(&result, &temp, &result, 0); |
2252 | if (s) goto err; | 2259 | if (s) goto err; |
2253 | s = bc_num_mul(&mult, base, &mult, 0); | 2260 | s = bc_num_mul(&mult, base, &mult, 0); |
@@ -2385,8 +2392,7 @@ static BcStatus bc_num_printNum(BcNum *n, BcNum *base, size_t width, | |||
2385 | if (s) goto err; | 2392 | if (s) goto err; |
2386 | s = bc_num_ulong(&fracp, &dig); | 2393 | s = bc_num_ulong(&fracp, &dig); |
2387 | if (s) goto err; | 2394 | if (s) goto err; |
2388 | s = bc_num_ulong2num(&intp, dig); | 2395 | bc_num_ulong2num(&intp, dig); |
2389 | if (s) goto err; | ||
2390 | s = bc_num_sub(&fracp, &intp, &fracp, 0); | 2396 | s = bc_num_sub(&fracp, &intp, &fracp, 0); |
2391 | if (s) goto err; | 2397 | if (s) goto err; |
2392 | print(dig, width, radix, nchars, len); | 2398 | print(dig, width, radix, nchars, len); |
@@ -2528,7 +2534,7 @@ static BcStatus bc_num_ulong(BcNum *n, unsigned long *result) | |||
2528 | return BC_STATUS_SUCCESS; | 2534 | return BC_STATUS_SUCCESS; |
2529 | } | 2535 | } |
2530 | 2536 | ||
2531 | static BcStatus bc_num_ulong2num(BcNum *n, unsigned long val) | 2537 | static void bc_num_ulong2num(BcNum *n, unsigned long val) |
2532 | { | 2538 | { |
2533 | size_t len; | 2539 | size_t len; |
2534 | BcDig *ptr; | 2540 | BcDig *ptr; |
@@ -2536,12 +2542,10 @@ static BcStatus bc_num_ulong2num(BcNum *n, unsigned long val) | |||
2536 | 2542 | ||
2537 | bc_num_zero(n); | 2543 | bc_num_zero(n); |
2538 | 2544 | ||
2539 | if (val == 0) return BC_STATUS_SUCCESS; | 2545 | if (val == 0) return; |
2540 | 2546 | ||
2541 | for (len = 1, i = ULONG_MAX; i != 0; i /= 10, ++len) bc_num_expand(n, len); | 2547 | for (len = 1, i = ULONG_MAX; i != 0; i /= 10, ++len) bc_num_expand(n, len); |
2542 | for (ptr = n->num, i = 0; val; ++i, ++n->len, val /= 10) ptr[i] = val % 10; | 2548 | for (ptr = n->num, i = 0; val; ++i, ++n->len, val /= 10) ptr[i] = val % 10; |
2543 | |||
2544 | return BC_STATUS_SUCCESS; | ||
2545 | } | 2549 | } |
2546 | 2550 | ||
2547 | static BcStatus bc_num_add(BcNum *a, BcNum *b, BcNum *c, size_t scale) | 2551 | static BcStatus bc_num_add(BcNum *a, BcNum *b, BcNum *c, size_t scale) |
@@ -2642,6 +2646,7 @@ static BcStatus bc_num_sqrt(BcNum *a, BcNum *restrict b, size_t scale) | |||
2642 | resrdx = scale + 2; | 2646 | resrdx = scale + 2; |
2643 | len = BC_NUM_INT(x0) + resrdx - 1; | 2647 | len = BC_NUM_INT(x0) + resrdx - 1; |
2644 | 2648 | ||
2649 | ///move ^C detection to callers | ||
2645 | while (!G_interrupt && (cmp != 0 || digs < len)) { | 2650 | while (!G_interrupt && (cmp != 0 || digs < len)) { |
2646 | 2651 | ||
2647 | s = bc_num_div(a, x0, &f, resrdx); | 2652 | s = bc_num_div(a, x0, &f, resrdx); |
@@ -2671,6 +2676,7 @@ static BcStatus bc_num_sqrt(BcNum *a, BcNum *restrict b, size_t scale) | |||
2671 | } | 2676 | } |
2672 | 2677 | ||
2673 | if (G_interrupt) { | 2678 | if (G_interrupt) { |
2679 | ///move ^C detection to callers | ||
2674 | s = BC_STATUS_EXEC_SIGNAL; | 2680 | s = BC_STATUS_EXEC_SIGNAL; |
2675 | goto err; | 2681 | goto err; |
2676 | } | 2682 | } |
@@ -6148,7 +6154,7 @@ static BcStatus bc_program_builtin(char inst) | |||
6148 | if (inst == BC_INST_SQRT) s = bc_num_sqrt(num, &res.d.n, G.prog.scale); | 6154 | if (inst == BC_INST_SQRT) s = bc_num_sqrt(num, &res.d.n, G.prog.scale); |
6149 | #if ENABLE_BC | 6155 | #if ENABLE_BC |
6150 | else if (len != 0 && opnd->t == BC_RESULT_ARRAY) { | 6156 | else if (len != 0 && opnd->t == BC_RESULT_ARRAY) { |
6151 | s = bc_num_ulong2num(&res.d.n, (unsigned long) ((BcVec *) num)->len); | 6157 | bc_num_ulong2num(&res.d.n, (unsigned long) ((BcVec *) num)->len); |
6152 | } | 6158 | } |
6153 | #endif | 6159 | #endif |
6154 | #if ENABLE_DC | 6160 | #if ENABLE_DC |
@@ -6158,23 +6164,17 @@ static BcStatus bc_program_builtin(char inst) | |||
6158 | size_t idx = opnd->t == BC_RESULT_STR ? opnd->d.id.idx : num->rdx; | 6164 | size_t idx = opnd->t == BC_RESULT_STR ? opnd->d.id.idx : num->rdx; |
6159 | 6165 | ||
6160 | str = bc_vec_item(&G.prog.strs, idx); | 6166 | str = bc_vec_item(&G.prog.strs, idx); |
6161 | s = bc_num_ulong2num(&res.d.n, strlen(*str)); | 6167 | bc_num_ulong2num(&res.d.n, strlen(*str)); |
6162 | if (s) goto err; | ||
6163 | } | 6168 | } |
6164 | #endif | 6169 | #endif |
6165 | else { | 6170 | else { |
6166 | BcProgramBuiltIn f = len ? bc_program_len : bc_program_scale; | 6171 | BcProgramBuiltIn f = len ? bc_program_len : bc_program_scale; |
6167 | s = bc_num_ulong2num(&res.d.n, f(num)); | 6172 | bc_num_ulong2num(&res.d.n, f(num)); |
6168 | if (s) goto err; | ||
6169 | } | 6173 | } |
6170 | 6174 | ||
6171 | bc_program_retire(&res, BC_RESULT_TEMP); | 6175 | bc_program_retire(&res, BC_RESULT_TEMP); |
6172 | 6176 | ||
6173 | return s; | 6177 | return s; |
6174 | |||
6175 | err: | ||
6176 | bc_num_free(&res.d.n); | ||
6177 | return s; | ||
6178 | } | 6178 | } |
6179 | 6179 | ||
6180 | #if ENABLE_DC | 6180 | #if ENABLE_DC |
@@ -6248,24 +6248,16 @@ err: | |||
6248 | return s; | 6248 | return s; |
6249 | } | 6249 | } |
6250 | 6250 | ||
6251 | static BcStatus bc_program_stackLen(void) | 6251 | static void bc_program_stackLen(void) |
6252 | { | 6252 | { |
6253 | BcStatus s; | ||
6254 | BcResult res; | 6253 | BcResult res; |
6255 | size_t len = G.prog.results.len; | 6254 | size_t len = G.prog.results.len; |
6256 | 6255 | ||
6257 | res.t = BC_RESULT_TEMP; | 6256 | res.t = BC_RESULT_TEMP; |
6258 | 6257 | ||
6259 | bc_num_init(&res.d.n, BC_NUM_DEF_SIZE); | 6258 | bc_num_init(&res.d.n, BC_NUM_DEF_SIZE); |
6260 | s = bc_num_ulong2num(&res.d.n, len); | 6259 | bc_num_ulong2num(&res.d.n, len); |
6261 | if (s) goto err; | ||
6262 | bc_vec_push(&G.prog.results, &res); | 6260 | bc_vec_push(&G.prog.results, &res); |
6263 | |||
6264 | return s; | ||
6265 | |||
6266 | err: | ||
6267 | bc_num_free(&res.d.n); | ||
6268 | return s; | ||
6269 | } | 6261 | } |
6270 | 6262 | ||
6271 | static BcStatus bc_program_asciify(void) | 6263 | static BcStatus bc_program_asciify(void) |
@@ -6490,9 +6482,8 @@ exit: | |||
6490 | } | 6482 | } |
6491 | #endif // ENABLE_DC | 6483 | #endif // ENABLE_DC |
6492 | 6484 | ||
6493 | static BcStatus bc_program_pushGlobal(char inst) | 6485 | static void bc_program_pushGlobal(char inst) |
6494 | { | 6486 | { |
6495 | BcStatus s; | ||
6496 | BcResult res; | 6487 | BcResult res; |
6497 | unsigned long val; | 6488 | unsigned long val; |
6498 | 6489 | ||
@@ -6505,15 +6496,8 @@ static BcStatus bc_program_pushGlobal(char inst) | |||
6505 | val = (unsigned long) G.prog.ob_t; | 6496 | val = (unsigned long) G.prog.ob_t; |
6506 | 6497 | ||
6507 | bc_num_init(&res.d.n, BC_NUM_DEF_SIZE); | 6498 | bc_num_init(&res.d.n, BC_NUM_DEF_SIZE); |
6508 | s = bc_num_ulong2num(&res.d.n, val); | 6499 | bc_num_ulong2num(&res.d.n, val); |
6509 | if (s) goto err; | ||
6510 | bc_vec_push(&G.prog.results, &res); | 6500 | bc_vec_push(&G.prog.results, &res); |
6511 | |||
6512 | return s; | ||
6513 | |||
6514 | err: | ||
6515 | bc_num_free(&res.d.n); | ||
6516 | return s; | ||
6517 | } | 6501 | } |
6518 | 6502 | ||
6519 | static void bc_program_addFunc(char *name, size_t *idx) | 6503 | static void bc_program_addFunc(char *name, size_t *idx) |
@@ -6682,7 +6666,7 @@ static BcStatus bc_program_exec(void) | |||
6682 | case BC_INST_SCALE: | 6666 | case BC_INST_SCALE: |
6683 | case BC_INST_OBASE: | 6667 | case BC_INST_OBASE: |
6684 | { | 6668 | { |
6685 | s = bc_program_pushGlobal(inst); | 6669 | bc_program_pushGlobal(inst); |
6686 | break; | 6670 | break; |
6687 | } | 6671 | } |
6688 | 6672 | ||
@@ -6811,7 +6795,7 @@ static BcStatus bc_program_exec(void) | |||
6811 | 6795 | ||
6812 | case BC_INST_STACK_LEN: | 6796 | case BC_INST_STACK_LEN: |
6813 | { | 6797 | { |
6814 | s = bc_program_stackLen(); | 6798 | bc_program_stackLen(); |
6815 | break; | 6799 | break; |
6816 | } | 6800 | } |
6817 | 6801 | ||