diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-18 17:00:35 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-18 17:00:35 +0100 |
commit | d340143247f9b3aff486a2a6a4dc1e11ab8c8f86 (patch) | |
tree | 5b48a18dd37512b2e43a5da96f19ecc06ece479e /miscutils | |
parent | 09fe0aaefac905287fc4b533714ec961ec8c6968 (diff) | |
download | busybox-w32-d340143247f9b3aff486a2a6a4dc1e11ab8c8f86.tar.gz busybox-w32-d340143247f9b3aff486a2a6a4dc1e11ab8c8f86.tar.bz2 busybox-w32-d340143247f9b3aff486a2a6a4dc1e11ab8c8f86.zip |
bc: get rid of G.prog.ob, G.prog.strmb
function old new delta
zbc_num_printNum 489 540 +51
zbc_program_asciify 426 473 +47
zbc_program_print 686 684 -2
zbc_program_exec 4008 3995 -13
zbc_program_assign 474 440 -34
bc_vm_init 739 663 -76
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/4 up/down: 98/-125) Total: -27 bytes
text data bss dec hex filename
981404 485 7296 989185 f1801 busybox_old
981377 485 7296 989158 f17e6 busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'miscutils')
-rw-r--r-- | miscutils/bc.c | 49 |
1 files changed, 20 insertions, 29 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index 0b891d88a..566808e92 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c | |||
@@ -1355,14 +1355,6 @@ static void bc_num_one(BcNum *n) | |||
1355 | n->num[0] = 1; | 1355 | n->num[0] = 1; |
1356 | } | 1356 | } |
1357 | 1357 | ||
1358 | static void bc_num_ten(BcNum *n) | ||
1359 | { | ||
1360 | bc_num_setToZero(n, 0); | ||
1361 | n->len = 2; | ||
1362 | n->num[0] = 0; | ||
1363 | n->num[1] = 1; | ||
1364 | } | ||
1365 | |||
1366 | // Note: this also sets BcNum to zero | 1358 | // Note: this also sets BcNum to zero |
1367 | static void bc_num_init(BcNum *n, size_t req) | 1359 | static void bc_num_init(BcNum *n, size_t req) |
1368 | { | 1360 | { |
@@ -2251,6 +2243,7 @@ static void bc_num_parseBase(BcNum *n, const char *val, unsigned base_t) | |||
2251 | 2243 | ||
2252 | bc_num_init_DEF_SIZE(&temp); | 2244 | bc_num_init_DEF_SIZE(&temp); |
2253 | bc_num_init_DEF_SIZE(&mult); | 2245 | bc_num_init_DEF_SIZE(&mult); |
2246 | //TODO: have BcNumSmall type, with static buffer | ||
2254 | bc_num_init_DEF_SIZE(&base); | 2247 | bc_num_init_DEF_SIZE(&base); |
2255 | bc_num_ulong2num(&base, base_t); | 2248 | bc_num_ulong2num(&base, base_t); |
2256 | 2249 | ||
@@ -5314,10 +5307,11 @@ static void bc_num_printDecimal(BcNum *n) | |||
5314 | bc_num_printHex((size_t) n->num[i], 1, i == rdx); | 5307 | bc_num_printHex((size_t) n->num[i], 1, i == rdx); |
5315 | } | 5308 | } |
5316 | 5309 | ||
5317 | static BC_STATUS zbc_num_printNum(BcNum *n, BcNum *base, size_t width, BcNumDigitOp print) | 5310 | static BC_STATUS zbc_num_printNum(BcNum *n, unsigned base_t, size_t width, BcNumDigitOp print) |
5318 | { | 5311 | { |
5319 | BcStatus s; | 5312 | BcStatus s; |
5320 | BcVec stack; | 5313 | BcVec stack; |
5314 | BcNum base; | ||
5321 | BcNum intp, fracp, digit, frac_len; | 5315 | BcNum intp, fracp, digit, frac_len; |
5322 | unsigned long dig, *ptr; | 5316 | unsigned long dig, *ptr; |
5323 | size_t i; | 5317 | size_t i; |
@@ -5335,13 +5329,16 @@ static BC_STATUS zbc_num_printNum(BcNum *n, BcNum *base, size_t width, BcNumDigi | |||
5335 | bc_num_init(&frac_len, BC_NUM_INT(n)); | 5329 | bc_num_init(&frac_len, BC_NUM_INT(n)); |
5336 | bc_num_copy(&intp, n); | 5330 | bc_num_copy(&intp, n); |
5337 | bc_num_one(&frac_len); | 5331 | bc_num_one(&frac_len); |
5332 | //TODO: have BcNumSmall type, with static buffer | ||
5333 | bc_num_init_DEF_SIZE(&base); | ||
5334 | bc_num_ulong2num(&base, base_t); | ||
5338 | 5335 | ||
5339 | bc_num_truncate(&intp, intp.rdx); | 5336 | bc_num_truncate(&intp, intp.rdx); |
5340 | s = zbc_num_sub(n, &intp, &fracp, 0); | 5337 | s = zbc_num_sub(n, &intp, &fracp, 0); |
5341 | if (s) goto err; | 5338 | if (s) goto err; |
5342 | 5339 | ||
5343 | while (intp.len != 0) { | 5340 | while (intp.len != 0) { |
5344 | s = zbc_num_divmod(&intp, base, &intp, &digit, 0); | 5341 | s = zbc_num_divmod(&intp, &base, &intp, &digit, 0); |
5345 | if (s) goto err; | 5342 | if (s) goto err; |
5346 | s = zbc_num_ulong(&digit, &dig); | 5343 | s = zbc_num_ulong(&digit, &dig); |
5347 | if (s) goto err; | 5344 | if (s) goto err; |
@@ -5356,7 +5353,7 @@ static BC_STATUS zbc_num_printNum(BcNum *n, BcNum *base, size_t width, BcNumDigi | |||
5356 | if (!n->rdx) goto err; | 5353 | if (!n->rdx) goto err; |
5357 | 5354 | ||
5358 | for (radix = true; frac_len.len <= n->rdx; radix = false) { | 5355 | for (radix = true; frac_len.len <= n->rdx; radix = false) { |
5359 | s = zbc_num_mul(&fracp, base, &fracp, n->rdx); | 5356 | s = zbc_num_mul(&fracp, &base, &fracp, n->rdx); |
5360 | if (s) goto err; | 5357 | if (s) goto err; |
5361 | s = zbc_num_ulong(&fracp, &dig); | 5358 | s = zbc_num_ulong(&fracp, &dig); |
5362 | if (s) goto err; | 5359 | if (s) goto err; |
@@ -5364,10 +5361,11 @@ static BC_STATUS zbc_num_printNum(BcNum *n, BcNum *base, size_t width, BcNumDigi | |||
5364 | s = zbc_num_sub(&fracp, &intp, &fracp, 0); | 5361 | s = zbc_num_sub(&fracp, &intp, &fracp, 0); |
5365 | if (s) goto err; | 5362 | if (s) goto err; |
5366 | print(dig, width, radix); | 5363 | print(dig, width, radix); |
5367 | s = zbc_num_mul(&frac_len, base, &frac_len, 0); | 5364 | s = zbc_num_mul(&frac_len, &base, &frac_len, 0); |
5368 | if (s) goto err; | 5365 | if (s) goto err; |
5369 | } | 5366 | } |
5370 | err: | 5367 | err: |
5368 | bc_num_free(&base); | ||
5371 | bc_num_free(&frac_len); | 5369 | bc_num_free(&frac_len); |
5372 | bc_num_free(&digit); | 5370 | bc_num_free(&digit); |
5373 | bc_num_free(&fracp); | 5371 | bc_num_free(&fracp); |
@@ -5406,7 +5404,7 @@ static BC_STATUS zbc_num_printBase(BcNum *n) | |||
5406 | print = bc_num_printDigits; | 5404 | print = bc_num_printDigits; |
5407 | } | 5405 | } |
5408 | 5406 | ||
5409 | s = zbc_num_printNum(n, &G.prog.ob, width, print); | 5407 | s = zbc_num_printNum(n, G.prog.ob_t, width, print); |
5410 | n->neg = neg; | 5408 | n->neg = neg; |
5411 | 5409 | ||
5412 | RETURN_STATUS(s); | 5410 | RETURN_STATUS(s); |
@@ -5692,8 +5690,6 @@ static BC_STATUS zbc_program_assign(char inst) | |||
5692 | 5690 | ||
5693 | if (val > max) | 5691 | if (val > max) |
5694 | RETURN_STATUS(bc_error(msg[s])); | 5692 | RETURN_STATUS(bc_error(msg[s])); |
5695 | if (!sc && !ib) | ||
5696 | bc_num_copy(&G.prog.ob, l); | ||
5697 | 5693 | ||
5698 | *ptr = (size_t) val; | 5694 | *ptr = (size_t) val; |
5699 | s = BC_STATUS_SUCCESS; | 5695 | s = BC_STATUS_SUCCESS; |
@@ -6092,11 +6088,18 @@ static BC_STATUS zbc_program_asciify(void) | |||
6092 | if (s) RETURN_STATUS(s); | 6088 | if (s) RETURN_STATUS(s); |
6093 | 6089 | ||
6094 | if (BC_PROG_NUM(r, num)) { | 6090 | if (BC_PROG_NUM(r, num)) { |
6091 | BcNum strmb; | ||
6092 | |||
6095 | bc_num_init_DEF_SIZE(&n); | 6093 | bc_num_init_DEF_SIZE(&n); |
6096 | bc_num_copy(&n, num); | 6094 | bc_num_copy(&n, num); |
6097 | bc_num_truncate(&n, n.rdx); | 6095 | bc_num_truncate(&n, n.rdx); |
6098 | 6096 | ||
6099 | s = zbc_num_mod(&n, &G.prog.strmb, &n, 0); | 6097 | //TODO: have BcNumSmall type, with static buffer |
6098 | bc_num_init_DEF_SIZE(&strmb); | ||
6099 | bc_num_ulong2num(&strmb, 0x100); | ||
6100 | s = zbc_num_mod(&n, &strmb, &n, 0); | ||
6101 | bc_num_free(&strmb); | ||
6102 | |||
6100 | if (s) goto num_err; | 6103 | if (s) goto num_err; |
6101 | s = zbc_num_ulong(&n, &val); | 6104 | s = zbc_num_ulong(&n, &val); |
6102 | if (s) goto num_err; | 6105 | if (s) goto num_err; |
@@ -6156,7 +6159,7 @@ static BC_STATUS zbc_program_printStream(void) | |||
6156 | if (s) RETURN_STATUS(s); | 6159 | if (s) RETURN_STATUS(s); |
6157 | 6160 | ||
6158 | if (BC_PROG_NUM(r, n)) { | 6161 | if (BC_PROG_NUM(r, n)) { |
6159 | s = zbc_num_printNum(n, &G.prog.strmb, 1, bc_num_printChar); | 6162 | s = zbc_num_printNum(n, 0x100, 1, bc_num_printChar); |
6160 | } else { | 6163 | } else { |
6161 | idx = (r->t == BC_RESULT_STR) ? r->d.id.idx : n->rdx; | 6164 | idx = (r->t == BC_RESULT_STR) ? r->d.id.idx : n->rdx; |
6162 | str = *bc_program_str(idx); | 6165 | str = *bc_program_str(idx); |
@@ -6945,10 +6948,6 @@ static BC_STATUS zbc_vm_exec(void) | |||
6945 | #if ENABLE_FEATURE_CLEAN_UP | 6948 | #if ENABLE_FEATURE_CLEAN_UP |
6946 | static void bc_program_free(void) | 6949 | static void bc_program_free(void) |
6947 | { | 6950 | { |
6948 | bc_num_free(&G.prog.ob); | ||
6949 | # if ENABLE_DC | ||
6950 | bc_num_free(&G.prog.strmb); | ||
6951 | # endif | ||
6952 | bc_vec_free(&G.prog.fns); | 6951 | bc_vec_free(&G.prog.fns); |
6953 | bc_vec_free(&G.prog.fn_map); | 6952 | bc_vec_free(&G.prog.fn_map); |
6954 | bc_vec_free(&G.prog.vars); | 6953 | bc_vec_free(&G.prog.vars); |
@@ -6984,16 +6983,8 @@ static void bc_program_init(void) | |||
6984 | 6983 | ||
6985 | // G.prog.nchars = G.prog.scale = 0; - already is | 6984 | // G.prog.nchars = G.prog.scale = 0; - already is |
6986 | G.prog.ib_t = 10; | 6985 | G.prog.ib_t = 10; |
6987 | |||
6988 | bc_num_init_DEF_SIZE(&G.prog.ob); | ||
6989 | bc_num_ten(&G.prog.ob); | ||
6990 | G.prog.ob_t = 10; | 6986 | G.prog.ob_t = 10; |
6991 | 6987 | ||
6992 | #if ENABLE_DC | ||
6993 | bc_num_init_DEF_SIZE(&G.prog.strmb); | ||
6994 | bc_num_ulong2num(&G.prog.strmb, UCHAR_MAX + 1); | ||
6995 | #endif | ||
6996 | |||
6997 | bc_num_init_DEF_SIZE(&G.prog.last); | 6988 | bc_num_init_DEF_SIZE(&G.prog.last); |
6998 | //bc_num_zero(&G.prog.last); - already is | 6989 | //bc_num_zero(&G.prog.last); - already is |
6999 | 6990 | ||