diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-17 21:05:09 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-18 03:30:23 +0100 |
commit | f6e3f8511e3257022302ad82a6dd6951ff1eae52 (patch) | |
tree | c17615aa00d61c239e408d53d6f910cedb70501d | |
parent | 0f31a5c79e8d4a35f790d9f7f2c0a63e3c0d6808 (diff) | |
download | busybox-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.c | 60 |
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 |
2243 | static void bc_num_parseBase(BcNum *n, const char *val, BcNum *base) | 2239 | static 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) | |||
2306 | err: | 2305 | err: |
2307 | bc_num_free(&result); | 2306 | bc_num_free(&result); |
2308 | int_err: | 2307 | int_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 | ||
2313 | static BC_STATUS zbc_num_parse(BcNum *n, const char *val, BcNum *base, | 2313 | static 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 |
7058 | static void bc_program_free(void) | 7054 | static 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); |