diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-08 23:18:06 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-08 23:18:06 +0100 |
commit | 5f1b90b91af1076e6ba63afa7e4d7a3dbf841ce2 (patch) | |
tree | c3b9f8cbf0634371fb0779a98c0d0a992d38fc50 | |
parent | 2a8ad4873407900e51e22b462106261a41cf8941 (diff) | |
download | busybox-w32-5f1b90b91af1076e6ba63afa7e4d7a3dbf841ce2.tar.gz busybox-w32-5f1b90b91af1076e6ba63afa7e4d7a3dbf841ce2.tar.bz2 busybox-w32-5f1b90b91af1076e6ba63afa7e4d7a3dbf841ce2.zip |
bc: stop propagating pointer to G.prog.nchars deep into printing functions
function old new delta
bc_num_printHex 62 71 +9
bc_num_printNewline 47 54 +7
bc_num_printDigits 132 136 +4
bc_num_printChar 23 27 +4
bc_program_printStream 173 163 -10
bc_program_print 754 739 -15
bc_num_printNum 538 514 -24
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 4/3 up/down: 24/-49) Total: -25 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | miscutils/bc.c | 93 |
1 files changed, 45 insertions, 48 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index a3702756d..4fb6e77ab 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c | |||
@@ -221,7 +221,7 @@ typedef struct BcNum { | |||
221 | 221 | ||
222 | #define BC_NUM_KARATSUBA_LEN (32) | 222 | #define BC_NUM_KARATSUBA_LEN (32) |
223 | 223 | ||
224 | typedef void (*BcNumDigitOp)(size_t, size_t, bool, size_t *); | 224 | typedef void (*BcNumDigitOp)(size_t, size_t, bool); |
225 | 225 | ||
226 | typedef BcStatus (*BcNumBinaryOp)(BcNum *, BcNum *, BcNum *, size_t); | 226 | typedef BcStatus (*BcNumBinaryOp)(BcNum *, BcNum *, BcNum *, size_t); |
227 | 227 | ||
@@ -2310,74 +2310,70 @@ int_err: | |||
2310 | bc_num_free(&temp); | 2310 | bc_num_free(&temp); |
2311 | } | 2311 | } |
2312 | 2312 | ||
2313 | static void bc_num_printNewline(size_t *nchars) | 2313 | static void bc_num_printNewline(void) |
2314 | { | 2314 | { |
2315 | if (*nchars == G.prog.len - 1) { | 2315 | if (G.prog.nchars == G.prog.len - 1) { |
2316 | bb_putchar('\\'); | 2316 | bb_putchar('\\'); |
2317 | bb_putchar('\n'); | 2317 | bb_putchar('\n'); |
2318 | *nchars = 0; | 2318 | G.prog.nchars = 0; |
2319 | } | 2319 | } |
2320 | } | 2320 | } |
2321 | 2321 | ||
2322 | #if ENABLE_DC | 2322 | #if ENABLE_DC |
2323 | static void bc_num_printChar(size_t num, size_t width, bool radix, | 2323 | static void bc_num_printChar(size_t num, size_t width, bool radix) |
2324 | size_t *nchars) | ||
2325 | { | 2324 | { |
2326 | (void) radix; | 2325 | (void) radix; |
2327 | bb_putchar((char) num); | 2326 | bb_putchar((char) num); |
2328 | *nchars = *nchars + width; | 2327 | G.prog.nchars += width; |
2329 | } | 2328 | } |
2330 | #endif | 2329 | #endif |
2331 | 2330 | ||
2332 | static void bc_num_printDigits(size_t num, size_t width, bool radix, | 2331 | static void bc_num_printDigits(size_t num, size_t width, bool radix) |
2333 | size_t *nchars) | ||
2334 | { | 2332 | { |
2335 | size_t exp, pow; | 2333 | size_t exp, pow; |
2336 | 2334 | ||
2337 | bc_num_printNewline(nchars); | 2335 | bc_num_printNewline(); |
2338 | bb_putchar(radix ? '.' : ' '); | 2336 | bb_putchar(radix ? '.' : ' '); |
2339 | ++(*nchars); | 2337 | ++G.prog.nchars; |
2340 | 2338 | ||
2341 | bc_num_printNewline(nchars); | 2339 | bc_num_printNewline(); |
2342 | for (exp = 0, pow = 1; exp < width - 1; ++exp, pow *= 10) | 2340 | for (exp = 0, pow = 1; exp < width - 1; ++exp, pow *= 10) |
2343 | continue; | 2341 | continue; |
2344 | 2342 | ||
2345 | for (exp = 0; exp < width; pow /= 10, ++(*nchars), ++exp) { | 2343 | for (exp = 0; exp < width; pow /= 10, ++G.prog.nchars, ++exp) { |
2346 | size_t dig; | 2344 | size_t dig; |
2347 | bc_num_printNewline(nchars); | 2345 | bc_num_printNewline(); |
2348 | dig = num / pow; | 2346 | dig = num / pow; |
2349 | num -= dig * pow; | 2347 | num -= dig * pow; |
2350 | bb_putchar(((char) dig) + '0'); | 2348 | bb_putchar(((char) dig) + '0'); |
2351 | } | 2349 | } |
2352 | } | 2350 | } |
2353 | 2351 | ||
2354 | static void bc_num_printHex(size_t num, size_t width, bool radix, | 2352 | static void bc_num_printHex(size_t num, size_t width, bool radix) |
2355 | size_t *nchars) | ||
2356 | { | 2353 | { |
2357 | if (radix) { | 2354 | if (radix) { |
2358 | bc_num_printNewline(nchars); | 2355 | bc_num_printNewline(); |
2359 | bb_putchar('.'); | 2356 | bb_putchar('.'); |
2360 | *nchars += 1; | 2357 | G.prog.nchars += 1; |
2361 | } | 2358 | } |
2362 | 2359 | ||
2363 | bc_num_printNewline(nchars); | 2360 | bc_num_printNewline(); |
2364 | bb_putchar(bb_hexdigits_upcase[num]); | 2361 | bb_putchar(bb_hexdigits_upcase[num]); |
2365 | *nchars = *nchars + width; | 2362 | G.prog.nchars += width; |
2366 | } | 2363 | } |
2367 | 2364 | ||
2368 | static void bc_num_printDecimal(BcNum *n, size_t *nchars) | 2365 | static void bc_num_printDecimal(BcNum *n) |
2369 | { | 2366 | { |
2370 | size_t i, rdx = n->rdx - 1; | 2367 | size_t i, rdx = n->rdx - 1; |
2371 | 2368 | ||
2372 | if (n->neg) bb_putchar('-'); | 2369 | if (n->neg) bb_putchar('-'); |
2373 | (*nchars) += n->neg; | 2370 | G.prog.nchars += n->neg; |
2374 | 2371 | ||
2375 | for (i = n->len - 1; i < n->len; --i) | 2372 | for (i = n->len - 1; i < n->len; --i) |
2376 | bc_num_printHex((size_t) n->num[i], 1, i == rdx, nchars); | 2373 | bc_num_printHex((size_t) n->num[i], 1, i == rdx); |
2377 | } | 2374 | } |
2378 | 2375 | ||
2379 | static BcStatus bc_num_printNum(BcNum *n, BcNum *base, size_t width, | 2376 | static BcStatus bc_num_printNum(BcNum *n, BcNum *base, size_t width, BcNumDigitOp print) |
2380 | size_t *nchars, BcNumDigitOp print) | ||
2381 | { | 2377 | { |
2382 | BcStatus s; | 2378 | BcStatus s; |
2383 | BcVec stack; | 2379 | BcVec stack; |
@@ -2387,7 +2383,7 @@ static BcStatus bc_num_printNum(BcNum *n, BcNum *base, size_t width, | |||
2387 | bool radix; | 2383 | bool radix; |
2388 | 2384 | ||
2389 | if (n->len == 0) { | 2385 | if (n->len == 0) { |
2390 | print(0, width, false, nchars); | 2386 | print(0, width, false); |
2391 | return BC_STATUS_SUCCESS; | 2387 | return BC_STATUS_SUCCESS; |
2392 | } | 2388 | } |
2393 | 2389 | ||
@@ -2413,7 +2409,7 @@ static BcStatus bc_num_printNum(BcNum *n, BcNum *base, size_t width, | |||
2413 | 2409 | ||
2414 | for (i = 0; i < stack.len; ++i) { | 2410 | for (i = 0; i < stack.len; ++i) { |
2415 | ptr = bc_vec_item_rev(&stack, i); | 2411 | ptr = bc_vec_item_rev(&stack, i); |
2416 | print(*ptr, width, false, nchars); | 2412 | print(*ptr, width, false); |
2417 | } | 2413 | } |
2418 | 2414 | ||
2419 | if (!n->rdx) goto err; | 2415 | if (!n->rdx) goto err; |
@@ -2426,7 +2422,7 @@ static BcStatus bc_num_printNum(BcNum *n, BcNum *base, size_t width, | |||
2426 | bc_num_ulong2num(&intp, dig); | 2422 | bc_num_ulong2num(&intp, dig); |
2427 | s = bc_num_sub(&fracp, &intp, &fracp, 0); | 2423 | s = bc_num_sub(&fracp, &intp, &fracp, 0); |
2428 | if (s) goto err; | 2424 | if (s) goto err; |
2429 | print(dig, width, radix, nchars); | 2425 | print(dig, width, radix); |
2430 | s = bc_num_mul(&frac_len, base, &frac_len, 0); | 2426 | s = bc_num_mul(&frac_len, base, &frac_len, 0); |
2431 | if (s) goto err; | 2427 | if (s) goto err; |
2432 | } | 2428 | } |
@@ -2440,8 +2436,7 @@ err: | |||
2440 | return s; | 2436 | return s; |
2441 | } | 2437 | } |
2442 | 2438 | ||
2443 | static BcStatus bc_num_printBase(BcNum *n, BcNum *base, size_t base_t, | 2439 | static BcStatus bc_num_printBase(BcNum *n, BcNum *base, size_t base_t) |
2444 | size_t *nchars) | ||
2445 | { | 2440 | { |
2446 | BcStatus s; | 2441 | BcStatus s; |
2447 | size_t width, i; | 2442 | size_t width, i; |
@@ -2449,7 +2444,7 @@ static BcStatus bc_num_printBase(BcNum *n, BcNum *base, size_t base_t, | |||
2449 | bool neg = n->neg; | 2444 | bool neg = n->neg; |
2450 | 2445 | ||
2451 | if (neg) bb_putchar('-'); | 2446 | if (neg) bb_putchar('-'); |
2452 | (*nchars) += neg; | 2447 | G.prog.nchars += neg; |
2453 | 2448 | ||
2454 | n->neg = false; | 2449 | n->neg = false; |
2455 | 2450 | ||
@@ -2462,16 +2457,16 @@ static BcStatus bc_num_printBase(BcNum *n, BcNum *base, size_t base_t, | |||
2462 | print = bc_num_printDigits; | 2457 | print = bc_num_printDigits; |
2463 | } | 2458 | } |
2464 | 2459 | ||
2465 | s = bc_num_printNum(n, base, width, nchars, print); | 2460 | s = bc_num_printNum(n, base, width, print); |
2466 | n->neg = neg; | 2461 | n->neg = neg; |
2467 | 2462 | ||
2468 | return s; | 2463 | return s; |
2469 | } | 2464 | } |
2470 | 2465 | ||
2471 | #if ENABLE_DC | 2466 | #if ENABLE_DC |
2472 | static BcStatus bc_num_stream(BcNum *n, BcNum *base, size_t *nchars) | 2467 | static BcStatus bc_num_stream(BcNum *n, BcNum *base) |
2473 | { | 2468 | { |
2474 | return bc_num_printNum(n, base, 1, nchars, bc_num_printChar); | 2469 | return bc_num_printNum(n, base, 1, bc_num_printChar); |
2475 | } | 2470 | } |
2476 | #endif | 2471 | #endif |
2477 | 2472 | ||
@@ -2489,25 +2484,27 @@ static BcStatus bc_num_parse(BcNum *n, const char *val, BcNum *base, | |||
2489 | return BC_STATUS_SUCCESS; | 2484 | return BC_STATUS_SUCCESS; |
2490 | } | 2485 | } |
2491 | 2486 | ||
2492 | static BcStatus bc_num_print(BcNum *n, BcNum *base, size_t base_t, bool newline, | 2487 | static BcStatus bc_num_print(BcNum *n, bool newline) |
2493 | size_t *nchars) | ||
2494 | { | 2488 | { |
2489 | BcNum *base = &G.prog.ob; | ||
2490 | size_t base_t = G.prog.ob_t; | ||
2491 | |||
2495 | BcStatus s = BC_STATUS_SUCCESS; | 2492 | BcStatus s = BC_STATUS_SUCCESS; |
2496 | 2493 | ||
2497 | bc_num_printNewline(nchars); | 2494 | bc_num_printNewline(); |
2498 | 2495 | ||
2499 | if (n->len == 0) { | 2496 | if (n->len == 0) { |
2500 | bb_putchar('0'); | 2497 | bb_putchar('0'); |
2501 | ++(*nchars); | 2498 | ++G.prog.nchars; |
2502 | } | 2499 | } |
2503 | else if (base_t == 10) | 2500 | else if (base_t == 10) |
2504 | bc_num_printDecimal(n, nchars); | 2501 | bc_num_printDecimal(n); |
2505 | else | 2502 | else |
2506 | s = bc_num_printBase(n, base, base_t, nchars); | 2503 | s = bc_num_printBase(n, base, base_t); |
2507 | 2504 | ||
2508 | if (newline) { | 2505 | if (newline) { |
2509 | bb_putchar('\n'); | 2506 | bb_putchar('\n'); |
2510 | *nchars = 0; | 2507 | G.prog.nchars = 0; |
2511 | } | 2508 | } |
2512 | 2509 | ||
2513 | return s; | 2510 | return s; |
@@ -5617,7 +5614,7 @@ static char *bc_program_name(char *code, size_t *bgn) | |||
5617 | return s; | 5614 | return s; |
5618 | } | 5615 | } |
5619 | 5616 | ||
5620 | static void bc_program_printString(const char *str, size_t *nchars) | 5617 | static void bc_program_printString(const char *str) |
5621 | { | 5618 | { |
5622 | size_t i, len = strlen(str); | 5619 | size_t i, len = strlen(str); |
5623 | 5620 | ||
@@ -5628,7 +5625,7 @@ static void bc_program_printString(const char *str, size_t *nchars) | |||
5628 | } | 5625 | } |
5629 | #endif | 5626 | #endif |
5630 | 5627 | ||
5631 | for (i = 0; i < len; ++i, ++(*nchars)) { | 5628 | for (i = 0; i < len; ++i, ++G.prog.nchars) { |
5632 | 5629 | ||
5633 | int c = str[i]; | 5630 | int c = str[i]; |
5634 | 5631 | ||
@@ -5668,7 +5665,7 @@ static void bc_program_printString(const char *str, size_t *nchars) | |||
5668 | case 'n': | 5665 | case 'n': |
5669 | { | 5666 | { |
5670 | bb_putchar('\n'); | 5667 | bb_putchar('\n'); |
5671 | *nchars = SIZE_MAX; | 5668 | G.prog.nchars = SIZE_MAX; |
5672 | break; | 5669 | break; |
5673 | } | 5670 | } |
5674 | 5671 | ||
@@ -5694,7 +5691,7 @@ static void bc_program_printString(const char *str, size_t *nchars) | |||
5694 | { | 5691 | { |
5695 | // Just print the backslash and following character. | 5692 | // Just print the backslash and following character. |
5696 | bb_putchar('\\'); | 5693 | bb_putchar('\\'); |
5697 | ++(*nchars); | 5694 | ++G.prog.nchars; |
5698 | bb_putchar(c); | 5695 | bb_putchar(c); |
5699 | break; | 5696 | break; |
5700 | } | 5697 | } |
@@ -5720,7 +5717,7 @@ static BcStatus bc_program_print(char inst, size_t idx) | |||
5720 | if (s) return s; | 5717 | if (s) return s; |
5721 | 5718 | ||
5722 | if (BC_PROG_NUM(r, num)) { | 5719 | if (BC_PROG_NUM(r, num)) { |
5723 | s = bc_num_print(num, &G.prog.ob, G.prog.ob_t, !pop, &G.prog.nchars); | 5720 | s = bc_num_print(num, !pop); |
5724 | if (!s) bc_num_copy(&G.prog.last, num); | 5721 | if (!s) bc_num_copy(&G.prog.last, num); |
5725 | } | 5722 | } |
5726 | else { | 5723 | else { |
@@ -5737,7 +5734,7 @@ static BcStatus bc_program_print(char inst, size_t idx) | |||
5737 | } | 5734 | } |
5738 | } | 5735 | } |
5739 | else { | 5736 | else { |
5740 | bc_program_printString(str, &G.prog.nchars); | 5737 | bc_program_printString(str); |
5741 | if (inst == BC_INST_PRINT) bb_putchar('\n'); | 5738 | if (inst == BC_INST_PRINT) bb_putchar('\n'); |
5742 | } | 5739 | } |
5743 | } | 5740 | } |
@@ -6451,7 +6448,7 @@ static BcStatus bc_program_printStream(void) | |||
6451 | if (s) return s; | 6448 | if (s) return s; |
6452 | 6449 | ||
6453 | if (BC_PROG_NUM(r, n)) | 6450 | if (BC_PROG_NUM(r, n)) |
6454 | s = bc_num_stream(n, &G.prog.strmb, &G.prog.nchars); | 6451 | s = bc_num_stream(n, &G.prog.strmb); |
6455 | else { | 6452 | else { |
6456 | idx = (r->t == BC_RESULT_STR) ? r->d.id.idx : n->rdx; | 6453 | idx = (r->t == BC_RESULT_STR) ? r->d.id.idx : n->rdx; |
6457 | str = *((char **) bc_vec_item(&G.prog.strs, idx)); | 6454 | str = *((char **) bc_vec_item(&G.prog.strs, idx)); |