diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-02 17:18:52 +0100 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-05 15:43:35 +0100 |
| commit | 785e4b30570ddd772c38f3f8693b686430fc35a3 (patch) | |
| tree | 59c0b72a64baf4355e754118c146923217ccf541 /miscutils | |
| parent | ab3c568fd869e84a7862f3450a4690d3d7b60704 (diff) | |
| download | busybox-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>
Diffstat (limited to 'miscutils')
| -rw-r--r-- | miscutils/bc.c | 236 |
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 | ||
| 791 | static void bc_program_addFunc(BcProgram *p, char *name, size_t *idx); | 791 | static void bc_program_addFunc(BcProgram *p, char *name, size_t *idx); |
| 792 | static BcStatus bc_program_reset(BcProgram *p, BcStatus s); | 792 | static BcStatus bc_program_reset(BcProgram *p, BcStatus s); |
| 793 | static 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 | ||
| 815 | struct globals { | 814 | struct 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 | ||
| 1419 | static void bc_args(int argc, char *argv[], uint32_t *flags, BcVec *files) | 1416 | static 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 | ||
| 1447 | static void bc_num_setToZero(BcNum *n, size_t scale) | 1442 | static void bc_num_setToZero(BcNum *n, size_t scale) |
| @@ -5452,8 +5447,10 @@ err: | |||
| 5452 | return s; | 5447 | return s; |
| 5453 | } | 5448 | } |
| 5454 | 5449 | ||
| 5455 | static BcStatus bc_program_read(BcProgram *p) | 5450 | static 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 | ||
| 6359 | static BcStatus bc_program_nquit(BcProgram *p) | 6357 | static 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 | ||
| 6383 | static BcStatus bc_program_execStr(BcProgram *p, char *code, size_t *bgn, | 6383 | static 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 | ||
| 6514 | static 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 | |||
| 6537 | static 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 | |||
| 6596 | static void bc_program_addFunc(BcProgram *p, char *name, size_t *idx) | 6517 | static 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 | ||
| 6655 | static BcStatus bc_program_exec(BcProgram *p) | 6576 | static 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 | ||
| 7173 | static 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 | |||
| 7249 | static void bc_vm_free(void) | 7196 | static 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 | |||
| 7205 | static 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 | ||
| 7257 | static void bc_vm_init(const char *env_len) | 7268 | static 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 | ||
| 7276 | static BcStatus bc_vm_run(int argc, char *argv[], | 7292 | static 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; | |||
| 7296 | int bc_main(int argc, char **argv) | 7314 | int 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; | |||
| 7309 | int dc_main(int argc, char **argv) | 7325 | int 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 | ||
