aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-12-02 18:44:40 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-12-05 15:43:35 +0100
commite3b4f23cf301c7fe525d58caf66ad0dd136275fe (patch)
tree81ccb4b4807c6912dfe9a6677dc4618ef3fdedad
parenta1d3ca24559254e10549746833a878a3a3273cbe (diff)
downloadbusybox-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.c68
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);
299static void bc_num_free(void *num); 299static void bc_num_free(void *num);
300 300
301static BcStatus bc_num_ulong(BcNum *n, unsigned long *result); 301static BcStatus bc_num_ulong(BcNum *n, unsigned long *result);
302static BcStatus bc_num_ulong2num(BcNum *n, unsigned long val); 302static void bc_num_ulong2num(BcNum *n, unsigned long val);
303 303
304static BcStatus bc_num_add(BcNum *a, BcNum *b, BcNum *c, size_t scale); 304static BcStatus bc_num_add(BcNum *a, BcNum *b, BcNum *c, size_t scale);
305static BcStatus bc_num_sub(BcNum *a, BcNum *b, BcNum *c, size_t scale); 305static 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)
1404read_err: 1404read_err:
1405 free(*buf); 1405 free(*buf);
1406 return s; 1406 return s;
1407///convert to better return convention
1407} 1408}
1408 1409
1409static void bc_args(int argc, char **argv) 1410static 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
2531static BcStatus bc_num_ulong2num(BcNum *n, unsigned long val) 2537static 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
2547static BcStatus bc_num_add(BcNum *a, BcNum *b, BcNum *c, size_t scale) 2551static 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
6175err:
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
6251static BcStatus bc_program_stackLen(void) 6251static 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
6266err:
6267 bc_num_free(&res.d.n);
6268 return s;
6269} 6261}
6270 6262
6271static BcStatus bc_program_asciify(void) 6263static BcStatus bc_program_asciify(void)
@@ -6490,9 +6482,8 @@ exit:
6490} 6482}
6491#endif // ENABLE_DC 6483#endif // ENABLE_DC
6492 6484
6493static BcStatus bc_program_pushGlobal(char inst) 6485static 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
6514err:
6515 bc_num_free(&res.d.n);
6516 return s;
6517} 6501}
6518 6502
6519static void bc_program_addFunc(char *name, size_t *idx) 6503static 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