aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--miscutils/bc.c38
1 files changed, 17 insertions, 21 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c
index bc5501d91..15089314f 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -730,28 +730,25 @@ static void bc_program_reset(void);
730#define BC_MAX_VARS ((unsigned long) SIZE_MAX - 1) 730#define BC_MAX_VARS ((unsigned long) SIZE_MAX - 1)
731 731
732struct globals { 732struct globals {
733 smallint ttyin;
734 smallint eof;
733 char sbgn; 735 char sbgn;
734 char send; 736 char send;
735 737
736 BcParse prs; 738 BcParse prs;
737 BcProgram prog; 739 BcProgram prog;
738 740
739 unsigned flags;
740 BcVec files; 741 BcVec files;
741 742
742 char *env_args; 743 char *env_args;
743
744 smallint tty;
745 smallint ttyin;
746 smallint eof;
747} FIX_ALIASING; 744} FIX_ALIASING;
748#define G (*ptr_to_globals) 745#define G (*ptr_to_globals)
749#define INIT_G() do { \ 746#define INIT_G() do { \
750 SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \ 747 SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
751} while (0) 748} while (0)
752#define G_posix (ENABLE_BC && (G.flags & BC_FLAG_S)) 749#define G_posix (ENABLE_BC && (option_mask32 & BC_FLAG_S))
753#define G_warn (ENABLE_BC && (G.flags & BC_FLAG_W)) 750#define G_warn (ENABLE_BC && (option_mask32 & BC_FLAG_W))
754#define G_exreg (ENABLE_DC && (G.flags & BC_FLAG_X)) 751#define G_exreg (ENABLE_DC && (option_mask32 & BC_FLAG_X))
755#define G_interrupt (ENABLE_FEATURE_BC_SIGNALS ? bb_got_signal : 0) 752#define G_interrupt (ENABLE_FEATURE_BC_SIGNALS ? bb_got_signal : 0)
756 753
757 754
@@ -1012,7 +1009,7 @@ static int bc_posix_error(const char *fmt, ...)
1012{ 1009{
1013 va_list p; 1010 va_list p;
1014 1011
1015 if (!(G.flags & (BC_FLAG_S|BC_FLAG_W))) 1012 if (!(option_mask32 & (BC_FLAG_S|BC_FLAG_W)))
1016 return BC_STATUS_SUCCESS; 1013 return BC_STATUS_SUCCESS;
1017 1014
1018 va_start(p, fmt); 1015 va_start(p, fmt);
@@ -1020,7 +1017,7 @@ static int bc_posix_error(const char *fmt, ...)
1020 va_end(p); 1017 va_end(p);
1021 1018
1022 // Do we treat non-POSIX constructs as errors? 1019 // Do we treat non-POSIX constructs as errors?
1023 if (!(G.flags & BC_FLAG_S)) 1020 if (!(option_mask32 & BC_FLAG_S))
1024 return BC_STATUS_SUCCESS; // no, it's a warning 1021 return BC_STATUS_SUCCESS; // no, it's a warning
1025 if (!G.ttyin) 1022 if (!G.ttyin)
1026 exit(1); 1023 exit(1);
@@ -1262,11 +1259,12 @@ static char* bc_read_file(const char *path)
1262 1259
1263static void bc_args(int argc, char **argv) 1260static void bc_args(int argc, char **argv)
1264{ 1261{
1262 unsigned opts;
1265 int i; 1263 int i;
1266 1264
1267 GETOPT_RESET(); 1265 GETOPT_RESET();
1268#if ENABLE_FEATURE_BC_LONG_OPTIONS 1266#if ENABLE_FEATURE_BC_LONG_OPTIONS
1269 G.flags = getopt32long(argv, "xwvsqli", 1267 opts = getopt32long(argv, "xwvsqli",
1270 "extended-register\0" No_argument "x" 1268 "extended-register\0" No_argument "x"
1271 "warn\0" No_argument "w" 1269 "warn\0" No_argument "w"
1272 "version\0" No_argument "v" 1270 "version\0" No_argument "v"
@@ -1276,14 +1274,17 @@ static void bc_args(int argc, char **argv)
1276 "interactive\0" No_argument "i" 1274 "interactive\0" No_argument "i"
1277 ); 1275 );
1278#else 1276#else
1279 G.flags = getopt32(argv, "xwvsqli"); 1277 opts = getopt32(argv, "xwvsqli");
1280#endif 1278#endif
1279 if (getenv("POSIXLY_CORRECT"))
1280 option_mask32 |= BC_FLAG_S;
1281 1281
1282 if (G.flags & BC_FLAG_V) bc_vm_info(); 1282 if (opts & BC_FLAG_V) bc_vm_info();
1283 // should not be necessary, getopt32() handles this?? 1283 // should not be necessary, getopt32() handles this??
1284 //if (argv[optind] && !strcmp(argv[optind], "--")) ++optind; 1284 //if (argv[optind] && !strcmp(argv[optind], "--")) ++optind;
1285 1285
1286 for (i = optind; i < argc; ++i) bc_vec_push(&G.files, argv + i); 1286 for (i = optind; i < argc; ++i)
1287 bc_vec_push(&G.files, argv + i);
1287} 1288}
1288 1289
1289static void bc_num_setToZero(BcNum *n, size_t scale) 1290static void bc_num_setToZero(BcNum *n, size_t scale)
@@ -6972,7 +6973,7 @@ static BcStatus bc_vm_exec(void)
6972 size_t i; 6973 size_t i;
6973 6974
6974#if ENABLE_BC 6975#if ENABLE_BC
6975 if (G.flags & BC_FLAG_L) { 6976 if (option_mask32 & BC_FLAG_L) {
6976 6977
6977 bc_lex_file(&G.prs.l, bc_lib_name); 6978 bc_lex_file(&G.prs.l, bc_lib_name);
6978 s = bc_parse_text(&G.prs, bc_lib); 6979 s = bc_parse_text(&G.prs, bc_lib);
@@ -6989,8 +6990,6 @@ static BcStatus bc_vm_exec(void)
6989 for (i = 0; !s && i < G.files.len; ++i) 6990 for (i = 0; !s && i < G.files.len; ++i)
6990 s = bc_vm_file(*((char **) bc_vec_item(&G.files, i))); 6991 s = bc_vm_file(*((char **) bc_vec_item(&G.files, i)));
6991 if (s) { 6992 if (s) {
6992 if (!G.tty)
6993 return s;
6994 fflush_and_check(); 6993 fflush_and_check();
6995 fputs("ready for more input\n", stderr); 6994 fputs("ready for more input\n", stderr);
6996 } 6995 }
@@ -7099,8 +7098,6 @@ static void bc_vm_init(const char *env_len)
7099 bc_vec_init(&G.files, sizeof(char *), NULL); 7098 bc_vec_init(&G.files, sizeof(char *), NULL);
7100 7099
7101 if (IS_BC) { 7100 if (IS_BC) {
7102 if (getenv("POSIXLY_CORRECT"))
7103 G.flags |= BC_FLAG_S;
7104 bc_vm_envArgs(); 7101 bc_vm_envArgs();
7105 } 7102 }
7106 7103
@@ -7121,13 +7118,12 @@ static BcStatus bc_vm_run(int argc, char *argv[],
7121 bc_args(argc, argv); 7118 bc_args(argc, argv);
7122 7119
7123 G.ttyin = isatty(0); 7120 G.ttyin = isatty(0);
7124 G.tty = G.ttyin || (G.flags & BC_FLAG_I) || isatty(1);
7125 7121
7126 if (G.ttyin) { 7122 if (G.ttyin) {
7127#if ENABLE_FEATURE_BC_SIGNALS 7123#if ENABLE_FEATURE_BC_SIGNALS
7128 signal_no_SA_RESTART_empty_mask(SIGINT, record_signo); 7124 signal_no_SA_RESTART_empty_mask(SIGINT, record_signo);
7129#endif 7125#endif
7130 if (!(G.flags & BC_FLAG_Q)) 7126 if (!(option_mask32 & BC_FLAG_Q))
7131 bc_vm_info(); 7127 bc_vm_info();
7132 } 7128 }
7133 st = bc_vm_exec(); 7129 st = bc_vm_exec();