aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-12-17 21:05:09 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-12-18 03:30:23 +0100
commitf6e3f8511e3257022302ad82a6dd6951ff1eae52 (patch)
treec17615aa00d61c239e408d53d6f910cedb70501d
parent0f31a5c79e8d4a35f790d9f7f2c0a63e3c0d6808 (diff)
downloadbusybox-w32-f6e3f8511e3257022302ad82a6dd6951ff1eae52.tar.gz
busybox-w32-f6e3f8511e3257022302ad82a6dd6951ff1eae52.tar.bz2
busybox-w32-f6e3f8511e3257022302ad82a6dd6951ff1eae52.zip
bc: get rid of BcNum BcProgram::ib,hexb
function old new delta zbc_program_num 907 943 +36 zbc_program_assign 485 474 -11 bc_vm_init 757 739 -18 bc_num_ten 30 - -30 ------------------------------------------------------------------------------ (add/remove: 0/1 grow/shrink: 1/2 up/down: 36/-59) Total: -23 bytes text data bss dec hex filename 981532 485 7296 989313 f1881 busybox_old 981509 485 7296 989290 f186a busybox_unstripped Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--miscutils/bc.c60
1 files changed, 24 insertions, 36 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c
index 57ae52ce7..c65555fe2 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -228,7 +228,6 @@ typedef struct BcNum {
228 bool neg; 228 bool neg;
229} BcNum; 229} BcNum;
230 230
231#define BC_NUM_MIN_BASE ((unsigned long) 2)
232#define BC_NUM_MAX_IBASE ((unsigned long) 16) 231#define BC_NUM_MAX_IBASE ((unsigned long) 16)
233// larger value might speed up BIGNUM calculations a bit: 232// larger value might speed up BIGNUM calculations a bit:
234#define BC_NUM_DEF_SIZE (16) 233#define BC_NUM_DEF_SIZE (16)
@@ -680,12 +679,9 @@ typedef struct BcProgram {
680 size_t len; 679 size_t len;
681 size_t scale; 680 size_t scale;
682 681
683 BcNum ib;
684 size_t ib_t; 682 size_t ib_t;
685 BcNum ob;
686 size_t ob_t; 683 size_t ob_t;
687 684 BcNum ob;
688 BcNum hexb;
689 685
690#if ENABLE_DC 686#if ENABLE_DC
691 BcNum strmb; 687 BcNum strmb;
@@ -2240,10 +2236,11 @@ static void bc_num_parseDecimal(BcNum *n, const char *val)
2240 2236
2241// Note: n is already "bc_num_zero()"ed, 2237// Note: n is already "bc_num_zero()"ed,
2242// leading zeroes in "val" are removed 2238// leading zeroes in "val" are removed
2243static void bc_num_parseBase(BcNum *n, const char *val, BcNum *base) 2239static void bc_num_parseBase(BcNum *n, const char *val, unsigned base_t)
2244{ 2240{
2245 BcStatus s; 2241 BcStatus s;
2246 BcNum temp, mult, result; 2242 BcNum temp, mult, result;
2243 BcNum base;
2247 BcDig c = '\0'; 2244 BcDig c = '\0';
2248 unsigned long v; 2245 unsigned long v;
2249 size_t i, digits; 2246 size_t i, digits;
@@ -2257,6 +2254,8 @@ static void bc_num_parseBase(BcNum *n, const char *val, BcNum *base)
2257 2254
2258 bc_num_init_DEF_SIZE(&temp); 2255 bc_num_init_DEF_SIZE(&temp);
2259 bc_num_init_DEF_SIZE(&mult); 2256 bc_num_init_DEF_SIZE(&mult);
2257 bc_num_init_DEF_SIZE(&base);
2258 bc_num_ulong2num(&base, base_t);
2260 2259
2261 for (;;) { 2260 for (;;) {
2262 c = *val++; 2261 c = *val++;
@@ -2265,14 +2264,14 @@ static void bc_num_parseBase(BcNum *n, const char *val, BcNum *base)
2265 2264
2266 v = (unsigned long) (c <= '9' ? c - '0' : c - 'A' + 10); 2265 v = (unsigned long) (c <= '9' ? c - '0' : c - 'A' + 10);
2267 2266
2268 s = zbc_num_mul(n, base, &mult, 0); 2267 s = zbc_num_mul(n, &base, &mult, 0);
2269 if (s) goto int_err; 2268 if (s) goto int_err;
2270 bc_num_ulong2num(&temp, v); 2269 bc_num_ulong2num(&temp, v);
2271 s = zbc_num_add(&mult, &temp, n, 0); 2270 s = zbc_num_add(&mult, &temp, n, 0);
2272 if (s) goto int_err; 2271 if (s) goto int_err;
2273 } 2272 }
2274 2273
2275 bc_num_init(&result, base->len); 2274 bc_num_init(&result, base.len);
2276 //bc_num_zero(&result); - already is 2275 //bc_num_zero(&result); - already is
2277 bc_num_one(&mult); 2276 bc_num_one(&mult);
2278 2277
@@ -2284,12 +2283,12 @@ static void bc_num_parseBase(BcNum *n, const char *val, BcNum *base)
2284 2283
2285 v = (unsigned long) (c <= '9' ? c - '0' : c - 'A' + 10); 2284 v = (unsigned long) (c <= '9' ? c - '0' : c - 'A' + 10);
2286 2285
2287 s = zbc_num_mul(&result, base, &result, 0); 2286 s = zbc_num_mul(&result, &base, &result, 0);
2288 if (s) goto err; 2287 if (s) goto err;
2289 bc_num_ulong2num(&temp, v); 2288 bc_num_ulong2num(&temp, v);
2290 s = zbc_num_add(&result, &temp, &result, 0); 2289 s = zbc_num_add(&result, &temp, &result, 0);
2291 if (s) goto err; 2290 if (s) goto err;
2292 s = zbc_num_mul(&mult, base, &mult, 0); 2291 s = zbc_num_mul(&mult, &base, &mult, 0);
2293 if (s) goto err; 2292 if (s) goto err;
2294 } 2293 }
2295 2294
@@ -2306,12 +2305,12 @@ static void bc_num_parseBase(BcNum *n, const char *val, BcNum *base)
2306err: 2305err:
2307 bc_num_free(&result); 2306 bc_num_free(&result);
2308int_err: 2307int_err:
2308 bc_num_free(&base);
2309 bc_num_free(&mult); 2309 bc_num_free(&mult);
2310 bc_num_free(&temp); 2310 bc_num_free(&temp);
2311} 2311}
2312 2312
2313static BC_STATUS zbc_num_parse(BcNum *n, const char *val, BcNum *base, 2313static BC_STATUS zbc_num_parse(BcNum *n, const char *val, unsigned base_t)
2314 size_t base_t)
2315{ 2314{
2316 if (!bc_num_strValid(val, base_t)) 2315 if (!bc_num_strValid(val, base_t))
2317 RETURN_STATUS(bc_error("bad number string")); 2316 RETURN_STATUS(bc_error("bad number string"));
@@ -2322,7 +2321,7 @@ static BC_STATUS zbc_num_parse(BcNum *n, const char *val, BcNum *base,
2322 if (base_t == 10) 2321 if (base_t == 10)
2323 bc_num_parseDecimal(n, val); 2322 bc_num_parseDecimal(n, val);
2324 else 2323 else
2325 bc_num_parseBase(n, val, base); 2324 bc_num_parseBase(n, val, base_t);
2326 2325
2327 RETURN_STATUS(BC_STATUS_SUCCESS); 2326 RETURN_STATUS(BC_STATUS_SUCCESS);
2328} 2327}
@@ -5044,15 +5043,14 @@ static BC_STATUS zbc_program_num(BcResult *r, BcNum **num, bool hex)
5044 { 5043 {
5045 BcStatus s; 5044 BcStatus s;
5046 char **str = bc_vec_item(&G.prog.consts, r->d.id.idx); 5045 char **str = bc_vec_item(&G.prog.consts, r->d.id.idx);
5047 size_t base_t, len = strlen(*str); 5046 unsigned base_t;
5048 BcNum *base; 5047 size_t len = strlen(*str);
5049 5048
5050 bc_num_init(&r->d.n, len); 5049 bc_num_init(&r->d.n, len);
5051 5050
5052 hex = hex && len == 1; 5051 hex = hex && len == 1;
5053 base = hex ? &G.prog.hexb : &G.prog.ib; 5052 base_t = hex ? 16 : G.prog.ib_t;
5054 base_t = hex ? BC_NUM_MAX_IBASE : G.prog.ib_t; 5053 s = zbc_num_parse(&r->d.n, *str, base_t);
5055 s = zbc_num_parse(&r->d.n, *str, base, base_t);
5056 5054
5057 if (s) { 5055 if (s) {
5058 bc_num_free(&r->d.n); 5056 bc_num_free(&r->d.n);
@@ -5475,8 +5473,7 @@ static BC_STATUS zbc_num_printBase(BcNum *n)
5475 if (G.prog.ob_t <= BC_NUM_MAX_IBASE) { 5473 if (G.prog.ob_t <= BC_NUM_MAX_IBASE) {
5476 width = 1; 5474 width = 1;
5477 print = bc_num_printHex; 5475 print = bc_num_printHex;
5478 } 5476 } else {
5479 else {
5480 for (i = G.prog.ob_t - 1, width = 0; i != 0; i /= 10, ++width) 5477 for (i = G.prog.ob_t - 1, width = 0; i != 0; i /= 10, ++width)
5481 continue; 5478 continue;
5482 print = bc_num_printDigits; 5479 print = bc_num_printDigits;
@@ -5506,8 +5503,7 @@ static BC_STATUS zbc_num_print(BcNum *n, bool newline)
5506 if (n->len == 0) { 5503 if (n->len == 0) {
5507 bb_putchar('0'); 5504 bb_putchar('0');
5508 ++G.prog.nchars; 5505 ++G.prog.nchars;
5509 } 5506 } else if (G.prog.ob_t == 10)
5510 else if (G.prog.ob_t == 10)
5511 bc_num_printDecimal(n); 5507 bc_num_printDecimal(n);
5512 else 5508 else
5513 s = zbc_num_printBase(n); 5509 s = zbc_num_printBase(n);
@@ -5765,7 +5761,8 @@ static BC_STATUS zbc_program_assign(char inst)
5765 "bad obase; must be [2,"BC_MAX_OBASE_STR"]", //BC_RESULT_OBASE 5761 "bad obase; must be [2,"BC_MAX_OBASE_STR"]", //BC_RESULT_OBASE
5766 }; 5762 };
5767 size_t *ptr; 5763 size_t *ptr;
5768 unsigned long val, max; 5764 size_t max;
5765 unsigned long val;
5769 5766
5770 s = zbc_num_ulong(l, &val); 5767 s = zbc_num_ulong(l, &val);
5771 if (s) RETURN_STATUS(s); 5768 if (s) RETURN_STATUS(s);
@@ -5773,9 +5770,8 @@ static BC_STATUS zbc_program_assign(char inst)
5773 if (sc) { 5770 if (sc) {
5774 max = BC_MAX_SCALE; 5771 max = BC_MAX_SCALE;
5775 ptr = &G.prog.scale; 5772 ptr = &G.prog.scale;
5776 } 5773 } else {
5777 else { 5774 if (val < 2)
5778 if (val < BC_NUM_MIN_BASE)
5779 RETURN_STATUS(bc_error(msg[s])); 5775 RETURN_STATUS(bc_error(msg[s]));
5780 max = ib ? BC_NUM_MAX_IBASE : BC_MAX_OBASE; 5776 max = ib ? BC_NUM_MAX_IBASE : BC_MAX_OBASE;
5781 ptr = ib ? &G.prog.ib_t : &G.prog.ob_t; 5777 ptr = ib ? &G.prog.ib_t : &G.prog.ob_t;
@@ -5783,8 +5779,8 @@ static BC_STATUS zbc_program_assign(char inst)
5783 5779
5784 if (val > max) 5780 if (val > max)
5785 RETURN_STATUS(bc_error(msg[s])); 5781 RETURN_STATUS(bc_error(msg[s]));
5786 if (!sc) 5782 if (!sc && !ib)
5787 bc_num_copy(ib ? &G.prog.ib : &G.prog.ob, l); 5783 bc_num_copy(&G.prog.ob, l);
5788 5784
5789 *ptr = (size_t) val; 5785 *ptr = (size_t) val;
5790 s = BC_STATUS_SUCCESS; 5786 s = BC_STATUS_SUCCESS;
@@ -7057,9 +7053,7 @@ static BC_STATUS zbc_vm_exec(void)
7057#if ENABLE_FEATURE_CLEAN_UP 7053#if ENABLE_FEATURE_CLEAN_UP
7058static void bc_program_free(void) 7054static void bc_program_free(void)
7059{ 7055{
7060 bc_num_free(&G.prog.ib);
7061 bc_num_free(&G.prog.ob); 7056 bc_num_free(&G.prog.ob);
7062 bc_num_free(&G.prog.hexb);
7063# if ENABLE_DC 7057# if ENABLE_DC
7064 bc_num_free(&G.prog.strmb); 7058 bc_num_free(&G.prog.strmb);
7065# endif 7059# endif
@@ -7097,18 +7091,12 @@ static void bc_program_init(void)
7097 memset(&ip, 0, sizeof(BcInstPtr)); 7091 memset(&ip, 0, sizeof(BcInstPtr));
7098 7092
7099 // G.prog.nchars = G.prog.scale = 0; - already is 7093 // G.prog.nchars = G.prog.scale = 0; - already is
7100 bc_num_init_DEF_SIZE(&G.prog.ib);
7101 bc_num_ten(&G.prog.ib);
7102 G.prog.ib_t = 10; 7094 G.prog.ib_t = 10;
7103 7095
7104 bc_num_init_DEF_SIZE(&G.prog.ob); 7096 bc_num_init_DEF_SIZE(&G.prog.ob);
7105 bc_num_ten(&G.prog.ob); 7097 bc_num_ten(&G.prog.ob);
7106 G.prog.ob_t = 10; 7098 G.prog.ob_t = 10;
7107 7099
7108 bc_num_init_DEF_SIZE(&G.prog.hexb);
7109 bc_num_ten(&G.prog.hexb);
7110 G.prog.hexb.num[0] = 6;
7111
7112#if ENABLE_DC 7100#if ENABLE_DC
7113 bc_num_init_DEF_SIZE(&G.prog.strmb); 7101 bc_num_init_DEF_SIZE(&G.prog.strmb);
7114 bc_num_ulong2num(&G.prog.strmb, UCHAR_MAX + 1); 7102 bc_num_ulong2num(&G.prog.strmb, UCHAR_MAX + 1);