aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-12-02 19:27:48 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-12-05 15:43:35 +0100
commitdf51539ed0ceaa0556a509b25dafdec11437e645 (patch)
tree32fe9c8f78c497ead38abc8a7a4043a148053bdd
parente3b4f23cf301c7fe525d58caf66ad0dd136275fe (diff)
downloadbusybox-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.c49
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
1389static BcStatus bc_read_file(const char *path, char **buf) 1389static 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
1404read_err:
1405 free(*buf);
1406 return s;
1407///convert to better return convention
1408} 1406}
1409 1407
1410static void bc_args(int argc, char **argv) 1408static 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
5278static void bc_program_search(char *id, BcVec **ret, bool var) 5276static 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
5306static BcStatus bc_program_num(BcResult *r, BcNum **num, bool hex) 5303static 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(&param.n, BC_NUM_DEF_SIZE); 6054 bc_num_init(&param.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);