diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-02 19:27:48 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-05 15:43:35 +0100 |
commit | df51539ed0ceaa0556a509b25dafdec11437e645 (patch) | |
tree | 32fe9c8f78c497ead38abc8a7a4043a148053bdd | |
parent | e3b4f23cf301c7fe525d58caf66ad0dd136275fe (diff) | |
download | busybox-w32-df51539ed0ceaa0556a509b25dafdec11437e645.tar.gz busybox-w32-df51539ed0ceaa0556a509b25dafdec11437e645.tar.bz2 busybox-w32-df51539ed0ceaa0556a509b25dafdec11437e645.zip |
bc: simpler calling convention for bc_read_file(), bc_program_search()
function old new delta
bc_vm_run 1854 2020 +166
bc_program_assign 482 476 -6
bc_program_pushVar 225 215 -10
bc_program_call 366 356 -10
bc_program_num 1126 1115 -11
bc_program_copyToVar 354 343 -11
bc_program_search 164 152 -12
bc_program_execStr 573 559 -14
bc_program_exec 4544 4530 -14
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/8 up/down: 166/-88) Total: 78 bytes
text data bss dec hex filename
988523 485 7296 996304 f33d0 busybox_old
988601 485 7296 996382 f341e busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | miscutils/bc.c | 49 |
1 files changed, 23 insertions, 26 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index 25b03a95d..7e72ab28f 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c | |||
@@ -1386,25 +1386,23 @@ static BcStatus bc_read_line(BcVec *vec, const char *prompt) | |||
1386 | return BC_STATUS_SUCCESS; | 1386 | return BC_STATUS_SUCCESS; |
1387 | } | 1387 | } |
1388 | 1388 | ||
1389 | static BcStatus bc_read_file(const char *path, char **buf) | 1389 | static char* bc_read_file(const char *path) |
1390 | { | 1390 | { |
1391 | BcStatus s = BC_STATUS_BIN_FILE; | 1391 | char *buf; |
1392 | size_t size = ((size_t) -1); | 1392 | size_t size = ((size_t) -1); |
1393 | size_t i; | 1393 | size_t i; |
1394 | 1394 | ||
1395 | *buf = xmalloc_open_read_close(path, &size); | 1395 | buf = xmalloc_open_read_close(path, &size); |
1396 | 1396 | ||
1397 | for (i = 0; i < size; ++i) { | 1397 | for (i = 0; i < size; ++i) { |
1398 | if (BC_READ_BIN_CHAR((*buf)[i])) | 1398 | if (BC_READ_BIN_CHAR(buf[i])) { |
1399 | goto read_err; | 1399 | free(buf); |
1400 | buf = NULL; | ||
1401 | break; | ||
1402 | } | ||
1400 | } | 1403 | } |
1401 | 1404 | ||
1402 | return BC_STATUS_SUCCESS; | 1405 | return buf; |
1403 | |||
1404 | read_err: | ||
1405 | free(*buf); | ||
1406 | return s; | ||
1407 | ///convert to better return convention | ||
1408 | } | 1406 | } |
1409 | 1407 | ||
1410 | static void bc_args(int argc, char **argv) | 1408 | static void bc_args(int argc, char **argv) |
@@ -5275,7 +5273,7 @@ static BcStatus common_parse_expr(BcParse *p, uint8_t flags) | |||
5275 | } | 5273 | } |
5276 | } | 5274 | } |
5277 | 5275 | ||
5278 | static void bc_program_search(char *id, BcVec **ret, bool var) | 5276 | static BcVec* bc_program_search(char *id, bool var) |
5279 | { | 5277 | { |
5280 | BcStatus s; | 5278 | BcStatus s; |
5281 | BcId e, *ptr; | 5279 | BcId e, *ptr; |
@@ -5299,8 +5297,7 @@ static void bc_program_search(char *id, BcVec **ret, bool var) | |||
5299 | 5297 | ||
5300 | ptr = bc_vec_item(map, i); | 5298 | ptr = bc_vec_item(map, i); |
5301 | if (new) ptr->name = xstrdup(e.name); | 5299 | if (new) ptr->name = xstrdup(e.name); |
5302 | *ret = bc_vec_item(v, ptr->idx); | 5300 | return bc_vec_item(v, ptr->idx); |
5303 | /// convert to better return convention | ||
5304 | } | 5301 | } |
5305 | 5302 | ||
5306 | static BcStatus bc_program_num(BcResult *r, BcNum **num, bool hex) | 5303 | static BcStatus bc_program_num(BcResult *r, BcNum **num, bool hex) |
@@ -5349,7 +5346,7 @@ static BcStatus bc_program_num(BcResult *r, BcNum **num, bool hex) | |||
5349 | { | 5346 | { |
5350 | BcVec *v; | 5347 | BcVec *v; |
5351 | 5348 | ||
5352 | bc_program_search(r->d.id.name, &v, r->t == BC_RESULT_VAR); | 5349 | v = bc_program_search(r->d.id.name, r->t == BC_RESULT_VAR); |
5353 | 5350 | ||
5354 | if (r->t == BC_RESULT_ARRAY_ELEM) { | 5351 | if (r->t == BC_RESULT_ARRAY_ELEM) { |
5355 | v = bc_vec_top(v); | 5352 | v = bc_vec_top(v); |
@@ -5792,7 +5789,7 @@ static BcStatus bc_program_copyToVar(char *name, bool var) | |||
5792 | 5789 | ||
5793 | ptr = bc_vec_top(&G.prog.results); | 5790 | ptr = bc_vec_top(&G.prog.results); |
5794 | if ((ptr->t == BC_RESULT_ARRAY) != !var) return BC_STATUS_EXEC_BAD_TYPE; | 5791 | if ((ptr->t == BC_RESULT_ARRAY) != !var) return BC_STATUS_EXEC_BAD_TYPE; |
5795 | bc_program_search(name, &v, var); | 5792 | v = bc_program_search(name, var); |
5796 | 5793 | ||
5797 | #if ENABLE_DC | 5794 | #if ENABLE_DC |
5798 | if (ptr->t == BC_RESULT_STR && !var) return BC_STATUS_EXEC_BAD_TYPE; | 5795 | if (ptr->t == BC_RESULT_STR && !var) return BC_STATUS_EXEC_BAD_TYPE; |
@@ -5803,7 +5800,7 @@ static BcStatus bc_program_copyToVar(char *name, bool var) | |||
5803 | if (s) return s; | 5800 | if (s) return s; |
5804 | 5801 | ||
5805 | // Do this once more to make sure that pointers were not invalidated. | 5802 | // Do this once more to make sure that pointers were not invalidated. |
5806 | bc_program_search(name, &v, var); | 5803 | v = bc_program_search(name, var); |
5807 | 5804 | ||
5808 | if (var) { | 5805 | if (var) { |
5809 | bc_num_init(&r.d.n, BC_NUM_DEF_SIZE); | 5806 | bc_num_init(&r.d.n, BC_NUM_DEF_SIZE); |
@@ -5841,7 +5838,7 @@ static BcStatus bc_program_assign(char inst) | |||
5841 | BcVec *v; | 5838 | BcVec *v; |
5842 | 5839 | ||
5843 | if (left->t != BC_RESULT_VAR) return BC_STATUS_EXEC_BAD_TYPE; | 5840 | if (left->t != BC_RESULT_VAR) return BC_STATUS_EXEC_BAD_TYPE; |
5844 | bc_program_search(left->d.id.name, &v, true); | 5841 | v = bc_program_search(left->d.id.name, true); |
5845 | 5842 | ||
5846 | return bc_program_assignStr(right, v, false); | 5843 | return bc_program_assignStr(right, v, false); |
5847 | } | 5844 | } |
@@ -5913,7 +5910,7 @@ static BcStatus bc_program_pushVar(char *code, size_t *bgn, | |||
5913 | r.d.id.name = name; | 5910 | r.d.id.name = name; |
5914 | 5911 | ||
5915 | #if ENABLE_DC | 5912 | #if ENABLE_DC |
5916 | bc_program_search(name, &v, true); | 5913 | v = bc_program_search(name, true); |
5917 | num = bc_vec_top(v); | 5914 | num = bc_vec_top(v); |
5918 | 5915 | ||
5919 | if (pop || copy) { | 5916 | if (pop || copy) { |
@@ -6023,7 +6020,6 @@ static BcStatus bc_program_call(char *code, size_t *idx) | |||
6023 | BcInstPtr ip; | 6020 | BcInstPtr ip; |
6024 | size_t i, nparams = bc_program_index(code, idx); | 6021 | size_t i, nparams = bc_program_index(code, idx); |
6025 | BcFunc *func; | 6022 | BcFunc *func; |
6026 | BcVec *v; | ||
6027 | BcId *a; | 6023 | BcId *a; |
6028 | BcResultData param; | 6024 | BcResultData param; |
6029 | BcResult *arg; | 6025 | BcResult *arg; |
@@ -6049,9 +6045,10 @@ static BcStatus bc_program_call(char *code, size_t *idx) | |||
6049 | } | 6045 | } |
6050 | 6046 | ||
6051 | for (; i < func->autos.len; ++i) { | 6047 | for (; i < func->autos.len; ++i) { |
6048 | BcVec *v; | ||
6052 | 6049 | ||
6053 | a = bc_vec_item(&func->autos, i); | 6050 | a = bc_vec_item(&func->autos, i); |
6054 | bc_program_search(a->name, &v, a->idx); | 6051 | v = bc_program_search(a->name, a->idx); |
6055 | 6052 | ||
6056 | if (a->idx) { | 6053 | if (a->idx) { |
6057 | bc_num_init(¶m.n, BC_NUM_DEF_SIZE); | 6054 | bc_num_init(¶m.n, BC_NUM_DEF_SIZE); |
@@ -6103,7 +6100,7 @@ static BcStatus bc_program_return(char inst) | |||
6103 | BcVec *v; | 6100 | BcVec *v; |
6104 | BcId *a = bc_vec_item(&f->autos, i); | 6101 | BcId *a = bc_vec_item(&f->autos, i); |
6105 | 6102 | ||
6106 | bc_program_search(a->name, &v, a->idx); | 6103 | v = bc_program_search(a->name, a->idx); |
6107 | bc_vec_pop(v); | 6104 | bc_vec_pop(v); |
6108 | } | 6105 | } |
6109 | 6106 | ||
@@ -6397,7 +6394,6 @@ static BcStatus bc_program_execStr(char *code, size_t *bgn, | |||
6397 | 6394 | ||
6398 | if (cond) { | 6395 | if (cond) { |
6399 | 6396 | ||
6400 | BcVec *v; | ||
6401 | char *name, *then_name = bc_program_name(code, bgn), *else_name = NULL; | 6397 | char *name, *then_name = bc_program_name(code, bgn), *else_name = NULL; |
6402 | 6398 | ||
6403 | if (code[*bgn] == BC_PARSE_STREND) | 6399 | if (code[*bgn] == BC_PARSE_STREND) |
@@ -6415,7 +6411,8 @@ static BcStatus bc_program_execStr(char *code, size_t *bgn, | |||
6415 | } | 6411 | } |
6416 | 6412 | ||
6417 | if (exec) { | 6413 | if (exec) { |
6418 | bc_program_search(name, &v, true); | 6414 | BcVec *v; |
6415 | v = bc_program_search(name, true); | ||
6419 | n = bc_vec_top(v); | 6416 | n = bc_vec_top(v); |
6420 | } | 6417 | } |
6421 | 6418 | ||
@@ -7017,8 +7014,8 @@ static BcStatus bc_vm_file(const char *file) | |||
7017 | BcInstPtr *ip; | 7014 | BcInstPtr *ip; |
7018 | 7015 | ||
7019 | G.prog.file = file; | 7016 | G.prog.file = file; |
7020 | s = bc_read_file(file, &data); | 7017 | data = bc_read_file(file); |
7021 | if (s) return bc_vm_error(s, file, 0); | 7018 | if (!data) return bc_vm_error(BC_STATUS_BIN_FILE, file, 0); |
7022 | 7019 | ||
7023 | bc_lex_file(&G.prs.l, file); | 7020 | bc_lex_file(&G.prs.l, file); |
7024 | s = bc_vm_process(data); | 7021 | s = bc_vm_process(data); |