diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-04 21:46:47 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-05 15:43:35 +0100 |
commit | 7d62801db938c72ee629ebe133768e41ba3e4667 (patch) | |
tree | 76c4a260fbfdf5bae08d3add503cbc55cb2a219b | |
parent | d5f7703abb5a0868fd0e9fa3e8c0509ed99ce330 (diff) | |
download | busybox-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.c | 63 |
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 | ||
1044 | static void bc_char_vec_init(BcVec *v) | ||
1045 | { | ||
1046 | bc_vec_init(v, sizeof(char), NULL); | ||
1047 | } | ||
1048 | |||
1044 | static void bc_vec_expand(BcVec *v, size_t req) | 1049 | static 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 | ||
1067 | static void bc_vec_pop_all(BcVec *v) | ||
1068 | { | ||
1069 | bc_vec_npop(v, v->len); | ||
1070 | } | ||
1071 | |||
1062 | static void bc_vec_push(BcVec *v, const void *data) | 1072 | static 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 | ||
1091 | static void bc_vec_string(BcVec *v, size_t len, const char *str) | 1101 | static 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) | |||
1125 | static void bc_vec_free(void *vec) | 1135 | static 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 | ||
2636 | static void bc_func_init(BcFunc *f) | 2646 | static 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) | |||
2855 | static void bc_lex_init(BcLex *l, BcLexNext next) | 2865 | static 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 | ||
2861 | static void bc_lex_free(BcLex *l) | 2871 | static 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) | |||
3510 | static void bc_parse_reset(BcParse *p) | 3520 | static 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, | |||
6379 | err: | 6388 | err: |
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); |
6383 | exit: | 6392 | exit: |
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) { |