aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-12-02 17:18:52 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-12-05 15:43:35 +0100
commit785e4b30570ddd772c38f3f8693b686430fc35a3 (patch)
tree59c0b72a64baf4355e754118c146923217ccf541
parentab3c568fd869e84a7862f3450a4690d3d7b60704 (diff)
downloadbusybox-w32-785e4b30570ddd772c38f3f8693b686430fc35a3.tar.gz
busybox-w32-785e4b30570ddd772c38f3f8693b686430fc35a3.tar.bz2
busybox-w32-785e4b30570ddd772c38f3f8693b686430fc35a3.zip
bc: propagate fixed arguments into callees
Looks like there is only one "BcProgram" object, &G.prog. function old new delta bc_program_exec 4401 4523 +122 bc_program_execStr 579 606 +27 bc_program_read 323 342 +19 bc_args 83 97 +14 bc_vm_process 327 323 -4 bc_num_ulong 95 85 -10 dc_main 62 48 -14 bc_main 62 48 -14 bc_vm_run 2317 1923 -394 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 4/5 up/down: 182/-436) Total: -254 bytes text data bss dec hex filename 989028 485 7296 996809 f35c9 busybox_old 988774 485 7296 996555 f34cb busybox_unstripped Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--miscutils/bc.c236
1 files changed, 125 insertions, 111 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c
index 72afb6808..117318bfa 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -790,7 +790,6 @@ typedef unsigned long (*BcProgramBuiltIn)(BcNum *);
790 790
791static void bc_program_addFunc(BcProgram *p, char *name, size_t *idx); 791static void bc_program_addFunc(BcProgram *p, char *name, size_t *idx);
792static BcStatus bc_program_reset(BcProgram *p, BcStatus s); 792static BcStatus bc_program_reset(BcProgram *p, BcStatus s);
793static BcStatus bc_program_exec(BcProgram *p);
794 793
795#define BC_FLAG_X (1 << 0) 794#define BC_FLAG_X (1 << 0)
796#define BC_FLAG_W (1 << 1) 795#define BC_FLAG_W (1 << 1)
@@ -813,8 +812,6 @@ static BcStatus bc_program_exec(BcProgram *p);
813#define BC_MAX_VARS ((unsigned long) SIZE_MAX - 1) 812#define BC_MAX_VARS ((unsigned long) SIZE_MAX - 1)
814 813
815struct globals { 814struct globals {
816 BcParseInit init;
817 BcParseExpr exp;
818 char sbgn; 815 char sbgn;
819 char send; 816 char send;
820 817
@@ -1416,14 +1413,13 @@ read_err:
1416 return s; 1413 return s;
1417} 1414}
1418 1415
1419static void bc_args(int argc, char *argv[], uint32_t *flags, BcVec *files) 1416static void bc_args(int argc, char **argv)
1420{ 1417{
1421 int i; 1418 int i;
1422 bool do_exit = false;
1423 1419
1424 GETOPT_RESET(); 1420 GETOPT_RESET();
1425#if ENABLE_FEATURE_BC_LONG_OPTIONS 1421#if ENABLE_FEATURE_BC_LONG_OPTIONS
1426 *flags = getopt32long(argv, "xwvsqli", 1422 G.flags = getopt32long(argv, "xwvsqli",
1427 "extended-register\0" No_argument "x" 1423 "extended-register\0" No_argument "x"
1428 "warn\0" No_argument "w" 1424 "warn\0" No_argument "w"
1429 "version\0" No_argument "v" 1425 "version\0" No_argument "v"
@@ -1433,15 +1429,14 @@ static void bc_args(int argc, char *argv[], uint32_t *flags, BcVec *files)
1433 "interactive\0" No_argument "i" 1429 "interactive\0" No_argument "i"
1434 ); 1430 );
1435#else 1431#else
1436 *flags = getopt32(argv, "xwvsqli"); 1432 G.flags = getopt32(argv, "xwvsqli");
1437#endif 1433#endif
1438 1434
1439 if ((*flags) & BC_FLAG_V) bc_vm_info(); 1435 if (G.flags & BC_FLAG_V) bc_vm_info();
1440 if (do_exit) exit(0);
1441 // should not be necessary, getopt32() handles this?? 1436 // should not be necessary, getopt32() handles this??
1442 //if (argv[optind] && !strcmp(argv[optind], "--")) ++optind; 1437 //if (argv[optind] && !strcmp(argv[optind], "--")) ++optind;
1443 1438
1444 for (i = optind; i < argc; ++i) bc_vec_push(files, argv + i); 1439 for (i = optind; i < argc; ++i) bc_vec_push(&G.files, argv + i);
1445} 1440}
1446 1441
1447static void bc_num_setToZero(BcNum *n, size_t scale) 1442static void bc_num_setToZero(BcNum *n, size_t scale)
@@ -5452,8 +5447,10 @@ err:
5452 return s; 5447 return s;
5453} 5448}
5454 5449
5455static BcStatus bc_program_read(BcProgram *p) 5450static BcStatus bc_program_read(void)
5456{ 5451{
5452 BcProgram *p = &G.prog;
5453
5457 BcStatus s; 5454 BcStatus s;
5458 BcParse parse; 5455 BcParse parse;
5459 BcVec buf; 5456 BcVec buf;
@@ -5477,6 +5474,7 @@ static BcStatus bc_program_read(BcProgram *p)
5477 5474
5478 s = bc_parse_text(&parse, buf.v); 5475 s = bc_parse_text(&parse, buf.v);
5479 if (s) goto exec_err; 5476 if (s) goto exec_err;
5477/// replace by IS_BC selection
5480 s = p->parse_expr(&parse, BC_PARSE_NOREAD); 5478 s = p->parse_expr(&parse, BC_PARSE_NOREAD);
5481 if (s) goto exec_err; 5479 if (s) goto exec_err;
5482 5480
@@ -6356,8 +6354,10 @@ static BcStatus bc_program_printStream(BcProgram *p)
6356 return s; 6354 return s;
6357} 6355}
6358 6356
6359static BcStatus bc_program_nquit(BcProgram *p) 6357static BcStatus bc_program_nquit(void)
6360{ 6358{
6359 BcProgram *p = &G.prog;
6360
6361 BcStatus s; 6361 BcStatus s;
6362 BcResult *opnd; 6362 BcResult *opnd;
6363 BcNum *num = NULL; 6363 BcNum *num = NULL;
@@ -6380,9 +6380,11 @@ static BcStatus bc_program_nquit(BcProgram *p)
6380 return s; 6380 return s;
6381} 6381}
6382 6382
6383static BcStatus bc_program_execStr(BcProgram *p, char *code, size_t *bgn, 6383static BcStatus bc_program_execStr(char *code, size_t *bgn,
6384 bool cond) 6384 bool cond)
6385{ 6385{
6386 BcProgram *p = &G.prog;
6387
6386 BcStatus s = BC_STATUS_SUCCESS; 6388 BcStatus s = BC_STATUS_SUCCESS;
6387 BcResult *r; 6389 BcResult *r;
6388 char **str; 6390 char **str;
@@ -6451,10 +6453,11 @@ static BcStatus bc_program_execStr(BcProgram *p, char *code, size_t *bgn,
6451 f = bc_vec_item(&p->fns, fidx); 6453 f = bc_vec_item(&p->fns, fidx);
6452 6454
6453 if (f->code.len == 0) { 6455 if (f->code.len == 0) {
6454 6456/// replace by IS_BC selection
6455 p->parse_init(&prs, p, fidx); 6457 p->parse_init(&prs, p, fidx);
6456 s = bc_parse_text(&prs, *str); 6458 s = bc_parse_text(&prs, *str);
6457 if (s) goto err; 6459 if (s) goto err;
6460/// replace by IS_BC selection
6458 s = p->parse_expr(&prs, BC_PARSE_NOCALL); 6461 s = p->parse_expr(&prs, BC_PARSE_NOCALL);
6459 if (s) goto err; 6462 if (s) goto err;
6460 6463
@@ -6511,88 +6514,6 @@ err:
6511 return s; 6514 return s;
6512} 6515}
6513 6516
6514static void bc_program_free(BcProgram *p)
6515{
6516 bc_num_free(&p->ib);
6517 bc_num_free(&p->ob);
6518 bc_num_free(&p->hexb);
6519#if ENABLE_DC
6520 bc_num_free(&p->strmb);
6521#endif
6522 bc_vec_free(&p->fns);
6523 bc_vec_free(&p->fn_map);
6524 bc_vec_free(&p->vars);
6525 bc_vec_free(&p->var_map);
6526 bc_vec_free(&p->arrs);
6527 bc_vec_free(&p->arr_map);
6528 bc_vec_free(&p->strs);
6529 bc_vec_free(&p->consts);
6530 bc_vec_free(&p->results);
6531 bc_vec_free(&p->stack);
6532 bc_num_free(&p->last);
6533 bc_num_free(&p->zero);
6534 bc_num_free(&p->one);
6535}
6536
6537static void bc_program_init(BcProgram *p, size_t line_len, BcParseInit init,
6538 BcParseExpr expr)
6539{
6540 size_t idx;
6541 BcInstPtr ip;
6542
6543 memset(p, 0, sizeof(BcProgram));
6544 memset(&ip, 0, sizeof(BcInstPtr));
6545
6546 p->nchars = p->scale = 0;
6547 p->len = line_len;
6548 p->parse_init = init;
6549 p->parse_expr = expr;
6550
6551 bc_num_init(&p->ib, BC_NUM_DEF_SIZE);
6552 bc_num_ten(&p->ib);
6553 p->ib_t = 10;
6554
6555 bc_num_init(&p->ob, BC_NUM_DEF_SIZE);
6556 bc_num_ten(&p->ob);
6557 p->ob_t = 10;
6558
6559 bc_num_init(&p->hexb, BC_NUM_DEF_SIZE);
6560 bc_num_ten(&p->hexb);
6561 p->hexb.num[0] = 6;
6562
6563#if ENABLE_DC
6564 bc_num_init(&p->strmb, BC_NUM_DEF_SIZE);
6565 bc_num_ulong2num(&p->strmb, UCHAR_MAX + 1);
6566#endif
6567
6568 bc_num_init(&p->last, BC_NUM_DEF_SIZE);
6569 bc_num_zero(&p->last);
6570
6571 bc_num_init(&p->zero, BC_NUM_DEF_SIZE);
6572 bc_num_zero(&p->zero);
6573
6574 bc_num_init(&p->one, BC_NUM_DEF_SIZE);
6575 bc_num_one(&p->one);
6576
6577 bc_vec_init(&p->fns, sizeof(BcFunc), bc_func_free);
6578 bc_map_init(&p->fn_map);
6579
6580 bc_program_addFunc(p, xstrdup(bc_func_main), &idx);
6581 bc_program_addFunc(p, xstrdup(bc_func_read), &idx);
6582
6583 bc_vec_init(&p->vars, sizeof(BcVec), bc_vec_free);
6584 bc_map_init(&p->var_map);
6585
6586 bc_vec_init(&p->arrs, sizeof(BcVec), bc_vec_free);
6587 bc_map_init(&p->arr_map);
6588
6589 bc_vec_init(&p->strs, sizeof(char *), bc_string_free);
6590 bc_vec_init(&p->consts, sizeof(char *), bc_string_free);
6591 bc_vec_init(&p->results, sizeof(BcResult), bc_result_free);
6592 bc_vec_init(&p->stack, sizeof(BcInstPtr), NULL);
6593 bc_vec_push(&p->stack, &ip);
6594}
6595
6596static void bc_program_addFunc(BcProgram *p, char *name, size_t *idx) 6517static void bc_program_addFunc(BcProgram *p, char *name, size_t *idx)
6597{ 6518{
6598 BcStatus s; 6519 BcStatus s;
@@ -6652,8 +6573,10 @@ static BcStatus bc_program_reset(BcProgram *p, BcStatus s)
6652 return s; 6573 return s;
6653} 6574}
6654 6575
6655static BcStatus bc_program_exec(BcProgram *p) 6576static BcStatus bc_program_exec(void)
6656{ 6577{
6578 BcProgram *p = &G.prog;
6579
6657 BcStatus s = BC_STATUS_SUCCESS; 6580 BcStatus s = BC_STATUS_SUCCESS;
6658 size_t idx; 6581 size_t idx;
6659 BcResult r, *ptr; 6582 BcResult r, *ptr;
@@ -6731,7 +6654,7 @@ static BcStatus bc_program_exec(BcProgram *p)
6731 6654
6732 case BC_INST_READ: 6655 case BC_INST_READ:
6733 { 6656 {
6734 s = bc_program_read(p); 6657 s = bc_program_read();
6735 break; 6658 break;
6736 } 6659 }
6737 6660
@@ -6869,7 +6792,7 @@ static BcStatus bc_program_exec(BcProgram *p)
6869 case BC_INST_EXEC_COND: 6792 case BC_INST_EXEC_COND:
6870 { 6793 {
6871 cond = inst == BC_INST_EXEC_COND; 6794 cond = inst == BC_INST_EXEC_COND;
6872 s = bc_program_execStr(p, code, &ip->idx, cond); 6795 s = bc_program_execStr(code, &ip->idx, cond);
6873 break; 6796 break;
6874 } 6797 }
6875 6798
@@ -6955,7 +6878,7 @@ static BcStatus bc_program_exec(BcProgram *p)
6955 6878
6956 case BC_INST_NQUIT: 6879 case BC_INST_NQUIT:
6957 { 6880 {
6958 s = bc_program_nquit(p); 6881 s = bc_program_nquit();
6959 break; 6882 break;
6960 } 6883 }
6961#endif // ENABLE_DC 6884#endif // ENABLE_DC
@@ -7032,7 +6955,7 @@ static void bc_vm_envArgs(void)
7032 ++buf; 6955 ++buf;
7033 } 6956 }
7034 6957
7035 bc_args((int) v.len, (char **) v.v, &G.flags, &G.files); 6958 bc_args((int) v.len, (char **) v.v);
7036 6959
7037 bc_vec_free(&v); 6960 bc_vec_free(&v);
7038} 6961}
@@ -7093,7 +7016,7 @@ static BcStatus bc_vm_process(const char *text)
7093 } 7016 }
7094 7017
7095 if (BC_PARSE_CAN_EXEC(&G.prs)) { 7018 if (BC_PARSE_CAN_EXEC(&G.prs)) {
7096 s = bc_program_exec(&G.prog); 7019 s = bc_program_exec();
7097 if (!s && G.tty) fflush(stdout); 7020 if (!s && G.tty) fflush(stdout);
7098 if (s && s != BC_STATUS_QUIT) 7021 if (s && s != BC_STATUS_QUIT)
7099 s = bc_vm_error(bc_program_reset(&G.prog, s), G.prs.l.f, 0); 7022 s = bc_vm_error(bc_program_reset(&G.prog, s), G.prs.l.f, 0);
@@ -7229,7 +7152,7 @@ static BcStatus bc_vm_exec(void)
7229 while (!s && G.prs.l.t.t != BC_LEX_EOF) s = G.prs.parse(&G.prs); 7152 while (!s && G.prs.l.t.t != BC_LEX_EOF) s = G.prs.parse(&G.prs);
7230 7153
7231 if (s) return s; 7154 if (s) return s;
7232 s = bc_program_exec(&G.prog); 7155 s = bc_program_exec();
7233 if (s) return s; 7156 if (s) return s;
7234 } 7157 }
7235#endif 7158#endif
@@ -7246,6 +7169,30 @@ static BcStatus bc_vm_exec(void)
7246 return s; 7169 return s;
7247} 7170}
7248 7171
7172#if ENABLE_FEATURE_CLEAN_UP
7173static void bc_program_free(BcProgram *p)
7174{
7175 bc_num_free(&p->ib);
7176 bc_num_free(&p->ob);
7177 bc_num_free(&p->hexb);
7178# if ENABLE_DC
7179 bc_num_free(&p->strmb);
7180# endif
7181 bc_vec_free(&p->fns);
7182 bc_vec_free(&p->fn_map);
7183 bc_vec_free(&p->vars);
7184 bc_vec_free(&p->var_map);
7185 bc_vec_free(&p->arrs);
7186 bc_vec_free(&p->arr_map);
7187 bc_vec_free(&p->strs);
7188 bc_vec_free(&p->consts);
7189 bc_vec_free(&p->results);
7190 bc_vec_free(&p->stack);
7191 bc_num_free(&p->last);
7192 bc_num_free(&p->zero);
7193 bc_num_free(&p->one);
7194}
7195
7249static void bc_vm_free(void) 7196static void bc_vm_free(void)
7250{ 7197{
7251 bc_vec_free(&G.files); 7198 bc_vec_free(&G.files);
@@ -7253,9 +7200,74 @@ static void bc_vm_free(void)
7253 bc_parse_free(&G.prs); 7200 bc_parse_free(&G.prs);
7254 free(G.env_args); 7201 free(G.env_args);
7255} 7202}
7203#endif
7204
7205static void bc_program_init(size_t line_len)
7206{
7207 size_t idx;
7208 BcInstPtr ip;
7209
7210 /* memset(&G.prog, 0, sizeof(G.prog)); - already is */
7211 memset(&ip, 0, sizeof(BcInstPtr));
7212
7213 /* G.prog.nchars = G.prog.scale = 0; - already is */
7214 G.prog.len = line_len;
7215 if (IS_BC) {
7216 G.prog.parse_init = bc_parse_init;
7217 G.prog.parse_expr = bc_parse_expression;
7218 } else {
7219 G.prog.parse_init = dc_parse_init;
7220 G.prog.parse_expr = dc_parse_expr;
7221 }
7222
7223 bc_num_init(&G.prog.ib, BC_NUM_DEF_SIZE);
7224 bc_num_ten(&G.prog.ib);
7225 G.prog.ib_t = 10;
7226
7227 bc_num_init(&G.prog.ob, BC_NUM_DEF_SIZE);
7228 bc_num_ten(&G.prog.ob);
7229 G.prog.ob_t = 10;
7230
7231 bc_num_init(&G.prog.hexb, BC_NUM_DEF_SIZE);
7232 bc_num_ten(&G.prog.hexb);
7233 G.prog.hexb.num[0] = 6;
7234
7235#if ENABLE_DC
7236 bc_num_init(&G.prog.strmb, BC_NUM_DEF_SIZE);
7237 bc_num_ulong2num(&G.prog.strmb, UCHAR_MAX + 1);
7238#endif
7239
7240 bc_num_init(&G.prog.last, BC_NUM_DEF_SIZE);
7241 bc_num_zero(&G.prog.last);
7242
7243 bc_num_init(&G.prog.zero, BC_NUM_DEF_SIZE);
7244 bc_num_zero(&G.prog.zero);
7245
7246 bc_num_init(&G.prog.one, BC_NUM_DEF_SIZE);
7247 bc_num_one(&G.prog.one);
7248
7249 bc_vec_init(&G.prog.fns, sizeof(BcFunc), bc_func_free);
7250 bc_map_init(&G.prog.fn_map);
7251
7252 bc_program_addFunc(&G.prog, xstrdup(bc_func_main), &idx);
7253 bc_program_addFunc(&G.prog, xstrdup(bc_func_read), &idx);
7254
7255 bc_vec_init(&G.prog.vars, sizeof(BcVec), bc_vec_free);
7256 bc_map_init(&G.prog.var_map);
7257
7258 bc_vec_init(&G.prog.arrs, sizeof(BcVec), bc_vec_free);
7259 bc_map_init(&G.prog.arr_map);
7260
7261 bc_vec_init(&G.prog.strs, sizeof(char *), bc_string_free);
7262 bc_vec_init(&G.prog.consts, sizeof(char *), bc_string_free);
7263 bc_vec_init(&G.prog.results, sizeof(BcResult), bc_result_free);
7264 bc_vec_init(&G.prog.stack, sizeof(BcInstPtr), NULL);
7265 bc_vec_push(&G.prog.stack, &ip);
7266}
7256 7267
7257static void bc_vm_init(const char *env_len) 7268static void bc_vm_init(const char *env_len)
7258{ 7269{
7270 BcParseInit init;
7259 size_t len = bc_vm_envLen(env_len); 7271 size_t len = bc_vm_envLen(env_len);
7260 7272
7261#if ENABLE_FEATURE_BC_SIGNALS 7273#if ENABLE_FEATURE_BC_SIGNALS
@@ -7265,12 +7277,16 @@ static void bc_vm_init(const char *env_len)
7265 bc_vec_init(&G.files, sizeof(char *), NULL); 7277 bc_vec_init(&G.files, sizeof(char *), NULL);
7266 7278
7267 if (IS_BC) { 7279 if (IS_BC) {
7268 G.flags |= BC_FLAG_S * (getenv("POSIXLY_CORRECT") != NULL); 7280 if (getenv("POSIXLY_CORRECT"))
7281 G.flags |= BC_FLAG_S;
7269 bc_vm_envArgs(); 7282 bc_vm_envArgs();
7283 init = bc_parse_init;
7284 } else {
7285 init = dc_parse_init;
7270 } 7286 }
7271 7287
7272 bc_program_init(&G.prog, len, G.init, G.exp); 7288 bc_program_init(len);
7273 G.init(&G.prs, &G.prog, BC_PROG_MAIN); 7289 init(&G.prs, &G.prog, BC_PROG_MAIN);
7274} 7290}
7275 7291
7276static BcStatus bc_vm_run(int argc, char *argv[], 7292static BcStatus bc_vm_run(int argc, char *argv[],
@@ -7279,7 +7295,7 @@ static BcStatus bc_vm_run(int argc, char *argv[],
7279 BcStatus st; 7295 BcStatus st;
7280 7296
7281 bc_vm_init(env_len); 7297 bc_vm_init(env_len);
7282 bc_args(argc, argv, &G.flags, &G.files); 7298 bc_args(argc, argv);
7283 7299
7284 G.ttyin = isatty(0); 7300 G.ttyin = isatty(0);
7285 G.tty = G.ttyin || (G.flags & BC_FLAG_I) || isatty(1); 7301 G.tty = G.ttyin || (G.flags & BC_FLAG_I) || isatty(1);
@@ -7287,7 +7303,9 @@ static BcStatus bc_vm_run(int argc, char *argv[],
7287 if (G.ttyin && !(G.flags & BC_FLAG_Q)) bc_vm_info(); 7303 if (G.ttyin && !(G.flags & BC_FLAG_Q)) bc_vm_info();
7288 st = bc_vm_exec(); 7304 st = bc_vm_exec();
7289 7305
7306#if ENABLE_FEATURE_CLEAN_UP
7290 bc_vm_free(); 7307 bc_vm_free();
7308#endif
7291 return st; 7309 return st;
7292} 7310}
7293 7311
@@ -7296,8 +7314,6 @@ int bc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
7296int bc_main(int argc, char **argv) 7314int bc_main(int argc, char **argv)
7297{ 7315{
7298 INIT_G(); 7316 INIT_G();
7299 G.init = bc_parse_init;
7300 G.exp = bc_parse_expression;
7301 G.sbgn = G.send = '"'; 7317 G.sbgn = G.send = '"';
7302 7318
7303 return bc_vm_run(argc, argv, "BC_LINE_LENGTH"); 7319 return bc_vm_run(argc, argv, "BC_LINE_LENGTH");
@@ -7309,8 +7325,6 @@ int dc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
7309int dc_main(int argc, char **argv) 7325int dc_main(int argc, char **argv)
7310{ 7326{
7311 INIT_G(); 7327 INIT_G();
7312 G.init = dc_parse_init;
7313 G.exp = dc_parse_expr;
7314 G.sbgn = '['; 7328 G.sbgn = '[';
7315 G.send = ']'; 7329 G.send = ']';
7316 7330