aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-12-08 23:18:06 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-12-08 23:18:06 +0100
commit5f1b90b91af1076e6ba63afa7e4d7a3dbf841ce2 (patch)
treec3b9f8cbf0634371fb0779a98c0d0a992d38fc50
parent2a8ad4873407900e51e22b462106261a41cf8941 (diff)
downloadbusybox-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.c93
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
224typedef void (*BcNumDigitOp)(size_t, size_t, bool, size_t *); 224typedef void (*BcNumDigitOp)(size_t, size_t, bool);
225 225
226typedef BcStatus (*BcNumBinaryOp)(BcNum *, BcNum *, BcNum *, size_t); 226typedef 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
2313static void bc_num_printNewline(size_t *nchars) 2313static 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
2323static void bc_num_printChar(size_t num, size_t width, bool radix, 2323static 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
2332static void bc_num_printDigits(size_t num, size_t width, bool radix, 2331static 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
2354static void bc_num_printHex(size_t num, size_t width, bool radix, 2352static 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
2368static void bc_num_printDecimal(BcNum *n, size_t *nchars) 2365static 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
2379static BcStatus bc_num_printNum(BcNum *n, BcNum *base, size_t width, 2376static 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
2443static BcStatus bc_num_printBase(BcNum *n, BcNum *base, size_t base_t, 2439static 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
2472static BcStatus bc_num_stream(BcNum *n, BcNum *base, size_t *nchars) 2467static 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
2492static BcStatus bc_num_print(BcNum *n, BcNum *base, size_t base_t, bool newline, 2487static 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
5620static void bc_program_printString(const char *str, size_t *nchars) 5617static 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));