aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-12-02 18:49:16 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-12-05 15:42:48 +0100
commitef869ec7283180e3733948ae31d1016ad9da4c0d (patch)
treef06dcc0af9f53465e51196d3fb875fca0639ec2d
parent01055ba89a92470587d9012c7e8707d943ebd875 (diff)
downloadbusybox-w32-ef869ec7283180e3733948ae31d1016ad9da4c0d.tar.gz
busybox-w32-ef869ec7283180e3733948ae31d1016ad9da4c0d.tar.bz2
busybox-w32-ef869ec7283180e3733948ae31d1016ad9da4c0d.zip
bc: fix warnings, initial cleanups
function old new delta bc_program_exec - 4401 +4401 bc_vm_run - 2601 +2601 bc_parse_expr - 2215 +2215 bc_parse_stmt - 2197 +2197 bc_lib - 1878 +1878 bc_lex_token - 1333 +1333 bc_program_num - 1134 +1134 bc_num_k - 1010 +1010 bc_program_modexp - 793 +793 bc_program_print - 762 +762 dc_parse_expr - 723 +723 dc_lex_token - 670 +670 bc_num_d - 614 +614 bc_parse_name - 590 +590 bc_program_execStr - 579 +579 bc_num_printNum - 572 +572 bc_num_p - 518 +518 bc_num_a - 480 +480 bc_parse_parse - 471 +471 bc_program_assign - 450 +450 bc_parse_endBody - 423 +423 bc_program_call - 371 +371 dc_lex_tokens - 364 +364 bc_vm_process - 361 +361 bc_program_copyToVar - 355 +355 dc_parse_insts - 332 +332 bc_program_read - 323 +323 bc_program_binOpPrep - 301 +301 bc_lex_number - 301 +301 bc_read_line - 297 +297 bc_num_cmp - 294 +294 bc_num_m - 287 +287 bc_parse_auto - 275 +275 bc_num_s - 258 +258 bc_program_pushVar - 236 +236 bc_num_r - 231 +231 bc_program_addFunc - 220 +220 bc_lex_kws - 220 +220 bc_err_msgs - 216 +216 bc_parse_create - 198 +198 bc_vm_posixError - 194 +194 bc_parse_reset - 194 +194 bc_parse_operator - 181 +181 bc_program_reset - 178 +178 bc_program_printStream - 176 +176 bc_num_divmod - 168 +168 bc_copyright - 155 +155 bc_program_search - 154 +154 bc_num_binary - 150 +150 bc_vm_error - 148 +148 bc_program_pushArray - 143 +143 bc_parse_text - 142 +142 bc_num_printDigits - 142 +142 bc_map_insert - 142 +142 bc_parse_else - 139 +139 bc_program_assignStr - 131 +131 bc_args - 125 +125 dc_parse_mem - 116 +116 bc_parse_body - 116 +116 bc_num_split - 113 +113 bc_num_sub - 112 +112 bc_num_add - 112 +112 packed_usage 32958 33066 +108 bc_num_rem - 104 +104 bc_parse_string - 103 +103 bc_main - 97 +97 bc_num_ulong - 95 +95 bc_func_insert - 89 +89 bc_vm_sig - 88 +88 bc_program_prep - 88 +88 bc_parse_number - 88 +88 bc_array_expand - 88 +88 bc_num_subArrays - 84 +84 bc_num_compare - 84 +84 bc_lex_name - 83 +83 bc_args_lopt - 81 +81 bc_parse_pushIndex - 80 +80 bc_num_mul - 80 +80 bc_num_mod - 80 +80 bc_num_div - 80 +80 bc_vm_info - 76 +76 bc_program_name - 75 +75 bc_map_find - 71 +71 bc_lex_next - 71 +71 bc_num_printHex - 70 +70 bc_vec_concat - 68 +68 bc_num_shift - 68 +68 bc_num_extend - 68 +68 bc_program_index - 66 +66 bc_num_ulong2num - 66 +66 bc_num_retireMul - 66 +66 bc_parse_noElse - 65 +65 bc_vec_string - 64 +64 bc_parse_pushName - 63 +63 bc_parse_exprs - 60 +60 bc_err_ids - 58 +58 bc_result_free - 57 +57 bc_vec_npop - 55 +55 dc_parse_parse - 53 +53 bc_vec_push - 53 +53 bc_parse_free - 53 +53 bc_num_inv - 53 +53 dc_parse_register - 52 +52 dc_lex_regs - 52 +52 bc_lex_whitespace - 52 +52 bc_num_copy - 51 +51 bc_program_binOpRetire - 50 +50 bc_parse_ops - 50 +50 bc_map_index - 50 +50 bcg - 48 +48 bc_num_init - 48 +48 bc_parse_startBody - 47 +47 bc_num_pow - 47 +47 bc_vm_putchar - 46 +46 bc_vm_exit - 46 +46 bc_num_clean - 45 +45 bc_parse_addFunc - 44 +44 bc_vec_grow - 42 +42 bc_program_len - 42 +42 bc_num_truncate - 42 +42 bc_array_init - 42 +42 bc_parse_expression - 39 +39 bc_lex_lineComment - 39 +39 bc_num_expand - 38 +38 bc_vec_init - 37 +37 bc_vm_printf - 36 +36 bc_num_printNewline - 36 +36 bc_func_free - 35 +35 bc_sig_msg - 34 +34 bc_program_retire - 34 +34 bc_lex_assign - 34 +34 dc_parse_init - 33 +33 bc_parse_init - 33 +33 dc_sig_msg - 31 +31 bc_vec_expand - 30 +30 bc_num_ten - 30 +30 bc_num_one - 28 +28 bc_errs - 28 +28 bc_vec_free - 27 +27 bc_program_ops - 24 +24 bc_vm_puts - 23 +23 bc_num_printChar - 23 +23 bc_program_ready_msg - 22 +22 bc_vm_fflush - 21 +21 dc_main 77 97 +20 bc_parse_next_rel - 20 +20 bc_parse_next_read - 20 +20 bc_parse_next_print - 20 +20 bc_parse_next_param - 20 +20 bc_parse_next_for - 20 +20 bc_parse_next_expr - 20 +20 bc_parse_next_elem - 20 +20 bc_warn_fmt - 17 +17 bc_vec_pushByte - 15 +15 bc_string_free - 15 +15 bc_num_setToZero - 15 +15 bc_num_free - 15 +15 bc_lex_file - 15 +15 bc_id_free - 15 +15 bc_err_fmt - 15 +15 bc_vec_item_rev - 14 +14 bc_id_cmp - 12 +12 bc_num_zero - 11 +11 bc_vec_item - 9 +9 bc_program_stdin_name - 8 +8 bc_program_scale - 8 +8 bc_args_opt - 8 +8 bc_func_read - 7 +7 bc_func_main - 7 +7 bc_err_line - 7 +7 bc_lib_name - 4 +4 bc_args_env_name - 4 +4 applet_main 1604 1608 +4 dc_name - 3 +3 bc_name - 3 +3 applet_names 2781 2784 +3 static.bases 5 - -5 check_under 20 - -20 pop 24 - -24 print_no_pop 32 - -32 sub 34 - -34 divide 34 - -34 mul 37 - -37 add 37 - -37 push 38 - -38 print_stack_no_pop 40 - -40 not 72 - -72 set_output_base 95 - -95 or 103 - -103 eor 103 - -103 and 103 - -103 mod 105 - -105 stack_machine 116 - -116 operators 144 - -144 print_base 230 - -230 ------------------------------------------------------------------------------ (add/remove: 173/20 grow/shrink: 4/0 up/down: 38089/-1372) Total: 36717 bytes text data bss dec hex filename 950181 485 7296 957962 e9e0a busybox_old 989722 485 7344 997551 f38af busybox_unstripped Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--miscutils/bc.c253
1 files changed, 124 insertions, 129 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c
index bf0cbc397..4cbef4da6 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -173,9 +173,9 @@ typedef enum BcStatus {
173 BC_STATUS_LEX_NO_STRING_END, 173 BC_STATUS_LEX_NO_STRING_END,
174 BC_STATUS_LEX_NO_COMMENT_END, 174 BC_STATUS_LEX_NO_COMMENT_END,
175 BC_STATUS_LEX_EOF, 175 BC_STATUS_LEX_EOF,
176#ifdef ENABLE_DC 176#if ENABLE_DC
177 BC_STATUS_LEX_EXTENDED_REG, 177 BC_STATUS_LEX_EXTENDED_REG,
178#endif // ENABLE_DC 178#endif
179 179
180 BC_STATUS_PARSE_BAD_TOKEN, 180 BC_STATUS_PARSE_BAD_TOKEN,
181 BC_STATUS_PARSE_BAD_EXP, 181 BC_STATUS_PARSE_BAD_EXP,
@@ -213,7 +213,7 @@ typedef enum BcStatus {
213 BC_STATUS_VEC_OUT_OF_BOUNDS, 213 BC_STATUS_VEC_OUT_OF_BOUNDS,
214 BC_STATUS_VEC_ITEM_EXISTS, 214 BC_STATUS_VEC_ITEM_EXISTS,
215 215
216#ifdef ENABLE_BC 216#if ENABLE_BC
217 BC_STATUS_POSIX_NAME_LEN, 217 BC_STATUS_POSIX_NAME_LEN,
218 BC_STATUS_POSIX_COMMENT, 218 BC_STATUS_POSIX_COMMENT,
219 BC_STATUS_POSIX_BAD_KW, 219 BC_STATUS_POSIX_BAD_KW,
@@ -226,7 +226,7 @@ typedef enum BcStatus {
226 BC_STATUS_POSIX_FOR2, 226 BC_STATUS_POSIX_FOR2,
227 BC_STATUS_POSIX_FOR3, 227 BC_STATUS_POSIX_FOR3,
228 BC_STATUS_POSIX_BRACE, 228 BC_STATUS_POSIX_BRACE,
229#endif // ENABLE_BC 229#endif
230 230
231 BC_STATUS_QUIT, 231 BC_STATUS_QUIT,
232 BC_STATUS_LIMITS, 232 BC_STATUS_LIMITS,
@@ -241,9 +241,9 @@ typedef enum BcStatus {
241#define BC_ERR_IDX_MATH (3) 241#define BC_ERR_IDX_MATH (3)
242#define BC_ERR_IDX_EXEC (4) 242#define BC_ERR_IDX_EXEC (4)
243#define BC_ERR_IDX_VEC (5) 243#define BC_ERR_IDX_VEC (5)
244#ifdef ENABLE_BC 244#if ENABLE_BC
245#define BC_ERR_IDX_POSIX (6) 245#define BC_ERR_IDX_POSIX (6)
246#endif // ENABLE_BC 246#endif
247 247
248#define BC_VEC_INVALID_IDX ((size_t) -1) 248#define BC_VEC_INVALID_IDX ((size_t) -1)
249#define BC_VEC_START_CAP (1 << 5) 249#define BC_VEC_START_CAP (1 << 5)
@@ -314,12 +314,12 @@ static BcStatus bc_num_divmod(BcNum *a, BcNum *b, BcNum *c, BcNum *d,
314 314
315typedef enum BcInst { 315typedef enum BcInst {
316 316
317#ifdef ENABLE_BC 317#if ENABLE_BC
318 BC_INST_INC_PRE, 318 BC_INST_INC_PRE,
319 BC_INST_DEC_PRE, 319 BC_INST_DEC_PRE,
320 BC_INST_INC_POST, 320 BC_INST_INC_POST,
321 BC_INST_DEC_POST, 321 BC_INST_DEC_POST,
322#endif // ENABLE_BC 322#endif
323 323
324 BC_INST_NEG, 324 BC_INST_NEG,
325 325
@@ -341,14 +341,14 @@ typedef enum BcInst {
341 BC_INST_BOOL_OR, 341 BC_INST_BOOL_OR,
342 BC_INST_BOOL_AND, 342 BC_INST_BOOL_AND,
343 343
344#ifdef ENABLE_BC 344#if ENABLE_BC
345 BC_INST_ASSIGN_POWER, 345 BC_INST_ASSIGN_POWER,
346 BC_INST_ASSIGN_MULTIPLY, 346 BC_INST_ASSIGN_MULTIPLY,
347 BC_INST_ASSIGN_DIVIDE, 347 BC_INST_ASSIGN_DIVIDE,
348 BC_INST_ASSIGN_MODULUS, 348 BC_INST_ASSIGN_MODULUS,
349 BC_INST_ASSIGN_PLUS, 349 BC_INST_ASSIGN_PLUS,
350 BC_INST_ASSIGN_MINUS, 350 BC_INST_ASSIGN_MINUS,
351#endif // ENABLE_BC 351#endif
352 BC_INST_ASSIGN, 352 BC_INST_ASSIGN,
353 353
354 BC_INST_NUM, 354 BC_INST_NUM,
@@ -370,7 +370,7 @@ typedef enum BcInst {
370 BC_INST_STR, 370 BC_INST_STR,
371 BC_INST_PRINT_STR, 371 BC_INST_PRINT_STR,
372 372
373#ifdef ENABLE_BC 373#if ENABLE_BC
374 BC_INST_JUMP, 374 BC_INST_JUMP,
375 BC_INST_JUMP_ZERO, 375 BC_INST_JUMP_ZERO,
376 376
@@ -380,12 +380,12 @@ typedef enum BcInst {
380 BC_INST_RET0, 380 BC_INST_RET0,
381 381
382 BC_INST_HALT, 382 BC_INST_HALT,
383#endif // ENABLE_BC 383#endif
384 384
385 BC_INST_POP, 385 BC_INST_POP,
386 BC_INST_POP_EXEC, 386 BC_INST_POP_EXEC,
387 387
388#ifdef ENABLE_DC 388#if ENABLE_DC
389 BC_INST_MODEXP, 389 BC_INST_MODEXP,
390 BC_INST_DIVMOD, 390 BC_INST_DIVMOD,
391 391
@@ -409,7 +409,7 @@ typedef enum BcInst {
409 BC_INST_NQUIT, 409 BC_INST_NQUIT,
410 410
411 BC_INST_INVALID = -1, 411 BC_INST_INVALID = -1,
412#endif // ENABLE_DC 412#endif
413 413
414} BcInst; 414} BcInst;
415 415
@@ -543,7 +543,7 @@ typedef enum BcLexType {
543 BC_LEX_KEY_SQRT, 543 BC_LEX_KEY_SQRT,
544 BC_LEX_KEY_WHILE, 544 BC_LEX_KEY_WHILE,
545 545
546#ifdef ENABLE_DC 546#if ENABLE_DC
547 BC_LEX_EQ_NO_REG, 547 BC_LEX_EQ_NO_REG,
548 BC_LEX_OP_MODEXP, 548 BC_LEX_OP_MODEXP,
549 BC_LEX_OP_DIVMOD, 549 BC_LEX_OP_DIVMOD,
@@ -570,7 +570,7 @@ typedef enum BcLexType {
570 BC_LEX_PRINT_POP, 570 BC_LEX_PRINT_POP,
571 BC_LEX_NQUIT, 571 BC_LEX_NQUIT,
572 BC_LEX_SCALE_FACTOR, 572 BC_LEX_SCALE_FACTOR,
573#endif // ENABLE_DC 573#endif
574 574
575} BcLexType; 575} BcLexType;
576 576
@@ -689,7 +689,7 @@ typedef struct BcParse {
689 689
690} BcParse; 690} BcParse;
691 691
692#ifdef ENABLE_BC 692#if ENABLE_BC
693 693
694BcStatus bc_main(int argc, char *argv[]); 694BcStatus bc_main(int argc, char *argv[]);
695 695
@@ -719,7 +719,7 @@ static BcStatus bc_lex_token(BcLex *l);
719static BcStatus bc_parse_parse(BcParse *p); 719static BcStatus bc_parse_parse(BcParse *p);
720static BcStatus bc_parse_expr(BcParse *p, uint8_t flags, BcParseNext next); 720static BcStatus bc_parse_expr(BcParse *p, uint8_t flags, BcParseNext next);
721 721
722#endif // ENABLE_BC 722#endif
723 723
724#ifdef ENABLE_DC 724#ifdef ENABLE_DC
725 725
@@ -746,9 +746,9 @@ typedef struct BcProgram {
746 746
747 BcNum hexb; 747 BcNum hexb;
748 748
749#ifdef ENABLE_DC 749#if ENABLE_DC
750 BcNum strmb; 750 BcNum strmb;
751#endif // ENABLE_DC 751#endif
752 752
753 BcVec results; 753 BcVec results;
754 BcVec stack; 754 BcVec stack;
@@ -783,9 +783,9 @@ typedef struct BcProgram {
783#define BC_PROG_MAIN (0) 783#define BC_PROG_MAIN (0)
784#define BC_PROG_READ (1) 784#define BC_PROG_READ (1)
785 785
786#ifdef ENABLE_DC 786#if ENABLE_DC
787#define BC_PROG_REQ_FUNCS (2) 787#define BC_PROG_REQ_FUNCS (2)
788#endif // ENABLE_DC 788#endif
789 789
790#define BC_PROG_STR(n) (!(n)->num && !(n)->cap) 790#define BC_PROG_STR(n) (!(n)->num && !(n)->cap)
791#define BC_PROG_NUM(r, n) \ 791#define BC_PROG_NUM(r, n) \
@@ -852,16 +852,16 @@ typedef struct BcGlobals {
852 const char *name; 852 const char *name;
853#if ENABLE_FEATURE_BC_SIGNALS 853#if ENABLE_FEATURE_BC_SIGNALS
854 const char *sig_msg; 854 const char *sig_msg;
855#endif // ENABLE_FEATURE_BC_SIGNALS 855#endif
856 const char *help; 856 const char *help;
857 bool bc; 857 bool bc;
858 858
859} BcGlobals; 859} BcGlobals;
860 860
861#ifdef ENABLE_BC 861#if ENABLE_BC
862static BcStatus bc_vm_posixError(BcStatus s, const char *file, size_t line, 862static BcStatus bc_vm_posixError(BcStatus s, const char *file, size_t line,
863 const char *msg); 863 const char *msg);
864#endif // ENABLE_BC 864#endif
865 865
866static void bc_vm_exit(BcStatus s); 866static void bc_vm_exit(BcStatus s);
867static void bc_vm_printf(FILE *restrict f, const char *fmt, ...); 867static void bc_vm_printf(FILE *restrict f, const char *fmt, ...);
@@ -875,19 +875,19 @@ static BcStatus bc_vm_run(int argc, char *argv[], BcVmExe exe,
875 875
876static BcGlobals bcg; 876static BcGlobals bcg;
877 877
878#ifdef ENABLE_BC 878#if ENABLE_BC
879static const char bc_name[] = "bc"; 879static const char bc_name[] = "bc";
880#if ENABLE_FEATURE_BC_SIGNALS 880# if ENABLE_FEATURE_BC_SIGNALS
881static const char bc_sig_msg[] = "\ninterrupt (type \"quit\" to exit)\n"; 881static const char bc_sig_msg[] = "\ninterrupt (type \"quit\" to exit)\n";
882#endif // ENABLE_FEATURE_BC_SIGNALS 882# endif
883#endif // ENABLE_BC 883#endif
884 884
885#ifdef ENABLE_DC 885#if ENABLE_DC
886static const char dc_name[] = "dc"; 886static const char dc_name[] = "dc";
887#if ENABLE_FEATURE_BC_SIGNALS 887# if ENABLE_FEATURE_BC_SIGNALS
888static const char dc_sig_msg[] = "\ninterrupt (type \"q\" to exit)\n"; 888static const char dc_sig_msg[] = "\ninterrupt (type \"q\" to exit)\n";
889#endif // ENABLE_FEATURE_BC_SIGNALS 889# endif
890#endif // ENABLE_DC 890#endif
891 891
892static const char bc_copyright[] = 892static const char bc_copyright[] =
893 "Copyright (c) 2018 Gavin D. Howard and contributors\n" 893 "Copyright (c) 2018 Gavin D. Howard and contributors\n"
@@ -907,35 +907,35 @@ static const char *bc_errs[] = {
907 "Math", 907 "Math",
908 "Runtime", 908 "Runtime",
909 "Vector", 909 "Vector",
910#ifdef ENABLE_BC 910#if ENABLE_BC
911 "POSIX", 911 "POSIX",
912#endif // ENABLE_BC 912#endif
913}; 913};
914 914
915static const uint8_t bc_err_ids[] = { 915static const uint8_t bc_err_ids[] = {
916 BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM, 916 BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM,
917 BC_ERR_IDX_LEX, BC_ERR_IDX_LEX, BC_ERR_IDX_LEX, BC_ERR_IDX_LEX, 917 BC_ERR_IDX_LEX, BC_ERR_IDX_LEX, BC_ERR_IDX_LEX, BC_ERR_IDX_LEX,
918#ifdef ENABLE_DC 918#if ENABLE_DC
919 BC_ERR_IDX_LEX, 919 BC_ERR_IDX_LEX,
920#endif // ENABLE_DC 920#endif
921 BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, 921 BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
922 BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, 922 BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
923 BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, 923 BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH,
924 BC_ERR_IDX_MATH, 924 BC_ERR_IDX_MATH,
925#ifdef ENABLE_DC 925#if ENABLE_DC
926 BC_ERR_IDX_MATH, 926 BC_ERR_IDX_MATH,
927#endif // ENABLE_DC 927#endif
928 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, 928 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
929 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, 929 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
930 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, 930 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
931 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, 931 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
932 BC_ERR_IDX_EXEC, 932 BC_ERR_IDX_EXEC,
933 BC_ERR_IDX_VEC, BC_ERR_IDX_VEC, 933 BC_ERR_IDX_VEC, BC_ERR_IDX_VEC,
934#ifdef ENABLE_BC 934#if ENABLE_BC
935 BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, 935 BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX,
936 BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, 936 BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX,
937 BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, 937 BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX,
938#endif // ENABLE_BC 938#endif
939 BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM, 939 BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM,
940}; 940};
941 941
@@ -951,9 +951,9 @@ static const char *bc_err_msgs[] = {
951 "string end could not be found", 951 "string end could not be found",
952 "comment end could not be found", 952 "comment end could not be found",
953 "end of file", 953 "end of file",
954#ifdef ENABLE_DC 954#if ENABLE_DC
955 "extended register", 955 "extended register",
956#endif // ENABLE_DC 956#endif
957 957
958 "bad token", 958 "bad token",
959 "bad expression", 959 "bad expression",
@@ -992,7 +992,7 @@ static const char *bc_err_msgs[] = {
992 "index is out of bounds", 992 "index is out of bounds",
993 "item already exists", 993 "item already exists",
994 994
995#ifdef ENABLE_BC 995#if ENABLE_BC
996 "POSIX only allows one character names; the following is bad:", 996 "POSIX only allows one character names; the following is bad:",
997 "POSIX does not allow '#' script comments", 997 "POSIX does not allow '#' script comments",
998 "POSIX does not allow the following keyword:", 998 "POSIX does not allow the following keyword:",
@@ -1005,14 +1005,14 @@ static const char *bc_err_msgs[] = {
1005 "POSIX does not allow an empty condition expression in a for loop", 1005 "POSIX does not allow an empty condition expression in a for loop",
1006 "POSIX does not allow an empty update expression in a for loop", 1006 "POSIX does not allow an empty update expression in a for loop",
1007 "POSIX requires the left brace be on the same line as the function header", 1007 "POSIX requires the left brace be on the same line as the function header",
1008#endif // ENABLE_BC 1008#endif
1009 1009
1010}; 1010};
1011 1011
1012static const char bc_func_main[] = "(main)"; 1012static const char bc_func_main[] = "(main)";
1013static const char bc_func_read[] = "(read)"; 1013static const char bc_func_read[] = "(read)";
1014 1014
1015#ifdef ENABLE_BC 1015#if ENABLE_BC
1016static const BcLexKeyword bc_lex_kws[20] = { 1016static const BcLexKeyword bc_lex_kws[20] = {
1017 BC_LEX_KW_ENTRY("auto", 4, true), 1017 BC_LEX_KW_ENTRY("auto", 4, true),
1018 BC_LEX_KW_ENTRY("break", 5, true), 1018 BC_LEX_KW_ENTRY("break", 5, true),
@@ -1075,7 +1075,7 @@ static const BcParseNext bc_parse_next_read =
1075 BC_PARSE_NEXT(2, BC_LEX_NLINE, BC_LEX_EOF); 1075 BC_PARSE_NEXT(2, BC_LEX_NLINE, BC_LEX_EOF);
1076#endif // ENABLE_BC 1076#endif // ENABLE_BC
1077 1077
1078#ifdef ENABLE_DC 1078#if ENABLE_DC
1079static const BcLexType dc_lex_regs[] = { 1079static const BcLexType dc_lex_regs[] = {
1080 BC_LEX_OP_REL_EQ, BC_LEX_OP_REL_LE, BC_LEX_OP_REL_GE, BC_LEX_OP_REL_NE, 1080 BC_LEX_OP_REL_EQ, BC_LEX_OP_REL_LE, BC_LEX_OP_REL_GE, BC_LEX_OP_REL_NE,
1081 BC_LEX_OP_REL_LT, BC_LEX_OP_REL_GT, BC_LEX_SCOLON, BC_LEX_COLON, 1081 BC_LEX_OP_REL_LT, BC_LEX_OP_REL_GT, BC_LEX_SCOLON, BC_LEX_COLON,
@@ -1140,8 +1140,6 @@ static const BcInst dc_parse_insts[] = {
1140}; 1140};
1141#endif // ENABLE_DC 1141#endif // ENABLE_DC
1142 1142
1143static const char bc_num_hex_digits[] = "0123456789ABCDEF";
1144
1145static const BcNumBinaryOp bc_program_ops[] = { 1143static const BcNumBinaryOp bc_program_ops[] = {
1146 bc_num_pow, bc_num_mul, bc_num_div, bc_num_mod, bc_num_add, bc_num_sub, 1144 bc_num_pow, bc_num_mul, bc_num_div, bc_num_mod, bc_num_add, bc_num_sub,
1147}; 1145};
@@ -1149,7 +1147,7 @@ static const BcNumBinaryOp bc_program_ops[] = {
1149static const char bc_program_stdin_name[] = "<stdin>"; 1147static const char bc_program_stdin_name[] = "<stdin>";
1150static const char bc_program_ready_msg[] = "ready for more input\n"; 1148static const char bc_program_ready_msg[] = "ready for more input\n";
1151 1149
1152#ifdef ENABLE_BC 1150#if ENABLE_BC
1153static const char *bc_lib_name = "gen/lib.bc"; 1151static const char *bc_lib_name = "gen/lib.bc";
1154 1152
1155static const char bc_lib[] = { 1153static const char bc_lib[] = {
@@ -1417,7 +1415,7 @@ static BcStatus bc_read_line(BcVec *vec, const char *prompt)
1417 1415
1418 continue; 1416 continue;
1419 } 1417 }
1420#endif // ENABLE_FEATURE_BC_SIGNALS 1418#endif
1421 1419
1422 return BC_STATUS_IO_ERR; 1420 return BC_STATUS_IO_ERR;
1423 } 1421 }
@@ -1435,12 +1433,14 @@ static BcStatus bc_read_line(BcVec *vec, const char *prompt)
1435static BcStatus bc_read_file(const char *path, char **buf) 1433static BcStatus bc_read_file(const char *path, char **buf)
1436{ 1434{
1437 BcStatus s = BC_STATUS_BIN_FILE; 1435 BcStatus s = BC_STATUS_BIN_FILE;
1438 size_t size = ((size_t) -1), read; 1436 size_t size = ((size_t) -1);
1437 size_t i;
1439 1438
1440 *buf = xmalloc_open_read_close(path, &size); 1439 *buf = xmalloc_open_read_close(path, &size);
1441 1440
1442 for (read = 0; read < size; ++read) { 1441 for (i = 0; i < size; ++i) {
1443 if (BC_READ_BIN_CHAR((*buf)[read])) goto read_err; 1442 if (BC_READ_BIN_CHAR((*buf)[i]))
1443 goto read_err;
1444 } 1444 }
1445 1445
1446 return BC_STATUS_SUCCESS; 1446 return BC_STATUS_SUCCESS;
@@ -1459,7 +1459,7 @@ static const char bc_args_lopt[] ALIGN1 =
1459 "quiet\0"No_argument"q" 1459 "quiet\0"No_argument"q"
1460 "mathlib\0"No_argument"l" 1460 "mathlib\0"No_argument"l"
1461 "interactive\0"No_argument"i"; 1461 "interactive\0"No_argument"i";
1462#endif // ENABLE_FEATURE_BC_LONG_OPTIONS 1462#endif
1463 1463
1464static const char bc_args_opt[] ALIGN1 = "xwvsqli"; 1464static const char bc_args_opt[] ALIGN1 = "xwvsqli";
1465 1465
@@ -1473,9 +1473,9 @@ static BcStatus bc_args(int argc, char *argv[], uint32_t *flags, BcVec *files)
1473 1473
1474#if ENABLE_FEATURE_BC_LONG_OPTIONS 1474#if ENABLE_FEATURE_BC_LONG_OPTIONS
1475 *flags = getopt32long(argv, bc_args_opt, bc_args_lopt); 1475 *flags = getopt32long(argv, bc_args_opt, bc_args_lopt);
1476#else // ENABLE_FEATURE_BC_LONG_OPTIONS 1476#else
1477 *flags = getopt32(argv, bc_args_opt); 1477 *flags = getopt32(argv, bc_args_opt);
1478#endif // ENABLE_FEATURE_BC_LONG_OPTIONS 1478#endif
1479 1479
1480 if ((*flags) & BC_FLAG_V) bc_vm_info(NULL); 1480 if ((*flags) & BC_FLAG_V) bc_vm_info(NULL);
1481 if (do_exit) exit((int) s); 1481 if (do_exit) exit((int) s);
@@ -2335,7 +2335,7 @@ static void bc_num_printNewline(size_t *nchars, size_t line_len)
2335 } 2335 }
2336} 2336}
2337 2337
2338#ifdef ENABLE_DC 2338#if ENABLE_DC
2339static void bc_num_printChar(size_t num, size_t width, bool radix, 2339static void bc_num_printChar(size_t num, size_t width, bool radix,
2340 size_t *nchars, size_t line_len) 2340 size_t *nchars, size_t line_len)
2341{ 2341{
@@ -2343,25 +2343,27 @@ static void bc_num_printChar(size_t num, size_t width, bool radix,
2343 bc_vm_putchar((char) num); 2343 bc_vm_putchar((char) num);
2344 *nchars = *nchars + width; 2344 *nchars = *nchars + width;
2345} 2345}
2346#endif // ENABLE_DC 2346#endif
2347 2347
2348static void bc_num_printDigits(size_t num, size_t width, bool radix, 2348static void bc_num_printDigits(size_t num, size_t width, bool radix,
2349 size_t *nchars, size_t line_len) 2349 size_t *nchars, size_t line_len)
2350{ 2350{
2351 size_t exp, pow, div; 2351 size_t exp, pow;
2352 2352
2353 bc_num_printNewline(nchars, line_len); 2353 bc_num_printNewline(nchars, line_len);
2354 bc_vm_putchar(radix ? '.' : ' '); 2354 bc_vm_putchar(radix ? '.' : ' ');
2355 ++(*nchars); 2355 ++(*nchars);
2356 2356
2357 bc_num_printNewline(nchars, line_len); 2357 bc_num_printNewline(nchars, line_len);
2358 for (exp = 0, pow = 1; exp < width - 1; ++exp, pow *= 10); 2358 for (exp = 0, pow = 1; exp < width - 1; ++exp, pow *= 10)
2359 continue;
2359 2360
2360 for (exp = 0; exp < width; pow /= 10, ++(*nchars), ++exp) { 2361 for (exp = 0; exp < width; pow /= 10, ++(*nchars), ++exp) {
2362 size_t dig;
2361 bc_num_printNewline(nchars, line_len); 2363 bc_num_printNewline(nchars, line_len);
2362 div = num / pow; 2364 dig = num / pow;
2363 num -= div * pow; 2365 num -= dig * pow;
2364 bc_vm_putchar(((char) div) + '0'); 2366 bc_vm_putchar(((char) dig) + '0');
2365 } 2367 }
2366} 2368}
2367 2369
@@ -2375,7 +2377,7 @@ static void bc_num_printHex(size_t num, size_t width, bool radix,
2375 } 2377 }
2376 2378
2377 bc_num_printNewline(nchars, line_len); 2379 bc_num_printNewline(nchars, line_len);
2378 bc_vm_putchar(bc_num_hex_digits[num]); 2380 bc_vm_putchar(bb_hexdigits_upcase[num]);
2379 *nchars = *nchars + width; 2381 *nchars = *nchars + width;
2380} 2382}
2381 2383
@@ -2483,12 +2485,12 @@ static BcStatus bc_num_printBase(BcNum *n, BcNum *base, size_t base_t,
2483 return s; 2485 return s;
2484} 2486}
2485 2487
2486#ifdef ENABLE_DC 2488#if ENABLE_DC
2487static BcStatus bc_num_stream(BcNum *n, BcNum *base, size_t *nchars, size_t len) 2489static BcStatus bc_num_stream(BcNum *n, BcNum *base, size_t *nchars, size_t len)
2488{ 2490{
2489 return bc_num_printNum(n, base, 1, nchars, len, bc_num_printChar); 2491 return bc_num_printNum(n, base, 1, nchars, len, bc_num_printChar);
2490} 2492}
2491#endif // ENABLE_DC 2493#endif
2492 2494
2493static void bc_num_init(BcNum *n, size_t req) 2495static void bc_num_init(BcNum *n, size_t req)
2494{ 2496{
@@ -2766,7 +2768,7 @@ static BcStatus bc_num_divmod(BcNum *a, BcNum *b, BcNum *c, BcNum *d,
2766 return s; 2768 return s;
2767} 2769}
2768 2770
2769#ifdef ENABLE_DC 2771#if ENABLE_DC
2770static BcStatus bc_num_modexp(BcNum *a, BcNum *b, BcNum *c, BcNum *restrict d) 2772static BcStatus bc_num_modexp(BcNum *a, BcNum *b, BcNum *c, BcNum *restrict d)
2771{ 2773{
2772 BcStatus s; 2774 BcStatus s;
@@ -2908,7 +2910,7 @@ static void bc_string_free(void *string)
2908 free(*((char **) string)); 2910 free(*((char **) string));
2909} 2911}
2910 2912
2911#ifdef ENABLE_DC 2913#if ENABLE_DC
2912static void bc_result_copy(BcResult *d, BcResult *src) 2914static void bc_result_copy(BcResult *d, BcResult *src)
2913{ 2915{
2914 d->t = src->t; 2916 d->t = src->t;
@@ -3111,7 +3113,7 @@ static BcStatus bc_lex_text(BcLex *l, const char *text)
3111 return bc_lex_next(l); 3113 return bc_lex_next(l);
3112} 3114}
3113 3115
3114#ifdef ENABLE_BC 3116#if ENABLE_BC
3115static BcStatus bc_lex_identifier(BcLex *l) 3117static BcStatus bc_lex_identifier(BcLex *l)
3116{ 3118{
3117 BcStatus s; 3119 BcStatus s;
@@ -3490,7 +3492,7 @@ static BcStatus bc_lex_token(BcLex *l)
3490} 3492}
3491#endif // ENABLE_BC 3493#endif // ENABLE_BC
3492 3494
3493#ifdef ENABLE_DC 3495#if ENABLE_DC
3494static BcStatus dc_lex_register(BcLex *l) 3496static BcStatus dc_lex_register(BcLex *l)
3495{ 3497{
3496 BcStatus s = BC_STATUS_SUCCESS; 3498 BcStatus s = BC_STATUS_SUCCESS;
@@ -3762,7 +3764,7 @@ static void bc_parse_create(BcParse *p, BcProgram *prog, size_t func,
3762 bc_parse_updateFunc(p, func); 3764 bc_parse_updateFunc(p, func);
3763} 3765}
3764 3766
3765#ifdef ENABLE_BC 3767#if ENABLE_BC
3766static BcStatus bc_parse_else(BcParse *p); 3768static BcStatus bc_parse_else(BcParse *p);
3767static BcStatus bc_parse_stmt(BcParse *p); 3769static BcStatus bc_parse_stmt(BcParse *p);
3768 3770
@@ -5083,7 +5085,7 @@ static BcStatus bc_parse_expression(BcParse *p, uint8_t flags)
5083} 5085}
5084#endif // ENABLE_BC 5086#endif // ENABLE_BC
5085 5087
5086#ifdef ENABLE_DC 5088#if ENABLE_DC
5087static BcStatus dc_parse_register(BcParse *p) 5089static BcStatus dc_parse_register(BcParse *p)
5088{ 5090{
5089 BcStatus s; 5091 BcStatus s;
@@ -5438,10 +5440,6 @@ static BcStatus bc_program_binOpPrep(BcProgram *p, BcResult **l, BcNum **ln,
5438 return BC_STATUS_EXEC_BAD_TYPE; 5440 return BC_STATUS_EXEC_BAD_TYPE;
5439 if (!assign && !BC_PROG_NUM((*r), (*ln))) return BC_STATUS_EXEC_BAD_TYPE; 5441 if (!assign && !BC_PROG_NUM((*r), (*ln))) return BC_STATUS_EXEC_BAD_TYPE;
5440 5442
5441#ifdef ENABLE_DC
5442#else // ENABLE_DC
5443#endif // ENABLE_DC
5444
5445 return s; 5443 return s;
5446} 5444}
5447 5445
@@ -5463,9 +5461,6 @@ static BcStatus bc_program_prep(BcProgram *p, BcResult **r, BcNum **n)
5463 s = bc_program_num(p, *r, n, false); 5461 s = bc_program_num(p, *r, n, false);
5464 if (s) return s; 5462 if (s) return s;
5465 5463
5466#ifdef ENABLE_DC
5467#endif // ENABLE_DC
5468
5469 if (!BC_PROG_NUM((*r), (*n))) return BC_STATUS_EXEC_BAD_TYPE; 5464 if (!BC_PROG_NUM((*r), (*n))) return BC_STATUS_EXEC_BAD_TYPE;
5470 5465
5471 return s; 5466 return s;
@@ -5580,12 +5575,12 @@ static void bc_program_printString(const char *str, size_t *nchars)
5580{ 5575{
5581 size_t i, len = strlen(str); 5576 size_t i, len = strlen(str);
5582 5577
5583#ifdef ENABLE_DC 5578#if ENABLE_DC
5584 if (len == 0) { 5579 if (len == 0) {
5585 bc_vm_putchar('\0'); 5580 bc_vm_putchar('\0');
5586 return; 5581 return;
5587 } 5582 }
5588#endif // ENABLE_DC 5583#endif
5589 5584
5590 for (i = 0; i < len; ++i, ++(*nchars)) { 5585 for (i = 0; i < len; ++i, ++(*nchars)) {
5591 5586
@@ -5790,7 +5785,7 @@ static BcStatus bc_program_logical(BcProgram *p, char inst)
5790 return s; 5785 return s;
5791} 5786}
5792 5787
5793#ifdef ENABLE_DC 5788#if ENABLE_DC
5794static BcStatus bc_program_assignStr(BcProgram *p, BcResult *r, BcVec *v, 5789static BcStatus bc_program_assignStr(BcProgram *p, BcResult *r, BcVec *v,
5795 bool push) 5790 bool push)
5796{ 5791{
@@ -5829,10 +5824,10 @@ static BcStatus bc_program_copyToVar(BcProgram *p, char *name, bool var)
5829 if ((ptr->t == BC_RESULT_ARRAY) != !var) return BC_STATUS_EXEC_BAD_TYPE; 5824 if ((ptr->t == BC_RESULT_ARRAY) != !var) return BC_STATUS_EXEC_BAD_TYPE;
5830 bc_program_search(p, name, &v, var); 5825 bc_program_search(p, name, &v, var);
5831 5826
5832#ifdef ENABLE_DC 5827#if ENABLE_DC
5833 if (ptr->t == BC_RESULT_STR && !var) return BC_STATUS_EXEC_BAD_TYPE; 5828 if (ptr->t == BC_RESULT_STR && !var) return BC_STATUS_EXEC_BAD_TYPE;
5834 if (ptr->t == BC_RESULT_STR) return bc_program_assignStr(p, ptr, v, true); 5829 if (ptr->t == BC_RESULT_STR) return bc_program_assignStr(p, ptr, v, true);
5835#endif // ENABLE_DC 5830#endif
5836 5831
5837 s = bc_program_num(p, ptr, &n, false); 5832 s = bc_program_num(p, ptr, &n, false);
5838 if (s) return s; 5833 if (s) return s;
@@ -5869,7 +5864,7 @@ static BcStatus bc_program_assign(BcProgram *p, char inst)
5869 ib = left->t == BC_RESULT_IBASE; 5864 ib = left->t == BC_RESULT_IBASE;
5870 sc = left->t == BC_RESULT_SCALE; 5865 sc = left->t == BC_RESULT_SCALE;
5871 5866
5872#ifdef ENABLE_DC 5867#if ENABLE_DC
5873 5868
5874 if (right->t == BC_RESULT_STR) { 5869 if (right->t == BC_RESULT_STR) {
5875 5870
@@ -5880,12 +5875,12 @@ static BcStatus bc_program_assign(BcProgram *p, char inst)
5880 5875
5881 return bc_program_assignStr(p, right, v, false); 5876 return bc_program_assignStr(p, right, v, false);
5882 } 5877 }
5883#endif // ENABLE_DC 5878#endif
5884 5879
5885 if (left->t == BC_RESULT_CONSTANT || left->t == BC_RESULT_TEMP) 5880 if (left->t == BC_RESULT_CONSTANT || left->t == BC_RESULT_TEMP)
5886 return BC_STATUS_PARSE_BAD_ASSIGN; 5881 return BC_STATUS_PARSE_BAD_ASSIGN;
5887 5882
5888#ifdef ENABLE_BC 5883#if ENABLE_BC
5889 if (inst == BC_INST_ASSIGN_DIVIDE && !bc_num_cmp(r, &p->zero)) 5884 if (inst == BC_INST_ASSIGN_DIVIDE && !bc_num_cmp(r, &p->zero))
5890 return BC_STATUS_MATH_DIVIDE_BY_ZERO; 5885 return BC_STATUS_MATH_DIVIDE_BY_ZERO;
5891 5886
@@ -5895,9 +5890,9 @@ static BcStatus bc_program_assign(BcProgram *p, char inst)
5895 s = bc_program_ops[inst - BC_INST_ASSIGN_POWER](l, r, l, p->scale); 5890 s = bc_program_ops[inst - BC_INST_ASSIGN_POWER](l, r, l, p->scale);
5896 5891
5897 if (s) return s; 5892 if (s) return s;
5898#else // ENABLE_BC 5893#else
5899 bc_num_copy(l, r); 5894 bc_num_copy(l, r);
5900#endif // ENABLE_BC 5895#endif
5901 5896
5902 if (ib || sc || left->t == BC_RESULT_OBASE) { 5897 if (ib || sc || left->t == BC_RESULT_OBASE) {
5903 5898
@@ -5937,17 +5932,17 @@ static BcStatus bc_program_pushVar(BcProgram *p, char *code, size_t *bgn,
5937 BcStatus s = BC_STATUS_SUCCESS; 5932 BcStatus s = BC_STATUS_SUCCESS;
5938 BcResult r; 5933 BcResult r;
5939 char *name = bc_program_name(code, bgn); 5934 char *name = bc_program_name(code, bgn);
5940#ifdef ENABLE_DC // Exclude 5935#if ENABLE_DC // Exclude
5941 BcNum *num; 5936 BcNum *num;
5942 BcVec *v; 5937 BcVec *v;
5943#else // ENABLE_DC 5938#else
5944 (void) pop, (void) copy; 5939 (void) pop, (void) copy;
5945#endif // ENABLE_DC Exclude 5940#endif
5946 5941
5947 r.t = BC_RESULT_VAR; 5942 r.t = BC_RESULT_VAR;
5948 r.d.id.name = name; 5943 r.d.id.name = name;
5949 5944
5950#ifdef ENABLE_DC 5945#if ENABLE_DC
5951 bc_program_search(p, name, &v, true); 5946 bc_program_search(p, name, &v, true);
5952 num = bc_vec_top(v); 5947 num = bc_vec_top(v);
5953 5948
@@ -6019,7 +6014,7 @@ err:
6019 return s; 6014 return s;
6020} 6015}
6021 6016
6022#ifdef ENABLE_BC 6017#if ENABLE_BC
6023static BcStatus bc_program_incdec(BcProgram *p, char inst) 6018static BcStatus bc_program_incdec(BcProgram *p, char inst)
6024{ 6019{
6025 BcStatus s; 6020 BcStatus s;
@@ -6180,19 +6175,19 @@ static BcStatus bc_program_builtin(BcProgram *p, char inst)
6180 s = bc_program_num(p, opnd, &num, false); 6175 s = bc_program_num(p, opnd, &num, false);
6181 if (s) return s; 6176 if (s) return s;
6182 6177
6183#ifdef ENABLE_DC 6178#if ENABLE_DC
6184 if (!BC_PROG_NUM(opnd, num) && !len) return BC_STATUS_EXEC_BAD_TYPE; 6179 if (!BC_PROG_NUM(opnd, num) && !len) return BC_STATUS_EXEC_BAD_TYPE;
6185#endif // ENABLE_DC 6180#endif
6186 6181
6187 bc_num_init(&res.d.n, BC_NUM_DEF_SIZE); 6182 bc_num_init(&res.d.n, BC_NUM_DEF_SIZE);
6188 6183
6189 if (inst == BC_INST_SQRT) s = bc_num_sqrt(num, &res.d.n, p->scale); 6184 if (inst == BC_INST_SQRT) s = bc_num_sqrt(num, &res.d.n, p->scale);
6190#ifdef ENABLE_BC 6185#if ENABLE_BC
6191 else if (len != 0 && opnd->t == BC_RESULT_ARRAY) { 6186 else if (len != 0 && opnd->t == BC_RESULT_ARRAY) {
6192 s = bc_num_ulong2num(&res.d.n, (unsigned long) ((BcVec *) num)->len); 6187 s = bc_num_ulong2num(&res.d.n, (unsigned long) ((BcVec *) num)->len);
6193 } 6188 }
6194#endif // ENABLE_BC 6189#endif
6195#ifdef ENABLE_DC 6190#if ENABLE_DC
6196 else if (len != 0 && !BC_PROG_NUM(opnd, num)) { 6191 else if (len != 0 && !BC_PROG_NUM(opnd, num)) {
6197 6192
6198 char **str; 6193 char **str;
@@ -6202,7 +6197,7 @@ static BcStatus bc_program_builtin(BcProgram *p, char inst)
6202 s = bc_num_ulong2num(&res.d.n, strlen(*str)); 6197 s = bc_num_ulong2num(&res.d.n, strlen(*str));
6203 if (s) goto err; 6198 if (s) goto err;
6204 } 6199 }
6205#endif // ENABLE_DC 6200#endif
6206 else { 6201 else {
6207 BcProgramBuiltIn f = len ? bc_program_len : bc_program_scale; 6202 BcProgramBuiltIn f = len ? bc_program_len : bc_program_scale;
6208 s = bc_num_ulong2num(&res.d.n, f(num)); 6203 s = bc_num_ulong2num(&res.d.n, f(num));
@@ -6218,7 +6213,7 @@ err:
6218 return s; 6213 return s;
6219} 6214}
6220 6215
6221#ifdef ENABLE_DC 6216#if ENABLE_DC
6222static BcStatus bc_program_divmod(BcProgram *p) 6217static BcStatus bc_program_divmod(BcProgram *p)
6223{ 6218{
6224 BcStatus s; 6219 BcStatus s;
@@ -6563,9 +6558,9 @@ static void bc_program_free(BcProgram *p)
6563 bc_num_free(&p->ib); 6558 bc_num_free(&p->ib);
6564 bc_num_free(&p->ob); 6559 bc_num_free(&p->ob);
6565 bc_num_free(&p->hexb); 6560 bc_num_free(&p->hexb);
6566#ifdef ENABLE_DC 6561#if ENABLE_DC
6567 bc_num_free(&p->strmb); 6562 bc_num_free(&p->strmb);
6568#endif // ENABLE_DC 6563#endif
6569 bc_vec_free(&p->fns); 6564 bc_vec_free(&p->fns);
6570 bc_vec_free(&p->fn_map); 6565 bc_vec_free(&p->fn_map);
6571 bc_vec_free(&p->vars); 6566 bc_vec_free(&p->vars);
@@ -6607,10 +6602,10 @@ static void bc_program_init(BcProgram *p, size_t line_len, BcParseInit init,
6607 bc_num_ten(&p->hexb); 6602 bc_num_ten(&p->hexb);
6608 p->hexb.num[0] = 6; 6603 p->hexb.num[0] = 6;
6609 6604
6610#ifdef ENABLE_DC 6605#if ENABLE_DC
6611 bc_num_init(&p->strmb, BC_NUM_DEF_SIZE); 6606 bc_num_init(&p->strmb, BC_NUM_DEF_SIZE);
6612 bc_num_ulong2num(&p->strmb, UCHAR_MAX + 1); 6607 bc_num_ulong2num(&p->strmb, UCHAR_MAX + 1);
6613#endif // ENABLE_DC 6608#endif
6614 6609
6615 bc_num_init(&p->last, BC_NUM_DEF_SIZE); 6610 bc_num_init(&p->last, BC_NUM_DEF_SIZE);
6616 bc_num_zero(&p->last); 6611 bc_num_zero(&p->last);
@@ -6718,7 +6713,7 @@ static BcStatus bc_program_exec(BcProgram *p)
6718 6713
6719 switch (inst) { 6714 switch (inst) {
6720 6715
6721#ifdef ENABLE_BC 6716#if ENABLE_BC
6722 case BC_INST_JUMP_ZERO: 6717 case BC_INST_JUMP_ZERO:
6723 { 6718 {
6724 s = bc_program_prep(p, &ptr, &num); 6719 s = bc_program_prep(p, &ptr, &num);
@@ -6888,20 +6883,20 @@ static BcStatus bc_program_exec(BcProgram *p)
6888 break; 6883 break;
6889 } 6884 }
6890 6885
6891#ifdef ENABLE_BC 6886#if ENABLE_BC
6892 case BC_INST_ASSIGN_POWER: 6887 case BC_INST_ASSIGN_POWER:
6893 case BC_INST_ASSIGN_MULTIPLY: 6888 case BC_INST_ASSIGN_MULTIPLY:
6894 case BC_INST_ASSIGN_DIVIDE: 6889 case BC_INST_ASSIGN_DIVIDE:
6895 case BC_INST_ASSIGN_MODULUS: 6890 case BC_INST_ASSIGN_MODULUS:
6896 case BC_INST_ASSIGN_PLUS: 6891 case BC_INST_ASSIGN_PLUS:
6897 case BC_INST_ASSIGN_MINUS: 6892 case BC_INST_ASSIGN_MINUS:
6898#endif // ENABLE_BC 6893#endif
6899 case BC_INST_ASSIGN: 6894 case BC_INST_ASSIGN:
6900 { 6895 {
6901 s = bc_program_assign(p, inst); 6896 s = bc_program_assign(p, inst);
6902 break; 6897 break;
6903 } 6898 }
6904#ifdef ENABLE_DC 6899#if ENABLE_DC
6905 case BC_INST_MODEXP: 6900 case BC_INST_MODEXP:
6906 { 6901 {
6907 s = bc_program_modexp(p); 6902 s = bc_program_modexp(p);
@@ -7032,7 +7027,7 @@ static void bc_vm_sig(int sig)
7032 } 7027 }
7033 errno = err; 7028 errno = err;
7034} 7029}
7035#endif // ENABLE_FEATURE_BC_SIGNALS 7030#endif
7036 7031
7037static void bc_vm_info(const char *const help) 7032static void bc_vm_info(const char *const help)
7038{ 7033{
@@ -7052,7 +7047,7 @@ static BcStatus bc_vm_error(BcStatus s, const char *file, size_t line)
7052 return s * (!bcg.ttyin || !!strcmp(file, bc_program_stdin_name)); 7047 return s * (!bcg.ttyin || !!strcmp(file, bc_program_stdin_name));
7053} 7048}
7054 7049
7055#ifdef ENABLE_BC 7050#if ENABLE_BC
7056static BcStatus bc_vm_posixError(BcStatus s, const char *file, size_t line, 7051static BcStatus bc_vm_posixError(BcStatus s, const char *file, size_t line,
7057 const char *msg) 7052 const char *msg)
7058{ 7053{
@@ -7315,7 +7310,7 @@ static BcStatus bc_vm_exec(BcVm *vm)
7315 BcStatus s = BC_STATUS_SUCCESS; 7310 BcStatus s = BC_STATUS_SUCCESS;
7316 size_t i; 7311 size_t i;
7317 7312
7318#ifdef ENABLE_BC 7313#if ENABLE_BC
7319 if (vm->flags & BC_FLAG_L) { 7314 if (vm->flags & BC_FLAG_L) {
7320 7315
7321 bc_lex_file(&vm->prs.l, bc_lib_name); 7316 bc_lex_file(&vm->prs.l, bc_lib_name);
@@ -7327,7 +7322,7 @@ static BcStatus bc_vm_exec(BcVm *vm)
7327 s = bc_program_exec(&vm->prog); 7322 s = bc_program_exec(&vm->prog);
7328 if (s) return s; 7323 if (s) return s;
7329 } 7324 }
7330#endif // ENABLE_BC 7325#endif
7331 7326
7332 for (i = 0; !s && i < vm->files.len; ++i) 7327 for (i = 0; !s && i < vm->files.len; ++i)
7333 s = bc_vm_file(vm, *((char **) bc_vec_item(&vm->files, i))); 7328 s = bc_vm_file(vm, *((char **) bc_vec_item(&vm->files, i)));
@@ -7358,7 +7353,7 @@ static BcStatus bc_vm_init(BcVm *vm, BcVmExe exe, const char *env_len)
7358 sa.sa_handler = bc_vm_sig; 7353 sa.sa_handler = bc_vm_sig;
7359 sa.sa_flags = 0; 7354 sa.sa_flags = 0;
7360 sigaction(SIGINT, &sa, NULL); 7355 sigaction(SIGINT, &sa, NULL);
7361#endif // ENABLE_FEATURE_BC_SIGNALS 7356#endif
7362 7357
7363 memset(vm, 0, sizeof(BcVm)); 7358 memset(vm, 0, sizeof(BcVm));
7364 7359
@@ -7368,10 +7363,10 @@ static BcStatus bc_vm_init(BcVm *vm, BcVmExe exe, const char *env_len)
7368 7363
7369 bc_vec_init(&vm->files, sizeof(char *), NULL); 7364 bc_vec_init(&vm->files, sizeof(char *), NULL);
7370 7365
7371#ifdef ENABLE_BC 7366#if ENABLE_BC
7372 vm->flags |= BC_FLAG_S * bcg.bc * (getenv("POSIXLY_CORRECT") != NULL); 7367 vm->flags |= BC_FLAG_S * bcg.bc * (getenv("POSIXLY_CORRECT") != NULL);
7373 if (bcg.bc) s = bc_vm_envArgs(vm); 7368 if (bcg.bc) s = bc_vm_envArgs(vm);
7374#endif // ENABLE_BC 7369#endif
7375 7370
7376 bc_program_init(&vm->prog, len, exe.init, exe.exp); 7371 bc_program_init(&vm->prog, len, exe.init, exe.exp);
7377 exe.init(&vm->prs, &vm->prog, BC_PROG_MAIN); 7372 exe.init(&vm->prs, &vm->prog, BC_PROG_MAIN);
@@ -7393,13 +7388,13 @@ static BcStatus bc_vm_run(int argc, char *argv[], BcVmExe exe,
7393 bcg.ttyin = isatty(0); 7388 bcg.ttyin = isatty(0);
7394 bcg.tty = bcg.ttyin || (vm.flags & BC_FLAG_I) || isatty(1); 7389 bcg.tty = bcg.ttyin || (vm.flags & BC_FLAG_I) || isatty(1);
7395 7390
7396#ifdef ENABLE_BC 7391#if ENABLE_BC
7397 bcg.posix = vm.flags & BC_FLAG_S; 7392 bcg.posix = vm.flags & BC_FLAG_S;
7398 bcg.warn = vm.flags & BC_FLAG_W; 7393 bcg.warn = vm.flags & BC_FLAG_W;
7399#endif // ENABLE_BC 7394#endif
7400#ifdef ENABLE_DC 7395#if ENABLE_DC
7401 bcg.exreg = vm.flags & BC_FLAG_X; 7396 bcg.exreg = vm.flags & BC_FLAG_X;
7402#endif // ENABLE_DC 7397#endif
7403 7398
7404 if (bcg.ttyin && !(vm.flags & BC_FLAG_Q)) bc_vm_info(NULL); 7399 if (bcg.ttyin && !(vm.flags & BC_FLAG_Q)) bc_vm_info(NULL);
7405 st = bc_vm_exec(&vm); 7400 st = bc_vm_exec(&vm);
@@ -7409,16 +7404,16 @@ exit:
7409 return st; 7404 return st;
7410} 7405}
7411 7406
7412#ifdef ENABLE_BC 7407#if ENABLE_BC
7413BcStatus bc_main(int argc, char *argv[]) 7408BcStatus bc_main(int argc, char *argv[])
7414{ 7409{
7415 BcVmExe exec; 7410 BcVmExe exec;
7416 7411
7417 bcg.bc = true; 7412 bcg.bc = true;
7418 bcg.name = bc_name; 7413 bcg.name = bc_name;
7419#if ENABLE_FEATURE_BC_SIGNALS 7414# if ENABLE_FEATURE_BC_SIGNALS
7420 bcg.sig_msg = bc_sig_msg; 7415 bcg.sig_msg = bc_sig_msg;
7421#endif // ENABLE_FEATURE_BC_SIGNALS 7416# endif
7422 7417
7423 exec.init = bc_parse_init; 7418 exec.init = bc_parse_init;
7424 exec.exp = bc_parse_expression; 7419 exec.exp = bc_parse_expression;
@@ -7426,18 +7421,18 @@ BcStatus bc_main(int argc, char *argv[])
7426 7421
7427 return bc_vm_run(argc, argv, exec, "BC_LINE_LENGTH"); 7422 return bc_vm_run(argc, argv, exec, "BC_LINE_LENGTH");
7428} 7423}
7429#endif // ENABLE_BC 7424#endif
7430 7425
7431#ifdef ENABLE_DC 7426#if ENABLE_DC
7432BcStatus dc_main(int argc, char *argv[]) 7427BcStatus dc_main(int argc, char *argv[])
7433{ 7428{
7434 BcVmExe exec; 7429 BcVmExe exec;
7435 7430
7436 bcg.bc = false; 7431 bcg.bc = false;
7437 bcg.name = dc_name; 7432 bcg.name = dc_name;
7438#if ENABLE_FEATURE_BC_SIGNALS 7433# if ENABLE_FEATURE_BC_SIGNALS
7439 bcg.sig_msg = dc_sig_msg; 7434 bcg.sig_msg = dc_sig_msg;
7440#endif // ENABLE_FEATURE_BC_SIGNALS 7435# endif
7441 7436
7442 exec.init = dc_parse_init; 7437 exec.init = dc_parse_init;
7443 exec.exp = dc_parse_expr; 7438 exec.exp = dc_parse_expr;
@@ -7446,4 +7441,4 @@ BcStatus dc_main(int argc, char *argv[])
7446 7441
7447 return bc_vm_run(argc, argv, exec, "DC_LINE_LENGTH"); 7442 return bc_vm_run(argc, argv, exec, "DC_LINE_LENGTH");
7448} 7443}
7449#endif // ENABLE_DC 7444#endif