aboutsummaryrefslogtreecommitdiff
path: root/miscutils/bc.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-12-20 16:24:18 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-12-20 16:24:18 +0100
commit503faf9d5331b70d93836d221ff12f97d769499b (patch)
treeeafea86b6bfc5b2b61a434ff0cf8e88bc31abe2e /miscutils/bc.c
parenteaa3b00002e23e2ecccade3e06790dd524e7b662 (diff)
downloadbusybox-w32-503faf9d5331b70d93836d221ff12f97d769499b.tar.gz
busybox-w32-503faf9d5331b70d93836d221ff12f97d769499b.tar.bz2
busybox-w32-503faf9d5331b70d93836d221ff12f97d769499b.zip
bc: shrink "dc only" code by dropping unused structure members
function old new delta zbc_program_num 979 981 +2 zbc_program_pushArray 147 145 -2 bc_program_pushVar 198 196 -2 bc_program_func 17 15 -2 dc_num_printChar 24 21 -3 bc_program_retire 35 32 -3 bc_program_binOpRetire 46 43 -3 zdc_program_printStream 153 148 -5 zbc_program_prep 91 86 -5 zbc_program_copyToVar 300 295 -5 zdc_program_modexp 721 715 -6 zbc_program_binOpPrep 311 305 -6 bc_program_addFunc 138 132 -6 bc_num_printNewline 51 45 -6 bc_num_printHex 67 61 -6 bc_num_printDigits 137 131 -6 zdc_program_assignStr 146 137 -9 bc_program_reset 64 55 -9 bc_func_free 27 5 -22 bc_parse_free 38 8 -30 bc_parse_create 92 47 -45 bc_func_init 50 5 -45 dc_main 691 645 -46 zdc_program_execStr 496 442 -54 zbc_program_print 677 623 -54 zbc_vm_process 204 137 -67 zbc_program_exec 4132 4057 -75 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/26 up/down: 2/-522) Total: -520 bytes text data bss dec hex filename 969767 485 7296 977548 eea8c busybox_old 969210 485 7296 976991 ee85f busybox_unstripped Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to '')
-rw-r--r--miscutils/bc.c87
1 files changed, 46 insertions, 41 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c
index c59d5a2b5..c5288102d 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -348,9 +348,9 @@ typedef struct BcId {
348 348
349typedef struct BcFunc { 349typedef struct BcFunc {
350 BcVec code; 350 BcVec code;
351 BcVec labels; 351 IF_BC(BcVec labels;)
352 size_t nparams; 352 IF_BC(BcVec autos;)
353 BcVec autos; 353 IF_BC(size_t nparams;)
354} BcFunc; 354} BcFunc;
355 355
356typedef enum BcResultType { 356typedef enum BcResultType {
@@ -385,7 +385,7 @@ typedef struct BcResult {
385typedef struct BcInstPtr { 385typedef struct BcInstPtr {
386 size_t func; 386 size_t func;
387 size_t idx; 387 size_t idx;
388 size_t len; 388 IF_BC(size_t len;)
389} BcInstPtr; 389} BcInstPtr;
390 390
391// BC_LEX_NEG is not used in lexing; it is only for parsing. 391// BC_LEX_NEG is not used in lexing; it is only for parsing.
@@ -664,30 +664,29 @@ typedef struct BcLex {
664typedef struct BcParse { 664typedef struct BcParse {
665 BcLex l; 665 BcLex l;
666 666
667 BcVec exits; 667 IF_BC(BcVec exits;)
668 BcVec conds; 668 IF_BC(BcVec conds;)
669 669 IF_BC(BcVec ops;)
670 BcVec ops;
671 670
672 BcFunc *func; 671 BcFunc *func;
673 size_t fidx; 672 size_t fidx;
674 673
675 size_t in_funcdef; 674 IF_BC(size_t in_funcdef;)
676} BcParse; 675} BcParse;
677 676
678typedef struct BcProgram { 677typedef struct BcProgram {
679 size_t len; 678 size_t len;
680 size_t scale; 679 size_t nchars;
681 680
681 size_t scale;
682 size_t ib_t; 682 size_t ib_t;
683 size_t ob_t; 683 size_t ob_t;
684 BcNum ob;
685 684
686 BcVec results; 685 BcVec results;
687 BcVec exestack; 686 BcVec exestack;
688 687
689 BcVec fns; 688 BcVec fns;
690 BcVec fn_map; 689 BcVec fn_map; //TODO: dc does not need this, its 'functions' are anonynomous (have no names)
691 690
692 BcVec vars; 691 BcVec vars;
693 BcVec var_map; 692 BcVec var_map;
@@ -700,11 +699,9 @@ typedef struct BcProgram {
700 699
701 const char *file; 700 const char *file;
702 701
703 BcNum last;
704 BcNum zero; 702 BcNum zero;
705 BcNum one; 703 IF_BC(BcNum one;)
706 704 IF_BC(BcNum last;)
707 size_t nchars;
708} BcProgram; 705} BcProgram;
709 706
710#define BC_PROG_MAIN (0) 707#define BC_PROG_MAIN (0)
@@ -1616,6 +1613,7 @@ static BC_STATUS zbc_num_shift(BcNum *n, size_t places)
1616 1613
1617static BC_STATUS zbc_num_inv(BcNum *a, BcNum *b, size_t scale) 1614static BC_STATUS zbc_num_inv(BcNum *a, BcNum *b, size_t scale)
1618{ 1615{
1616//TODO: nice example of non-allocated BcNum, use in other places as well!
1619 BcNum one; 1617 BcNum one;
1620 BcDig num[2]; 1618 BcDig num[2];
1621 1619
@@ -2527,17 +2525,17 @@ static BC_STATUS zbc_func_insert(BcFunc *f, char *name, bool var)
2527static void bc_func_init(BcFunc *f) 2525static void bc_func_init(BcFunc *f)
2528{ 2526{
2529 bc_char_vec_init(&f->code); 2527 bc_char_vec_init(&f->code);
2530 bc_vec_init(&f->autos, sizeof(BcId), bc_id_free); 2528 IF_BC(bc_vec_init(&f->labels, sizeof(size_t), NULL);)
2531 bc_vec_init(&f->labels, sizeof(size_t), NULL); 2529 IF_BC(bc_vec_init(&f->autos, sizeof(BcId), bc_id_free);)
2532 f->nparams = 0; 2530 IF_BC(f->nparams = 0;)
2533} 2531}
2534 2532
2535static FAST_FUNC void bc_func_free(void *func) 2533static FAST_FUNC void bc_func_free(void *func)
2536{ 2534{
2537 BcFunc *f = (BcFunc *) func; 2535 BcFunc *f = (BcFunc *) func;
2538 bc_vec_free(&f->code); 2536 bc_vec_free(&f->code);
2539 bc_vec_free(&f->autos); 2537 IF_BC(bc_vec_free(&f->labels);)
2540 bc_vec_free(&f->labels); 2538 IF_BC(bc_vec_free(&f->autos);)
2541} 2539}
2542 2540
2543static void bc_array_expand(BcVec *a, size_t len); 2541static void bc_array_expand(BcVec *a, size_t len);
@@ -3566,10 +3564,10 @@ static void bc_program_reset(void)
3566static void bc_parse_reset(BcParse *p) 3564static void bc_parse_reset(BcParse *p)
3567{ 3565{
3568 if (p->fidx != BC_PROG_MAIN) { 3566 if (p->fidx != BC_PROG_MAIN) {
3569 p->func->nparams = 0;
3570 bc_vec_pop_all(&p->func->code); 3567 bc_vec_pop_all(&p->func->code);
3571 bc_vec_pop_all(&p->func->autos); 3568 IF_BC(bc_vec_pop_all(&p->func->labels);)
3572 bc_vec_pop_all(&p->func->labels); 3569 IF_BC(bc_vec_pop_all(&p->func->autos);)
3570 IF_BC(p->func->nparams = 0;)
3573 3571
3574 p->fidx = BC_PROG_MAIN; 3572 p->fidx = BC_PROG_MAIN;
3575 p->func = bc_program_func_BC_PROG_MAIN(); 3573 p->func = bc_program_func_BC_PROG_MAIN();
@@ -3578,18 +3576,18 @@ static void bc_parse_reset(BcParse *p)
3578 p->l.i = p->l.len; 3576 p->l.i = p->l.len;
3579 p->l.t.t = BC_LEX_EOF; 3577 p->l.t.t = BC_LEX_EOF;
3580 3578
3581 bc_vec_pop_all(&p->exits); 3579 IF_BC(bc_vec_pop_all(&p->exits);)
3582 bc_vec_pop_all(&p->conds); 3580 IF_BC(bc_vec_pop_all(&p->conds);)
3583 bc_vec_pop_all(&p->ops); 3581 IF_BC(bc_vec_pop_all(&p->ops);)
3584 3582
3585 bc_program_reset(); 3583 bc_program_reset();
3586} 3584}
3587 3585
3588static void bc_parse_free(BcParse *p) 3586static void bc_parse_free(BcParse *p)
3589{ 3587{
3590 bc_vec_free(&p->exits); 3588 IF_BC(bc_vec_free(&p->exits);)
3591 bc_vec_free(&p->conds); 3589 IF_BC(bc_vec_free(&p->conds);)
3592 bc_vec_free(&p->ops); 3590 IF_BC(bc_vec_free(&p->ops);)
3593 bc_lex_free(&p->l); 3591 bc_lex_free(&p->l);
3594} 3592}
3595 3593
@@ -3598,9 +3596,9 @@ static void bc_parse_create(BcParse *p, size_t fidx)
3598 memset(p, 0, sizeof(BcParse)); 3596 memset(p, 0, sizeof(BcParse));
3599 3597
3600 bc_lex_init(&p->l); 3598 bc_lex_init(&p->l);
3601 bc_vec_init(&p->exits, sizeof(size_t), NULL); 3599 IF_BC(bc_vec_init(&p->exits, sizeof(size_t), NULL);)
3602 bc_vec_init(&p->conds, sizeof(size_t), NULL); 3600 IF_BC(bc_vec_init(&p->conds, sizeof(size_t), NULL);)
3603 bc_vec_init(&p->ops, sizeof(BcLexType), NULL); 3601 IF_BC(bc_vec_init(&p->ops, sizeof(BcLexType), NULL);)
3604 3602
3605 p->fidx = fidx; 3603 p->fidx = fidx;
3606 p->func = bc_program_func(fidx); 3604 p->func = bc_program_func(fidx);
@@ -5036,12 +5034,17 @@ static BC_STATUS zbc_program_num(BcResult *r, BcNum **num, bool hex)
5036 *num = bc_vec_top(v); 5034 *num = bc_vec_top(v);
5037 break; 5035 break;
5038 } 5036 }
5037#if ENABLE_BC
5039 case BC_RESULT_LAST: 5038 case BC_RESULT_LAST:
5040 *num = &G.prog.last; 5039 *num = &G.prog.last;
5041 break; 5040 break;
5042 case BC_RESULT_ONE: 5041 case BC_RESULT_ONE:
5043 *num = &G.prog.one; 5042 *num = &G.prog.one;
5044 break; 5043 break;
5044#endif
5045 default:
5046 // Testing the theory that dc does not reach LAST/ONE
5047 bb_error_msg_and_die("BUG:%d", r->t);
5045 } 5048 }
5046 5049
5047 RETURN_STATUS(BC_STATUS_SUCCESS); 5050 RETURN_STATUS(BC_STATUS_SUCCESS);
@@ -5178,7 +5181,7 @@ static BC_STATUS zbc_program_read(void)
5178 5181
5179 ip.func = BC_PROG_READ; 5182 ip.func = BC_PROG_READ;
5180 ip.idx = 0; 5183 ip.idx = 0;
5181 ip.len = G.prog.results.len; 5184 IF_BC(ip.len = G.prog.results.len;)
5182 5185
5183 // Update this pointer, just in case. 5186 // Update this pointer, just in case.
5184 f = bc_program_func(BC_PROG_READ); 5187 f = bc_program_func(BC_PROG_READ);
@@ -5496,7 +5499,9 @@ static BC_STATUS zbc_program_print(char inst, size_t idx)
5496 5499
5497 if (BC_PROG_NUM(r, num)) { 5500 if (BC_PROG_NUM(r, num)) {
5498 s = zbc_num_print(num, !pop); 5501 s = zbc_num_print(num, !pop);
5499 if (!s) bc_num_copy(&G.prog.last, num); 5502#if ENABLE_BC
5503 if (!s && IS_BC) bc_num_copy(&G.prog.last, num);
5504#endif
5500 } else { 5505 } else {
5501 char *str; 5506 char *str;
5502 5507
@@ -6322,7 +6327,7 @@ static BC_STATUS zdc_program_execStr(char *code, size_t *bgn, bool cond)
6322 } 6327 }
6323 6328
6324 ip.idx = 0; 6329 ip.idx = 0;
6325 ip.len = G.prog.results.len; 6330 IF_BC(ip.len = G.prog.results.len;)
6326 ip.func = fidx; 6331 ip.func = fidx;
6327 6332
6328 bc_vec_pop(&G.prog.results); 6333 bc_vec_pop(&G.prog.results);
@@ -6977,7 +6982,7 @@ static void bc_program_free(void)
6977 bc_vec_free(&G.prog.exestack); 6982 bc_vec_free(&G.prog.exestack);
6978 bc_num_free(&G.prog.last); 6983 bc_num_free(&G.prog.last);
6979 bc_num_free(&G.prog.zero); 6984 bc_num_free(&G.prog.zero);
6980 bc_num_free(&G.prog.one); 6985 IF_BC(bc_num_free(&G.prog.one);)
6981 bc_vec_free(&G.input_buffer); 6986 bc_vec_free(&G.input_buffer);
6982} 6987}
6983 6988
@@ -7001,14 +7006,14 @@ static void bc_program_init(void)
7001 G.prog.ib_t = 10; 7006 G.prog.ib_t = 10;
7002 G.prog.ob_t = 10; 7007 G.prog.ob_t = 10;
7003 7008
7004 bc_num_init_DEF_SIZE(&G.prog.last); 7009 IF_BC(bc_num_init_DEF_SIZE(&G.prog.last);)
7005 //bc_num_zero(&G.prog.last); - already is 7010 //IF_BC(bc_num_zero(&G.prog.last);) - already is
7006 7011
7007 bc_num_init_DEF_SIZE(&G.prog.zero); 7012 bc_num_init_DEF_SIZE(&G.prog.zero);
7008 //bc_num_zero(&G.prog.zero); - already is 7013 //bc_num_zero(&G.prog.zero); - already is
7009 7014
7010 bc_num_init_DEF_SIZE(&G.prog.one); 7015 IF_BC(bc_num_init_DEF_SIZE(&G.prog.one);)
7011 bc_num_one(&G.prog.one); 7016 IF_BC(bc_num_one(&G.prog.one);)
7012 7017
7013 bc_vec_init(&G.prog.fns, sizeof(BcFunc), bc_func_free); 7018 bc_vec_init(&G.prog.fns, sizeof(BcFunc), bc_func_free);
7014 bc_vec_init(&G.prog.fn_map, sizeof(BcId), bc_id_free); 7019 bc_vec_init(&G.prog.fn_map, sizeof(BcId), bc_id_free);