aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-12-04 21:46:47 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-12-05 15:43:35 +0100
commit7d62801db938c72ee629ebe133768e41ba3e4667 (patch)
tree76c4a260fbfdf5bae08d3add503cbc55cb2a219b
parentd5f7703abb5a0868fd0e9fa3e8c0509ed99ce330 (diff)
downloadbusybox-w32-7d62801db938c72ee629ebe133768e41ba3e4667.tar.gz
busybox-w32-7d62801db938c72ee629ebe133768e41ba3e4667.tar.bz2
busybox-w32-7d62801db938c72ee629ebe133768e41ba3e4667.zip
bc: create a few common functions
function old new delta bc_char_vec_init - 12 +12 bc_vec_pop_all - 8 +8 bc_program_index 64 66 +2 bc_vec_string 64 61 -3 bc_vec_free 27 24 -3 bc_read_line 317 314 -3 bc_program_execStr 564 561 -3 bc_program_exec 4153 4150 -3 bc_program_copyToVar 340 336 -4 bc_parse_create 175 170 -5 dc_lex_token 705 699 -6 bc_program_reset 78 72 -6 bc_lex_number 305 299 -6 bc_program_read 353 343 -10 bc_program_addFunc 225 209 -16 bc_vm_run 1942 1924 -18 bc_parse_reset 181 163 -18 ------------------------------------------------------------------------------ (add/remove: 2/0 grow/shrink: 1/14 up/down: 22/-104) Total: -82 bytes text data bss dec hex filename 987600 485 7296 995381 f3035 busybox_old 987518 485 7296 995299 f2fe3 busybox_unstripped Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--miscutils/bc.c63
1 files changed, 36 insertions, 27 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c
index d208a0cc6..e05700fb6 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -1041,6 +1041,11 @@ static void bc_vec_init(BcVec *v, size_t esize, BcVecFree dtor)
1041 v->v = xmalloc(esize * BC_VEC_START_CAP); 1041 v->v = xmalloc(esize * BC_VEC_START_CAP);
1042} 1042}
1043 1043
1044static void bc_char_vec_init(BcVec *v)
1045{
1046 bc_vec_init(v, sizeof(char), NULL);
1047}
1048
1044static void bc_vec_expand(BcVec *v, size_t req) 1049static void bc_vec_expand(BcVec *v, size_t req)
1045{ 1050{
1046 if (v->cap < req) { 1051 if (v->cap < req) {
@@ -1059,6 +1064,11 @@ static void bc_vec_npop(BcVec *v, size_t n)
1059 } 1064 }
1060} 1065}
1061 1066
1067static void bc_vec_pop_all(BcVec *v)
1068{
1069 bc_vec_npop(v, v->len);
1070}
1071
1062static void bc_vec_push(BcVec *v, const void *data) 1072static void bc_vec_push(BcVec *v, const void *data)
1063{ 1073{
1064 if (v->len + 1 > v->cap) bc_vec_grow(v, 1); 1074 if (v->len + 1 > v->cap) bc_vec_grow(v, 1);
@@ -1090,7 +1100,7 @@ static void bc_vec_pushAt(BcVec *v, const void *data, size_t idx)
1090 1100
1091static void bc_vec_string(BcVec *v, size_t len, const char *str) 1101static void bc_vec_string(BcVec *v, size_t len, const char *str)
1092{ 1102{
1093 bc_vec_npop(v, v->len); 1103 bc_vec_pop_all(v);
1094 bc_vec_expand(v, len + 1); 1104 bc_vec_expand(v, len + 1);
1095 memcpy(v->v, str, len); 1105 memcpy(v->v, str, len);
1096 v->len = len; 1106 v->len = len;
@@ -1125,7 +1135,7 @@ static void *bc_vec_item_rev(const BcVec *v, size_t idx)
1125static void bc_vec_free(void *vec) 1135static void bc_vec_free(void *vec)
1126{ 1136{
1127 BcVec *v = (BcVec *) vec; 1137 BcVec *v = (BcVec *) vec;
1128 bc_vec_npop(v, v->len); 1138 bc_vec_pop_all(v);
1129 free(v->v); 1139 free(v->v);
1130} 1140}
1131 1141
@@ -1179,7 +1189,7 @@ static BcStatus bc_read_line(BcVec *vec, const char *prompt)
1179 char c; 1189 char c;
1180 1190
1181 bad_chars = 0; 1191 bad_chars = 0;
1182 bc_vec_npop(vec, vec->len); 1192 bc_vec_pop_all(vec);
1183 1193
1184 fflush_and_check(); 1194 fflush_and_check();
1185#if ENABLE_FEATURE_BC_SIGNALS 1195#if ENABLE_FEATURE_BC_SIGNALS
@@ -2635,7 +2645,7 @@ static BcStatus bc_func_insert(BcFunc *f, char *name, bool var)
2635 2645
2636static void bc_func_init(BcFunc *f) 2646static void bc_func_init(BcFunc *f)
2637{ 2647{
2638 bc_vec_init(&f->code, sizeof(char), NULL); 2648 bc_char_vec_init(&f->code);
2639 bc_vec_init(&f->autos, sizeof(BcId), bc_id_free); 2649 bc_vec_init(&f->autos, sizeof(BcId), bc_id_free);
2640 bc_vec_init(&f->labels, sizeof(size_t), NULL); 2650 bc_vec_init(&f->labels, sizeof(size_t), NULL);
2641 f->nparams = 0; 2651 f->nparams = 0;
@@ -2662,7 +2672,7 @@ static void bc_array_copy(BcVec *d, const BcVec *s)
2662{ 2672{
2663 size_t i; 2673 size_t i;
2664 2674
2665 bc_vec_npop(d, d->len); 2675 bc_vec_pop_all(d);
2666 bc_vec_expand(d, s->cap); 2676 bc_vec_expand(d, s->cap);
2667 d->len = s->len; 2677 d->len = s->len;
2668 2678
@@ -2807,7 +2817,7 @@ static BcStatus bc_lex_number(BcLex *l, char start)
2807 if (len > BC_MAX_NUM) 2817 if (len > BC_MAX_NUM)
2808 return bc_error("number too long: must be [1, BC_NUM_MAX]"); 2818 return bc_error("number too long: must be [1, BC_NUM_MAX]");
2809 2819
2810 bc_vec_npop(&l->t.v, l->t.v.len); 2820 bc_vec_pop_all(&l->t.v);
2811 bc_vec_expand(&l->t.v, len + 1); 2821 bc_vec_expand(&l->t.v, len + 1);
2812 bc_vec_push(&l->t.v, &start); 2822 bc_vec_push(&l->t.v, &start);
2813 2823
@@ -2855,7 +2865,7 @@ static BcStatus bc_lex_name(BcLex *l)
2855static void bc_lex_init(BcLex *l, BcLexNext next) 2865static void bc_lex_init(BcLex *l, BcLexNext next)
2856{ 2866{
2857 l->next = next; 2867 l->next = next;
2858 bc_vec_init(&l->t.v, sizeof(char), NULL); 2868 bc_char_vec_init(&l->t.v);
2859} 2869}
2860 2870
2861static void bc_lex_free(BcLex *l) 2871static void bc_lex_free(BcLex *l)
@@ -3296,7 +3306,7 @@ static BcStatus dc_lex_register(BcLex *l)
3296 s = bc_lex_name(l); 3306 s = bc_lex_name(l);
3297 } 3307 }
3298 else { 3308 else {
3299 bc_vec_npop(&l->t.v, l->t.v.len); 3309 bc_vec_pop_all(&l->t.v);
3300 bc_vec_pushByte(&l->t.v, l->buf[l->i - 1]); 3310 bc_vec_pushByte(&l->t.v, l->buf[l->i - 1]);
3301 bc_vec_pushByte(&l->t.v, '\0'); 3311 bc_vec_pushByte(&l->t.v, '\0');
3302 l->t.t = BC_LEX_NAME; 3312 l->t.t = BC_LEX_NAME;
@@ -3311,7 +3321,7 @@ static BcStatus dc_lex_string(BcLex *l)
3311 char c; 3321 char c;
3312 3322
3313 l->t.t = BC_LEX_STR; 3323 l->t.t = BC_LEX_STR;
3314 bc_vec_npop(&l->t.v, l->t.v.len); 3324 bc_vec_pop_all(&l->t.v);
3315 3325
3316 for (c = l->buf[i]; c != 0 && depth; c = l->buf[++i]) { 3326 for (c = l->buf[i]; c != 0 && depth; c = l->buf[++i]) {
3317 3327
@@ -3510,11 +3520,10 @@ static BcStatus bc_parse_text(BcParse *p, const char *text)
3510static void bc_parse_reset(BcParse *p) 3520static void bc_parse_reset(BcParse *p)
3511{ 3521{
3512 if (p->fidx != BC_PROG_MAIN) { 3522 if (p->fidx != BC_PROG_MAIN) {
3513
3514 p->func->nparams = 0; 3523 p->func->nparams = 0;
3515 bc_vec_npop(&p->func->code, p->func->code.len); 3524 bc_vec_pop_all(&p->func->code);
3516 bc_vec_npop(&p->func->autos, p->func->autos.len); 3525 bc_vec_pop_all(&p->func->autos);
3517 bc_vec_npop(&p->func->labels, p->func->labels.len); 3526 bc_vec_pop_all(&p->func->labels);
3518 3527
3519 bc_parse_updateFunc(p, BC_PROG_MAIN); 3528 bc_parse_updateFunc(p, BC_PROG_MAIN);
3520 } 3529 }
@@ -3524,9 +3533,9 @@ static void bc_parse_reset(BcParse *p)
3524 p->auto_part = (p->nbraces = 0); 3533 p->auto_part = (p->nbraces = 0);
3525 3534
3526 bc_vec_npop(&p->flags, p->flags.len - 1); 3535 bc_vec_npop(&p->flags, p->flags.len - 1);
3527 bc_vec_npop(&p->exits, p->exits.len); 3536 bc_vec_pop_all(&p->exits);
3528 bc_vec_npop(&p->conds, p->conds.len); 3537 bc_vec_pop_all(&p->conds);
3529 bc_vec_npop(&p->ops, p->ops.len); 3538 bc_vec_pop_all(&p->ops);
3530 3539
3531 bc_program_reset(); 3540 bc_program_reset();
3532} 3541}
@@ -5350,8 +5359,8 @@ static BcStatus bc_program_read(void)
5350 return bc_error("read() call inside of a read() call"); 5359 return bc_error("read() call inside of a read() call");
5351 } 5360 }
5352 5361
5353 bc_vec_npop(&f->code, f->code.len); 5362 bc_vec_pop_all(&f->code);
5354 bc_vec_init(&buf, sizeof(char), NULL); 5363 bc_char_vec_init(&buf);
5355 5364
5356 s = bc_read_line(&buf, "read> "); 5365 s = bc_read_line(&buf, "read> ");
5357 if (s) goto io_err; 5366 if (s) goto io_err;
@@ -6379,7 +6388,7 @@ static BcStatus bc_program_execStr(char *code, size_t *bgn,
6379err: 6388err:
6380 bc_parse_free(&prs); 6389 bc_parse_free(&prs);
6381 f = bc_vec_item(&G.prog.fns, fidx); 6390 f = bc_vec_item(&G.prog.fns, fidx);
6382 bc_vec_npop(&f->code, f->code.len); 6391 bc_vec_pop_all(&f->code);
6383exit: 6392exit:
6384 bc_vec_pop(&G.prog.results); 6393 bc_vec_pop(&G.prog.results);
6385 return s; 6394 return s;
@@ -6425,9 +6434,9 @@ static void bc_program_addFunc(char *name, size_t *idx)
6425 6434
6426 // We need to reset these, so the function can be repopulated. 6435 // We need to reset these, so the function can be repopulated.
6427 func->nparams = 0; 6436 func->nparams = 0;
6428 bc_vec_npop(&func->autos, func->autos.len); 6437 bc_vec_pop_all(&func->autos);
6429 bc_vec_npop(&func->code, func->code.len); 6438 bc_vec_pop_all(&func->code);
6430 bc_vec_npop(&func->labels, func->labels.len); 6439 bc_vec_pop_all(&func->labels);
6431 } 6440 }
6432 else { 6441 else {
6433 bc_func_init(&f); 6442 bc_func_init(&f);
@@ -6443,7 +6452,7 @@ static void bc_program_reset(void)
6443 BcInstPtr *ip; 6452 BcInstPtr *ip;
6444 6453
6445 bc_vec_npop(&G.prog.stack, G.prog.stack.len - 1); 6454 bc_vec_npop(&G.prog.stack, G.prog.stack.len - 1);
6446 bc_vec_npop(&G.prog.results, G.prog.results.len); 6455 bc_vec_pop_all(&G.prog.results);
6447 6456
6448 f = bc_vec_item(&G.prog.fns, 0); 6457 f = bc_vec_item(&G.prog.fns, 0);
6449 ip = bc_vec_top(&G.prog.stack); 6458 ip = bc_vec_top(&G.prog.stack);
@@ -6683,7 +6692,7 @@ static BcStatus bc_program_exec(void)
6683 6692
6684 case BC_INST_CLEAR_STACK: 6693 case BC_INST_CLEAR_STACK:
6685 { 6694 {
6686 bc_vec_npop(&G.prog.results, G.prog.results.len); 6695 bc_vec_pop_all(&G.prog.results);
6687 break; 6696 break;
6688 } 6697 }
6689 6698
@@ -6896,8 +6905,8 @@ static BcStatus bc_vm_stdin(void)
6896 G.prog.file = bc_program_stdin_name; 6905 G.prog.file = bc_program_stdin_name;
6897 bc_lex_file(&G.prs.l, bc_program_stdin_name); 6906 bc_lex_file(&G.prs.l, bc_program_stdin_name);
6898 6907
6899 bc_vec_init(&buffer, sizeof(char), NULL); 6908 bc_char_vec_init(&buffer);
6900 bc_vec_init(&buf, sizeof(char), NULL); 6909 bc_char_vec_init(&buf);
6901 bc_vec_pushByte(&buffer, '\0'); 6910 bc_vec_pushByte(&buffer, '\0');
6902 6911
6903 // This loop is complex because the vm tries not to send any lines that end 6912 // This loop is complex because the vm tries not to send any lines that end
@@ -6953,7 +6962,7 @@ static BcStatus bc_vm_stdin(void)
6953 fputs("ready for more input\n", stderr); 6962 fputs("ready for more input\n", stderr);
6954 } 6963 }
6955 6964
6956 bc_vec_npop(&buffer, buffer.len); 6965 bc_vec_pop_all(&buffer);
6957 } 6966 }
6958 6967
6959 if (str) { 6968 if (str) {