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 | |
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>
-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 | ||