I submitted this to Rob about 2 weeks ago, but I forgot to CC the list.
Here's it resubmitted (attached).

The patch itself is various cleanup (Removal of -s -w, and anything 
"posixError", removal of
unneeded typedefs, compacting case statements, removing unneeded indirection, 
etc)

-   Oliver Webb <aquahobby...@proton.me>
From 0ab688638da60fb2275f3a09cc698bc342c47671 Mon Sep 17 00:00:00 2001
From: Oliver Webb <aquahobby...@proton.me>
Date: Sun, 24 Mar 2024 21:27:17 -0500
Subject: [PATCH] bc: Get rid of -s and -w and the code for it, unneeded
 parentheses in case statements, CHAR_MAX, move data closer to code,
 formatting

---
 toys/pending/bc.c | 589 ++++++++--------------------------------------
 1 file changed, 103 insertions(+), 486 deletions(-)

diff --git a/toys/pending/bc.c b/toys/pending/bc.c
index 2a47bf92..fdb4e37b 100644
--- a/toys/pending/bc.c
+++ b/toys/pending/bc.c
@@ -27,8 +27,6 @@ config BC
                          j(n, x)  =  Bessel function of integer order n of x
 
       -q  --quiet        don't print version and copyright
-      -s  --standard     error if any non-POSIX extensions are used
-      -w  --warn         warn if any non-POSIX extensions are used
 
 */
 
@@ -41,7 +39,7 @@ GLOBALS(
   char *vm;
 
   size_t nchars;
-  char *file, sig, max_ibase;
+  char *file, sig;
   uint16_t line_len;
 )
 
@@ -53,7 +51,6 @@ struct str_len {
 #define BC_VM ((BcVm*) TT.vm)
 
 typedef enum BcStatus {
-
   BC_STATUS_SUCCESS = 0,
   BC_STATUS_ERROR,
   BC_STATUS_EOF,
@@ -63,8 +60,7 @@ typedef enum BcStatus {
 
 } BcStatus;
 
-typedef enum BcError {
-
+enum BcError {
   BC_ERROR_VM_ALLOC_ERR,
   BC_ERROR_VM_IO_ERR,
   BC_ERROR_VM_BIN_FILE,
@@ -105,29 +101,12 @@ typedef enum BcError {
   BC_ERROR_EXEC_UNDEF_FUNC,
   BC_ERROR_EXEC_VOID_VAL,
 
-  BC_ERROR_POSIX_START,
-
-  BC_ERROR_POSIX_NAME_LEN = BC_ERROR_POSIX_START,
-  BC_ERROR_POSIX_COMMENT,
-  BC_ERROR_POSIX_KW,
-  BC_ERROR_POSIX_DOT,
-  BC_ERROR_POSIX_RET,
-  BC_ERROR_POSIX_BOOL,
-  BC_ERROR_POSIX_REL_POS,
-  BC_ERROR_POSIX_MULTIREL,
-  BC_ERROR_POSIX_FOR1,
-  BC_ERROR_POSIX_FOR2,
-  BC_ERROR_POSIX_FOR3,
-  BC_ERROR_POSIX_BRACE,
-  BC_ERROR_POSIX_REF,
-
 } BcError;
 
 #define BC_ERR_IDX_VM (0)
 #define BC_ERR_IDX_PARSE (1)
 #define BC_ERR_IDX_MATH (2)
 #define BC_ERR_IDX_EXEC (3)
-#define BC_ERR_IDX_POSIX (4)
 
 #define BC_VEC_START_CAP (1<<5)
 
@@ -154,7 +133,7 @@ typedef struct BcNum {
 
 // A crude, but always big enough, calculation of
 // the size required for ibase and obase BcNum's.
-#define BC_NUM_LONG_LOG10 ((CHAR_BIT * sizeof(unsigned long) + 1) / 2 + 1)
+#define BC_NUM_LONG_LOG10 ((8 * sizeof(long) + 1) / 2 + 1)
 
 #define BC_NUM_NEG(n, neg) ((((ssize_t) (n)) ^ -((ssize_t) (neg))) + (neg))
 
@@ -329,7 +308,6 @@ int bc_id_cmp(struct str_len *e1, struct str_len *e2);
 
 // BC_LEX_NEG is not used in lexing; it is only for parsing.
 typedef enum BcLexType {
-
   BC_LEX_EOF,
   BC_LEX_INVALID,
 
@@ -464,15 +442,8 @@ typedef struct BcLexKeyword {
 
 #define BC_LEX_CHAR_MSB(bit) ((bit) << (CHAR_BIT - 1))
 
-#define BC_LEX_KW_POSIX(kw) ((kw)->data & (BC_LEX_CHAR_MSB(1)))
 #define BC_LEX_KW_LEN(kw) ((size_t) ((kw)->data & ~(BC_LEX_CHAR_MSB(1))))
 
-#define BC_LEX_KW_ENTRY(a, b, c) \
-  { .data = ((b) & ~(BC_LEX_CHAR_MSB(1))) | BC_LEX_CHAR_MSB(c),.name = a }
-
-#define bc_lex_posixErr(l, e) (bc_vm_posixError((e), (l)->line))
-#define bc_lex_vposixErr(l, e, ...) \
-  (bc_vm_posixError((e), (l)->line, __VA_ARGS__))
 
 BcStatus bc_lex_token(BcLex *l);
 
@@ -514,7 +485,6 @@ BcStatus bc_lex_token(BcLex *l);
 #define BC_PARSE_BLOCK_STMT(f) \
   ((f) & (BC_PARSE_FLAG_ELSE | BC_PARSE_FLAG_LOOP_INNER))
 
-#define BC_PARSE_OP(p, l) (((p) & ~(BC_LEX_CHAR_MSB(1))) | (BC_LEX_CHAR_MSB(l)))
 
 #define BC_PARSE_OP_DATA(t) bc_parse_ops[((t) - BC_LEX_OP_INC)]
 #define BC_PARSE_OP_LEFT(op) (BC_PARSE_OP_DATA(op) & BC_LEX_CHAR_MSB(1))
@@ -535,10 +505,8 @@ BcStatus bc_lex_token(BcLex *l);
 // the first in the expr enum. Note: This only works for binary operators.
 #define BC_PARSE_TOKEN_INST(t) ((char) ((t) - BC_LEX_NEG + BC_INST_NEG))
 
-#define bc_parse_posixErr(p, e) (bc_vm_posixError((e), (p)->l.line))
-
 BcStatus bc_parse_parse(BcParse *p);
-BcStatus bc_parse_expr_status(BcParse *p, uint8_t flags, BcParseNext next);
+BcStatus bc_parse_expr_status(BcParse *p, char flags, BcParseNext next);
 void bc_parse_noElse(BcParse *p);
 
 #define BC_PROG_ONE_CAP (1)
@@ -593,17 +561,12 @@ unsigned long bc_program_len(BcNum *n);
 void bc_program_negate(BcResult *r, BcNum *n);
 void bc_program_not(BcResult *r, BcNum *n);
 
-#define BC_FLAG_TTYIN (1<<7)
-#define BC_TTYIN (toys.optflags & BC_FLAG_TTYIN)
-
 #define BC_MAX_OBASE ((unsigned long) INT_MAX)
 #define BC_MAX_DIM ((unsigned long) INT_MAX)
 #define BC_MAX_SCALE ((unsigned long) UINT_MAX)
 #define BC_MAX_STRING ((unsigned long) UINT_MAX - 1)
 #define BC_MAX_NAME BC_MAX_STRING
 #define BC_MAX_NUM BC_MAX_STRING
-#define BC_MAX_EXP ((unsigned long) ULONG_MAX)
-#define BC_MAX_VARS ((unsigned long) SIZE_MAX - 1)
 
 #define bc_vm_err(e) (bc_vm_error((e), 0))
 #define bc_vm_verr(e, ...) (bc_vm_error((e), 0, __VA_ARGS__))
@@ -613,27 +576,15 @@ typedef struct BcVm {
   BcProgram prog;
 } BcVm;
 
-BcStatus bc_vm_posixError(BcError e, size_t line, ...);
-
-BcStatus bc_vm_error(BcError e, size_t line, ...);
+BcStatus bc_vm_error(enum BcError e, size_t line, ...);
 
 char bc_sig_msg[] = "\ninterrupt (type \"quit\" to exit)\n";
 
-char bc_copyright[] =
-  "Copyright (c) 2018 Gavin D. Howard and contributors\n"
-  "Report bugs at: https://github.com/gavinhoward/bc\n\n";
-  "This is free software with ABSOLUTELY NO WARRANTY.\n";
-
-char *bc_err_fmt = "\n%s error: ";
-char *bc_warn_fmt = "\n%s warning: ";
-char *bc_err_line = ":%zu";
-
 char *bc_errs[] = {
   "VM",
   "Parse",
   "Math",
   "Runtime",
-  "POSIX",
 };
 
 char bc_err_ids[] = {
@@ -647,10 +598,6 @@ char bc_err_ids[] = {
   BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
   BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
   BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
-  BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX,
-  BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX,
-  BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX,
-  BC_ERR_IDX_POSIX,
 };
 
 char *bc_err_msgs[] = {
@@ -695,26 +642,13 @@ char *bc_err_msgs[] = {
   "mismatched parameters; need %zu, have %zu",
   "undefined function: %s()",
   "cannot use a void value in an expression",
-
-  "POSIX does not allow names longer than 1 character, like \"%s\"",
-  "POSIX does not allow '#' script comments",
-  "POSIX does not allow \"%s\" as a keyword",
-  "POSIX does not allow a period ('.') as a shortcut for the last result",
-  "POSIX requires parentheses around return expressions",
-  "POSIX does not allow the \"%s\" operators",
-  "POSIX does not allow comparison operators outside if or loops",
-  "POSIX requires zero or one comparison operator per condition",
-  "POSIX does not allow an empty init expression in a for loop",
-  "POSIX does not allow an empty condition expression in a for loop",
-  "POSIX does not allow an empty update expression in a for loop",
-  "POSIX requires the left brace be on the same line as the function header",
-  "POSIX does not allow array references as function parameters",
-
 };
 
 char bc_func_main[] = "(main)";
 char bc_func_read[] = "(read)";
 
+#define BC_LEX_KW_ENTRY(a, b, c) \
+  { .data = ((b) & ~(BC_LEX_CHAR_MSB(1))) | BC_LEX_CHAR_MSB(c),.name = a }
 BcLexKeyword bc_lex_kws[] = {
   BC_LEX_KW_ENTRY("auto", 4, 1),
   BC_LEX_KW_ENTRY("break", 5, 1),
@@ -741,9 +675,8 @@ BcLexKeyword bc_lex_kws[] = {
 
 size_t bc_lex_kws_len = sizeof(bc_lex_kws) / sizeof(BcLexKeyword);
 
-char *bc_parse_const1 = "1";
-
 // This is an array of data for operators that correspond to token types.
+#define BC_PARSE_OP(p, l) (((p) & ~(BC_LEX_CHAR_MSB(1))) | (BC_LEX_CHAR_MSB(l)))
 char bc_parse_ops[] = {
   BC_PARSE_OP(0, 0), BC_PARSE_OP(0, 0),
   BC_PARSE_OP(1, 0), BC_PARSE_OP(1, 0),
@@ -771,8 +704,6 @@ BcParseNext bc_parse_next_for = BC_PARSE_NEXT(1, BC_LEX_SCOLON);
 BcParseNext bc_parse_next_read =
   BC_PARSE_NEXT(2, BC_LEX_NLINE, BC_LEX_EOF);
 
-char bc_num_hex_digits[] = "0123456789ABCDEF";
-
 BcNumBinaryOp bc_program_ops[] = {
   bc_num_pow, bc_num_mul, bc_num_div, bc_num_mod, bc_num_add, bc_num_sub,
 };
@@ -788,8 +719,6 @@ BcProgramUnary bc_program_unarys[] = {
 
 char bc_program_ready_msg[] = "ready for more input\n";
 
-char *bc_lib_name = "gen/lib.bc";
-
 char *bc_lib =
 "scale=20;\n"
 
@@ -999,9 +928,9 @@ void bc_vec_pushIndex(BcVec *v, size_t idx) {
   char amt, nums[sizeof(size_t)];
 
   for (amt = 0; idx; ++amt) {
-    nums[amt] = (char) idx;
-    idx &= ((size_t) ~(UCHAR_MAX));
-    idx >>= sizeof(char) * CHAR_BIT;
+    nums[amt] = idx;
+    idx &= ((size_t) ~(255));
+    idx >>= 8;
   }
 
   bc_vec_push(v, &amt);
@@ -1116,7 +1045,7 @@ BcStatus bc_read_chars(BcVec *vec, char *prompt) {
 
   bc_vec_npop(vec, vec->len);
 
-  if (BC_TTYIN && !FLAG(s)) {
+  if (FLAG(i) && !FLAG(s)) {
     fputs(prompt, stderr);
     fflush(stderr);
   }
@@ -1133,7 +1062,7 @@ BcStatus bc_read_chars(BcVec *vec, char *prompt) {
 
         TT.sig = 0;
 
-        if (BC_TTYIN) {
+        if (FLAG(i)) {
           fputs(bc_program_ready_msg, stderr);
           if (!FLAG(s)) fputs(prompt, stderr);
           fflush(stderr);
@@ -1174,7 +1103,7 @@ BcStatus bc_read_line(BcVec *vec, char *prompt) {
 
 BcStatus bc_read_file(char *path, char **buf) {
 
-  BcError e = BC_ERROR_VM_IO_ERR;
+  enum BcError e = BC_ERROR_VM_IO_ERR;
   FILE *f;
   size_t size, read;
   long res;
@@ -1576,7 +1505,7 @@ static BcStatus bc_num_k(BcNum *a, BcNum *b, BcNum *c) {
       carry = 0;
 
       for (j = 0; !TT.sig && j < a->len; ++j) {
-        unsigned int in = (char) ptr[j];
+        unsigned int in = ptr[j];
         in += ((unsigned int) a->num[j]) * ((unsigned int) b->num[i]);
         carry = bc_num_addDigit(ptr + j, in, carry);
       }
@@ -2008,7 +1937,7 @@ static void bc_num_printDigits(size_t n, size_t len, int rdx) {
     bc_num_printNewline();
     dig = n / pow;
     n -= dig * pow;
-    putchar(((char) dig) + '0');
+    putchar(dig + '0');
   }
 }
 
@@ -2021,7 +1950,7 @@ static void bc_num_printHex(size_t n, size_t len, int rdx) {
   }
 
   bc_num_printNewline();
-  putchar(bc_num_hex_digits[n]);
+  putchar("0123456789ABCDEF"[n]);
   TT.nchars += len;
 }
 
@@ -2051,7 +1980,7 @@ static BcStatus bc_num_printNum(BcNum *n, BcNum *base,
     return BC_STATUS_SUCCESS;
   }
 
-  bc_vec_init(&stack, sizeof(unsigned long), NULL);
+  bc_vec_init(&stack, sizeof(long), NULL);
   bc_num_init(&fracp, n->rdx);
   bc_num_init(&digit, len);
   bc_num_init(&frac_len, BC_NUM_INT(n));
@@ -2222,7 +2151,7 @@ BcStatus bc_num_ulong(BcNum *n, unsigned long *result) {
     if (prev == SIZE_MAX || prev / 10 != r)
       return bc_vm_err(BC_ERROR_MATH_OVERFLOW);
 
-    r = prev + ((char) n->num[--i]);
+    r = prev + (n->num[--i]);
 
     if (r == SIZE_MAX || r < prev) return bc_vm_err(BC_ERROR_MATH_OVERFLOW);
   }
@@ -2443,7 +2372,7 @@ BcStatus bc_func_insert(BcFunc *f, char *name, BcType type, size_t line) {
 }
 
 void bc_func_init(BcFunc *f, char *name) {
-  bc_vec_init(&f->code, sizeof(char), NULL);
+  bc_vec_init(&f->code, 1, NULL);
   bc_vec_init(&f->strs, sizeof(char*), bc_string_free);
   bc_vec_init(&f->consts, sizeof(char*), bc_string_free);
   bc_vec_init(&f->autos, sizeof(struct str_len), bc_id_free);
@@ -2657,10 +2586,6 @@ BcStatus bc_lex_name(BcLex *l) {
   return BC_STATUS_SUCCESS;
 }
 
-void bc_lex_init(BcLex *l) {
-  bc_vec_init(&l->str, sizeof(char), NULL);
-}
-
 void bc_lex_file(BcLex *l, char *file) {
   l->line = 1;
   TT.file = file;
@@ -2711,11 +2636,6 @@ static BcStatus bc_lex_identifier(BcLex *l) {
     {
       l->t = BC_LEX_KEY_AUTO + (BcLexType) i;
 
-      if (!BC_LEX_KW_POSIX(kw)) {
-        s = bc_lex_vposixErr(l, BC_ERROR_POSIX_KW, kw->name);
-        if (s) return s;
-      }
-
       // We minus 1 because the index has already been incremented.
       l->i += len - 1;
       return BC_STATUS_SUCCESS;
@@ -2725,9 +2645,7 @@ static BcStatus bc_lex_identifier(BcLex *l) {
   s = bc_lex_name(l);
   if (s) return s;
 
-  if (l->str.len - 1 > 1) s = bc_lex_vposixErr(l, BC_ERROR_POSIX_NAME_LEN, buf);
-
-  return s;
+  return 0;
 }
 
 static BcStatus bc_lex_string(BcLex *l) {
@@ -2776,85 +2694,55 @@ BcStatus bc_lex_token(BcLex *l) {
 
     case '\0':
     case '\n':
-    {
       l->t = !c ? BC_LEX_EOF : BC_LEX_NLINE;
       break;
-    }
 
     case '\t':
     case '\v':
     case '\f':
     case '\r':
     case ' ':
-    {
       bc_lex_whitespace(l);
       break;
-    }
 
     case '!':
-    {
       bc_lex_assign(l, BC_LEX_OP_REL_NE, BC_LEX_OP_BOOL_NOT);
-
-      if (l->t == BC_LEX_OP_BOOL_NOT) {
-        s = bc_lex_vposixErr(l, BC_ERROR_POSIX_BOOL, "!");
-        if (s) return s;
-      }
-
       break;
-    }
 
     case '"':
-    {
       s = bc_lex_string(l);
       break;
-    }
 
     case '#':
-    {
-      s = bc_lex_posixErr(l, BC_ERROR_POSIX_COMMENT);
-      if (s) return s;
-
       bc_lex_lineComment(l);
-
       break;
-    }
 
     case '%':
-    {
       bc_lex_assign(l, BC_LEX_OP_ASSIGN_MODULUS, BC_LEX_OP_MODULUS);
       break;
-    }
 
     case '&':
-    {
       c2 = l->buf[l->i];
       if (c2 == '&') {
-
-        s = bc_lex_vposixErr(l, BC_ERROR_POSIX_BOOL, "&&");
-        if (s) return s;
-
         ++l->i;
         l->t = BC_LEX_OP_BOOL_AND;
       }
       else s = bc_lex_invalidChar(l, c);
 
       break;
-    }
+
     case '(':
     case ')':
-    {
       l->t = (BcLexType) (c - '(' + BC_LEX_LPAREN);
       break;
-    }
+
 
     case '*':
-    {
       bc_lex_assign(l, BC_LEX_OP_ASSIGN_MULTIPLY, BC_LEX_OP_MULTIPLY);
       break;
-    }
+
 
     case '+':
-    {
       c2 = l->buf[l->i];
       if (c2 == '+') {
         ++l->i;
@@ -2862,16 +2750,12 @@ BcStatus bc_lex_token(BcLex *l) {
       }
       else bc_lex_assign(l, BC_LEX_OP_ASSIGN_PLUS, BC_LEX_OP_PLUS);
       break;
-    }
 
     case ',':
-    {
       l->t = BC_LEX_COMMA;
       break;
-    }
 
     case '-':
-    {
       c2 = l->buf[l->i];
       if (c2 == '-') {
         ++l->i;
@@ -2879,149 +2763,67 @@ BcStatus bc_lex_token(BcLex *l) {
       }
       else bc_lex_assign(l, BC_LEX_OP_ASSIGN_MINUS, BC_LEX_OP_MINUS);
       break;
-    }
 
     case '.':
-    {
       c2 = l->buf[l->i];
       if (BC_LEX_NUM_CHAR(c2, 'Z', 1)) s = bc_lex_number(l, c);
       else {
         l->t = BC_LEX_KEY_LAST;
-        s = bc_lex_posixErr(l, BC_ERROR_POSIX_DOT);
       }
       break;
-    }
 
     case '/':
-    {
       c2 = l->buf[l->i];
       if (c2 =='*') s = bc_lex_comment(l);
       else bc_lex_assign(l, BC_LEX_OP_ASSIGN_DIVIDE, BC_LEX_OP_DIVIDE);
       break;
-    }
 
-    case '0':
-    case '1':
-    case '2':
-    case '3':
-    case '4':
-    case '5':
-    case '6':
-    case '7':
-    case '8':
-    case '9':
-    case 'A':
-    case 'B':
-    case 'C':
-    case 'D':
-    case 'E':
-    case 'F':
+    case '0' ... '9':
+    case 'A' ... 'F':
     // Apparently, GNU bc (and maybe others) allows any uppercase letter as a
     // number. When single digits, they act like the ones above. When multi-
     // digit, any letter above the input base is automatically set to the
     // biggest allowable digit in the input base.
-    case 'G':
-    case 'H':
-    case 'I':
-    case 'J':
-    case 'K':
-    case 'L':
-    case 'M':
-    case 'N':
-    case 'O':
-    case 'P':
-    case 'Q':
-    case 'R':
-    case 'S':
-    case 'T':
-    case 'U':
-    case 'V':
-    case 'W':
-    case 'X':
-    case 'Y':
-    case 'Z':
-    {
+    case 'G' ... 'Z':
       s = bc_lex_number(l, c);
       break;
-    }
 
     case ';':
-    {
       l->t = BC_LEX_SCOLON;
       break;
-    }
 
     case '<':
-    {
       bc_lex_assign(l, BC_LEX_OP_REL_LE, BC_LEX_OP_REL_LT);
       break;
-    }
 
     case '=':
-    {
       bc_lex_assign(l, BC_LEX_OP_REL_EQ, BC_LEX_OP_ASSIGN);
       break;
-    }
 
     case '>':
-    {
       bc_lex_assign(l, BC_LEX_OP_REL_GE, BC_LEX_OP_REL_GT);
       break;
-    }
 
     case '[':
     case ']':
-    {
       l->t = (BcLexType) (c - '[' + BC_LEX_LBRACKET);
       break;
-    }
 
     case '\\':
-    {
       if (l->buf[l->i] == '\n') {
         l->t = BC_LEX_WHITESPACE;
         ++l->i;
       }
       else s = bc_lex_invalidChar(l, c);
       break;
-    }
 
     case '^':
-    {
       bc_lex_assign(l, BC_LEX_OP_ASSIGN_POWER, BC_LEX_OP_POWER);
       break;
-    }
 
-    case 'a':
-    case 'b':
-    case 'c':
-    case 'd':
-    case 'e':
-    case 'f':
-    case 'g':
-    case 'h':
-    case 'i':
-    case 'j':
-    case 'k':
-    case 'l':
-    case 'm':
-    case 'n':
-    case 'o':
-    case 'p':
-    case 'q':
-    case 'r':
-    case 's':
-    case 't':
-    case 'u':
-    case 'v':
-    case 'w':
-    case 'x':
-    case 'y':
-    case 'z':
-    {
+    case 'a' ... 'z':
       s = bc_lex_identifier(l);
       break;
-    }
 
     case '{':
     case '}':
@@ -3035,10 +2837,6 @@ BcStatus bc_lex_token(BcLex *l) {
       c2 = l->buf[l->i];
 
       if (c2 == '|') {
-
-        s = bc_lex_vposixErr(l, BC_ERROR_POSIX_BOOL, "||");
-        if (s) return s;
-
         ++l->i;
         l->t = BC_LEX_OP_BOOL_OR;
       }
@@ -3064,7 +2862,7 @@ void bc_parse_updateFunc(BcParse *p, size_t fidx) {
 
 void bc_parse_pushName(BcParse *p, char *name) {
   bc_vec_npush(&p->func->code, strlen(name), name);
-  bc_parse_push(p, UCHAR_MAX);
+  bc_parse_push(p, 255);
 }
 
 void bc_parse_pushIndex(BcParse *p, size_t idx) {
@@ -3120,13 +2918,13 @@ void bc_parse_free(BcParse *p) {
 void bc_parse_init(BcParse *p, BcProgram *prog, size_t func)
 {
   uint16_t flag = 0;
-  bc_vec_init(&p->flags, sizeof(uint16_t), NULL);
+  bc_vec_init(&p->flags, 16, NULL);
   bc_vec_push(&p->flags, &flag);
   bc_vec_init(&p->exits, sizeof(BcInstPtr), NULL);
   bc_vec_init(&p->conds, sizeof(size_t), NULL);
   bc_vec_init(&p->ops, sizeof(BcLexType), NULL);
 
-  bc_lex_init(&p->l);
+  bc_vec_init(&p->l.str, 1, NULL);
 
   p->prog = prog;
   p->auto_part = 0;
@@ -3135,7 +2933,7 @@ void bc_parse_init(BcParse *p, BcProgram *prog, size_t func)
 
 static BcStatus bc_parse_else(BcParse *p);
 static BcStatus bc_parse_stmt(BcParse *p);
-static BcStatus bc_parse_expr_err(BcParse *p, uint8_t flags, BcParseNext next);
+static BcStatus bc_parse_expr_err(BcParse *p, char flags, BcParseNext next);
 
 static int bc_parse_inst_isLeaf(BcInst t) {
   return (t >= BC_INST_NUM && t <= BC_INST_ABS) ||
@@ -3263,7 +3061,7 @@ static BcStatus bc_parse_rightParen(BcParse *p, size_t ops_bgn, size_t *nexs) {
   return bc_lex_next(&p->l);
 }
 
-static BcStatus bc_parse_params(BcParse *p, uint8_t flags) {
+static BcStatus bc_parse_params(BcParse *p, char flags) {
 
   BcStatus s;
   int comma = 0;
@@ -3292,7 +3090,7 @@ static BcStatus bc_parse_params(BcParse *p, uint8_t flags) {
   return BC_STATUS_SUCCESS;
 }
 
-static BcStatus bc_parse_call(BcParse *p, char *name, uint8_t flags) {
+static BcStatus bc_parse_call(BcParse *p, char *name, char flags) {
 
   BcStatus s;
   struct str_len id;
@@ -3325,7 +3123,7 @@ err:
   return s;
 }
 
-static BcStatus bc_parse_name(BcParse *p, BcInst *type, uint8_t flags) {
+static BcStatus bc_parse_name(BcParse *p, BcInst *type, char flags) {
 
   BcStatus s;
   char *name;
@@ -3409,7 +3207,7 @@ static BcStatus bc_parse_read(BcParse *p) {
 }
 
 static BcStatus bc_parse_builtin(BcParse *p, BcLexType type,
-                                 uint8_t flags, BcInst *prev)
+                                 char flags, BcInst *prev)
 {
   BcStatus s;
 
@@ -3434,7 +3232,7 @@ static BcStatus bc_parse_builtin(BcParse *p, BcLexType type,
   return bc_lex_next(&p->l);
 }
 
-static BcStatus bc_parse_scale(BcParse *p, BcInst *type, uint8_t flags) {
+static BcStatus bc_parse_scale(BcParse *p, BcInst *type, char flags) {
 
   BcStatus s;
 
@@ -3463,7 +3261,7 @@ static BcStatus bc_parse_scale(BcParse *p, BcInst *type, uint8_t flags) {
 }
 
 static BcStatus bc_parse_incdec(BcParse *p, BcInst *prev,
-                                size_t *nexs, uint8_t flags)
+                                size_t *nexs, char flags)
 {
   BcStatus s;
   BcLexType type;
@@ -3578,10 +3376,7 @@ static BcStatus bc_parse_print(BcParse *p) {
 }
 
 static BcStatus bc_parse_return(BcParse *p) {
-
   BcStatus s;
-  BcLexType t;
-  int paren;
   char inst = BC_INST_RET0;
 
   if (!BC_PARSE_FUNC(p)) return bc_parse_err(p, BC_ERROR_PARSE_TOKEN);
@@ -3591,9 +3386,6 @@ static BcStatus bc_parse_return(BcParse *p) {
   s = bc_lex_next(&p->l);
   if (s) return s;
 
-  t = p->l.t;
-  paren = t == BC_LEX_LPAREN;
-
   if (bc_parse_isDelimiter(p)) bc_parse_push(p, inst);
   else {
 
@@ -3605,11 +3397,7 @@ static BcStatus bc_parse_return(BcParse *p) {
       if (s) return s;
     }
 
-    if (!paren || p->l.last != BC_LEX_RPAREN) {
-      s = bc_parse_posixErr(p, BC_ERROR_POSIX_RET);
-      if (s) return s;
-    }
-    else if (p->func->voidfn)
+    if (p->func->voidfn)
       return bc_parse_verr(p, BC_ERROR_PARSE_RET_VOID, p->func->name);
 
     bc_parse_push(p, BC_INST_RET);
@@ -3793,7 +3581,6 @@ static BcStatus bc_parse_while(BcParse *p) {
 }
 
 static BcStatus bc_parse_for(BcParse *p) {
-
   BcStatus s;
   size_t cond_idx, exit_idx, body_idx, update_idx;
 
@@ -3807,7 +3594,7 @@ static BcStatus bc_parse_for(BcParse *p) {
     s = bc_parse_expr_status(p, 0, bc_parse_next_for);
     if (!s) bc_parse_push(p, BC_INST_POP);
   }
-  else s = bc_parse_posixErr(p, BC_ERROR_POSIX_FOR1);
+  else;
 
   if (s) return s;
   if (p->l.t != BC_LEX_SCOLON) return bc_parse_err(p, BC_ERROR_PARSE_TOKEN);
@@ -3828,10 +3615,9 @@ static BcStatus bc_parse_for(BcParse *p) {
     // Set this for the next call to bc_parse_number.
     // This is safe to set because the current token
     // is a semicolon, which has no string requirement.
-    bc_vec_string(&p->l.str, strlen(bc_parse_const1), bc_parse_const1);
+    bc_vec_string(&p->l.str, 1, "1");
     bc_parse_number(p);
 
-    s = bc_parse_posixErr(p, BC_ERROR_POSIX_FOR2);
   }
 
   if (s) return s;
@@ -3851,7 +3637,7 @@ static BcStatus bc_parse_for(BcParse *p) {
     s = bc_parse_expr_status(p, 0, bc_parse_next_rel);
     if (!s) bc_parse_push(p, BC_INST_POP);
   }
-  else s = bc_parse_posixErr(p, BC_ERROR_POSIX_FOR3);
+  else;
 
   if (s) return s;
 
@@ -3867,8 +3653,8 @@ static BcStatus bc_parse_for(BcParse *p) {
   return s;
 }
 
-static BcStatus bc_parse_loopExit(BcParse *p, BcLexType type) {
-
+static BcStatus bc_parse_loopExit(BcParse *p, BcLexType type)
+{
   size_t i;
   BcInstPtr *ip;
 
@@ -3895,8 +3681,8 @@ static BcStatus bc_parse_loopExit(BcParse *p, BcLexType type) {
   return bc_lex_next(&p->l);
 }
 
-static BcStatus bc_parse_func(BcParse *p) {
-
+static BcStatus bc_parse_func(BcParse *p)
+{
   BcStatus s;
   int comma = 0, voidfn;
   uint16_t flags;
@@ -3977,8 +3763,6 @@ static BcStatus bc_parse_func(BcParse *p) {
   s = bc_lex_next(&p->l);
   if (s) return s;
 
-  if (p->l.t != BC_LEX_LBRACE) s = bc_parse_posixErr(p, BC_ERROR_POSIX_BRACE);
-
   return s;
 
 err:
@@ -4045,8 +3829,8 @@ err:
   return s;
 }
 
-static BcStatus bc_parse_body(BcParse *p, int brace) {
-
+static BcStatus bc_parse_body(BcParse *p, int brace)
+{
   BcStatus s = BC_STATUS_SUCCESS;
   uint16_t *flag_ptr = BC_PARSE_TOP_FLAG_PTR(p);
 
@@ -4079,8 +3863,8 @@ static BcStatus bc_parse_body(BcParse *p, int brace) {
   return s;
 }
 
-static BcStatus bc_parse_stmt(BcParse *p) {
-
+static BcStatus bc_parse_stmt(BcParse *p)
+{
   BcStatus s = BC_STATUS_SUCCESS;
   size_t len;
   uint16_t flags;
@@ -4121,7 +3905,6 @@ static BcStatus bc_parse_stmt(BcParse *p) {
   flags = BC_PARSE_TOP_FLAG(p);
 
   switch (type) {
-
     case BC_LEX_OP_INC:
     case BC_LEX_OP_DEC:
     case BC_LEX_OP_MINUS:
@@ -4137,108 +3920,64 @@ static BcStatus bc_parse_stmt(BcParse *p) {
     case BC_LEX_KEY_SCALE:
     case BC_LEX_KEY_SQRT:
     case BC_LEX_KEY_ABS:
-    {
       s = bc_parse_expr_status(p, BC_PARSE_PRINT, bc_parse_next_expr);
       break;
-    }
 
     case BC_LEX_KEY_ELSE:
-    {
       s = bc_parse_else(p);
       break;
-    }
 
     case BC_LEX_SCOLON:
-    {
       // Do nothing.
       break;
-    }
 
     case BC_LEX_RBRACE:
-    {
       s = bc_parse_endBody(p, 1);
       break;
-    }
 
     case BC_LEX_STR:
-    {
       s = bc_parse_str(p, BC_INST_PRINT_STR);
       break;
-    }
 
     case BC_LEX_KEY_BREAK:
     case BC_LEX_KEY_CONTINUE:
-    {
       s = bc_parse_loopExit(p, p->l.t);
       break;
-    }
 
     case BC_LEX_KEY_FOR:
-    {
       s = bc_parse_for(p);
       break;
-    }
 
     case BC_LEX_KEY_HALT:
-    {
       bc_parse_push(p, BC_INST_HALT);
       s = bc_lex_next(&p->l);
       break;
-    }
 
     case BC_LEX_KEY_IF:
-    {
       s = bc_parse_if(p);
       break;
-    }
-
-    case BC_LEX_KEY_LIMITS:
-    {
-      printf("BC_BASE_MAX     = %lu\n", BC_MAX_OBASE);
-      printf("BC_DIM_MAX      = %lu\n", BC_MAX_DIM);
-      printf("BC_SCALE_MAX    = %lu\n", BC_MAX_SCALE);
-      printf("BC_STRING_MAX   = %lu\n", BC_MAX_STRING);
-      printf("BC_NAME_MAX     = %lu\n", BC_MAX_NAME);
-      printf("BC_NUM_MAX      = %lu\n", BC_MAX_NUM);
-      printf("MAX Exponent    = %lu\n", BC_MAX_EXP);
-      printf("Number of vars  = %lu\n", BC_MAX_VARS);
-
-      s = bc_lex_next(&p->l);
-
-      break;
-    }
 
     case BC_LEX_KEY_PRINT:
-    {
       s = bc_parse_print(p);
       break;
-    }
 
     case BC_LEX_KEY_QUIT:
-    {
       // Quit is a compile-time command. We don't exit directly,
       // so the vm can clean up. Limits do the same thing.
       s = BC_STATUS_QUIT;
       break;
-    }
 
     case BC_LEX_KEY_RETURN:
-    {
       s = bc_parse_return(p);
       break;
-    }
 
     case BC_LEX_KEY_WHILE:
-    {
       s = bc_parse_while(p);
       break;
-    }
 
     default:
-    {
       s = bc_parse_err(p, BC_ERROR_PARSE_TOKEN);
       break;
-    }
   }
 
   if (!s && len == p->flags.len && flags == BC_PARSE_TOP_FLAG(p)) {
@@ -4251,8 +3990,8 @@ static BcStatus bc_parse_stmt(BcParse *p) {
   return s;
 }
 
-BcStatus bc_parse_parse(BcParse *p) {
-
+BcStatus bc_parse_parse(BcParse *p)
+{
   BcStatus s;
 
   if (p->l.t == BC_LEX_EOF) s = bc_parse_err(p, BC_ERROR_PARSE_EOF);
@@ -4267,12 +4006,12 @@ BcStatus bc_parse_parse(BcParse *p) {
   return s;
 }
 
-static BcStatus bc_parse_expr_err(BcParse *p, uint8_t flags, BcParseNext next) {
+static BcStatus bc_parse_expr_err(BcParse *p, char flags, BcParseNext next) {
   BcStatus s = BC_STATUS_SUCCESS;
   BcInst prev = BC_INST_PRINT;
   BcLexType top, t = p->l.t;
   size_t nexprs = 0, ops_bgn = p->ops.len;
-  uint32_t i, nparens, nrelops;
+  unsigned i, nparens, nrelops;
   int pfirst, rprn, done, get_token, assign, bin_last, incdec;
   char valid[] = {0xfc, 0xff, 0xff, 0x67, 0xc0, 0x00, 0x7c, 0x0b};
 
@@ -4427,8 +4166,8 @@ static BcStatus bc_parse_expr_err(BcParse *p, uint8_t flags, BcParseNext next) {
         if (BC_PARSE_LEAF(prev, bin_last, rprn))
           return bc_parse_err(p, BC_ERROR_PARSE_EXPR);
 
-        prev = (char) (t - BC_LEX_KEY_LAST + BC_INST_LAST);
-        bc_parse_push(p, (char) prev);
+        prev = (t - BC_LEX_KEY_LAST + BC_INST_LAST);
+        bc_parse_push(p, prev);
 
         get_token = 1;
         rprn = bin_last = 0;
@@ -4511,15 +4250,6 @@ static BcStatus bc_parse_expr_err(BcParse *p, uint8_t flags, BcParseNext next) {
   if (i == next.len && !bc_parse_isDelimiter(p))
     return bc_parse_err(p, BC_ERROR_PARSE_EXPR);
 
-  if (!(flags & BC_PARSE_REL) && nrelops) {
-    s = bc_parse_posixErr(p, BC_ERROR_POSIX_REL_POS);
-    if (s) return s;
-  }
-  else if ((flags & BC_PARSE_REL) && nrelops > 1) {
-    s = bc_parse_posixErr(p, BC_ERROR_POSIX_MULTIREL);
-    if (s) return s;
-  }
-
   if (flags & BC_PARSE_PRINT) {
     if (pfirst || !assign) bc_parse_push(p, BC_INST_PRINT);
     bc_parse_push(p, BC_INST_POP);
@@ -4536,7 +4266,7 @@ static BcStatus bc_parse_expr_err(BcParse *p, uint8_t flags, BcParseNext next) {
   return s;
 }
 
-BcStatus bc_parse_expr_status(BcParse *p, uint8_t flags, BcParseNext next) {
+BcStatus bc_parse_expr_status(BcParse *p, char flags, BcParseNext next) {
 
   BcStatus s = bc_parse_expr_err(p, flags, next);
 
@@ -4571,12 +4301,11 @@ static char *bc_program_str(BcProgram *p, size_t idx, int str) {
 }
 
 static size_t bc_program_index(char *code, size_t *bgn) {
-
-  char amt = (char) code[(*bgn)++], i = 0;
+  char amt = code[(*bgn)++], i = 0;
   size_t res = 0;
 
   for (; i < amt; ++i, ++(*bgn)) {
-    size_t temp = ((size_t) ((int) (char) code[*bgn]) & UCHAR_MAX);
+    size_t temp = code[*bgn] & 255;
     res |= (temp << (i * CHAR_BIT));
   }
 
@@ -4584,16 +4313,15 @@ static size_t bc_program_index(char *code, size_t *bgn) {
 }
 
 static char *bc_program_name(char *code, size_t *bgn) {
-
   size_t i;
   char c;
   char *s;
-  char *str = code + *bgn, *ptr = strchr(str, UCHAR_MAX);
+  char *str = code + *bgn, *ptr = strchr(str, 255);
 
   s = xmalloc(((unsigned long) ptr) - ((unsigned long) str) + 1);
 
-  for (i = 0; (c = (char) code[(*bgn)++]) && c != UCHAR_MAX; ++i)
-    s[i] = (char) c;
+  for (i = 0; (c = code[(*bgn)++]) && c != 255; ++i)
+    s[i] = c;
 
   s[i] = '\0';
 
@@ -4601,7 +4329,6 @@ static char *bc_program_name(char *code, size_t *bgn) {
 }
 
 static BcVec* bc_program_search(BcProgram *p, char *id, BcType type) {
-
   struct str_len e, *ptr;
   BcVec *v, *map;
   size_t i;
@@ -4627,7 +4354,6 @@ static BcVec* bc_program_search(BcProgram *p, char *id, BcType type) {
 }
 
 static BcStatus bc_program_num(BcProgram *p, BcResult *r, BcNum **num) {
-
   BcStatus s = BC_STATUS_SUCCESS;
   BcNum *n = &r->d.n;
 
@@ -4655,15 +4381,12 @@ static BcStatus bc_program_num(BcProgram *p, BcResult *r, BcNum **num) {
     case BC_RESULT_IBASE:
     case BC_RESULT_SCALE:
     case BC_RESULT_OBASE:
-    {
       *num = n;
       break;
-    }
 
     case BC_RESULT_VAR:
     case BC_RESULT_ARRAY:
     case BC_RESULT_ARRAY_ELEM:
-    {
       BcVec *v;
       BcType type = (r->t == BC_RESULT_VAR) ? BC_TYPE_VAR : BC_TYPE_ARRAY;
 
@@ -4681,25 +4404,18 @@ static BcStatus bc_program_num(BcProgram *p, BcResult *r, BcNum **num) {
       else *num = bc_vec_top(v);
 
       break;
-    }
 
     case BC_RESULT_LAST:
-    {
       *num = &p->last;
       break;
-    }
 
     case BC_RESULT_ONE:
-    {
       *num = &p->one;
       break;
-    }
 
     case BC_RESULT_VOID:
-    {
       s = bc_vm_err(BC_ERROR_EXEC_VOID_VAL);
       break;
-    }
   }
 
   return s;
@@ -4708,7 +4424,6 @@ static BcStatus bc_program_num(BcProgram *p, BcResult *r, BcNum **num) {
 static BcStatus bc_program_operand(BcProgram *p, BcResult **r,
                                    BcNum **n, size_t idx)
 {
-
   *r = bc_vec_item_rev(&p->results, idx);
 
   return bc_program_num(p, *r, n);
@@ -4781,7 +4496,6 @@ static void bc_program_binOpRetire(BcProgram *p, BcResult *r) {
 }
 
 static BcStatus bc_program_prep(BcProgram *p, BcResult **r, BcNum **n) {
-
   BcStatus s;
 
   s = bc_program_operand(p, r, n, 0);
@@ -4797,7 +4511,6 @@ static void bc_program_retire(BcProgram *p, BcResult *r, BcResultType t) {
 }
 
 static BcStatus bc_program_op(BcProgram *p, char inst) {
-
   BcStatus s;
   BcResult *opd1, *opd2, res;
   BcNum *n1 = NULL, *n2 = NULL;
@@ -4837,7 +4550,7 @@ static BcStatus bc_program_read(BcProgram *p) {
   file = TT.file;
   bc_lex_file(&parse.l, "<stdin>");
   bc_vec_npop(&f->code, f->code.len);
-  bc_vec_init(&buf, sizeof(char), NULL);
+  bc_vec_init(&buf, 1, NULL);
 
   s = bc_read_line(&buf, "read> ");
   if (s) {
@@ -4902,7 +4615,6 @@ static void bc_program_printString(char *str)
 }
 
 static BcStatus bc_program_print(BcProgram *p, char inst, size_t idx) {
-
   BcStatus s = BC_STATUS_SUCCESS;
   BcResult *r;
   char *str;
@@ -4995,46 +4707,14 @@ static BcStatus bc_program_logical(BcProgram *p, char inst) {
   else if (inst == BC_INST_BOOL_OR)
     cond = BC_NUM_CMP_ZERO(n1) || BC_NUM_CMP_ZERO(n2);
   else {
-
     cmp = bc_num_cmp(n1, n2);
-
     switch (inst) {
-
-      case BC_INST_REL_EQ:
-      {
-        cond = cmp == 0;
-        break;
-      }
-
-      case BC_INST_REL_LE:
-      {
-        cond = cmp <= 0;
-        break;
-      }
-
-      case BC_INST_REL_GE:
-      {
-        cond = cmp >= 0;
-        break;
-      }
-
-      case BC_INST_REL_NE:
-      {
-        cond = cmp != 0;
-        break;
-      }
-
-      case BC_INST_REL_LT:
-      {
-        cond = cmp < 0;
-        break;
-      }
-
-      case BC_INST_REL_GT:
-      {
-        cond = cmp > 0;
-        break;
-      }
+      case BC_INST_REL_EQ: cond = cmp == 0; break;
+      case BC_INST_REL_LE: cond = cmp <= 0; break;
+      case BC_INST_REL_GE: cond = cmp >= 0; break;
+      case BC_INST_REL_NE: cond = cmp != 0; break;
+      case BC_INST_REL_LT: cond = cmp < 0; break;
+      case BC_INST_REL_GT: cond = cmp > 0; break;
     }
   }
 
@@ -5111,7 +4791,7 @@ static BcStatus bc_program_assign(BcProgram *p, char inst) {
 
     size_t *ptr;
     unsigned long val, max, min;
-    BcError e;
+    enum BcError e;
 
     s = bc_num_ulong(l, &val);
     if (s) return s;
@@ -5123,7 +4803,7 @@ static BcStatus bc_program_assign(BcProgram *p, char inst) {
       ptr = &p->scale;
     }
     else {
-      max = ib ? TT.max_ibase : BC_MAX_OBASE;
+      max = ib ? 36 : BC_MAX_OBASE;
       min = 2;
       ptr = ib ? &p->ib_t : &p->ob_t;
     }
@@ -5389,18 +5069,6 @@ static void bc_program_pushGlobal(BcProgram *p, char inst) {
   bc_vec_push(&p->results, &res);
 }
 
-void bc_program_free(BcProgram *p) {
-  bc_vec_free(&p->fns);
-  bc_vec_free(&p->fn_map);
-  bc_vec_free(&p->vars);
-  bc_vec_free(&p->var_map);
-  bc_vec_free(&p->arrs);
-  bc_vec_free(&p->arr_map);
-  bc_vec_free(&p->results);
-  bc_vec_free(&p->stack);
-  bc_num_free(&p->last);
-}
-
 void bc_program_init(BcProgram *p) {
 
   BcInstPtr ip;
@@ -5480,7 +5148,7 @@ BcStatus bc_program_reset(BcProgram *p, BcStatus s) {
   TT.sig = 0;
 
   if (!s || s == BC_STATUS_SIGNAL) {
-    if (BC_TTYIN) {
+    if (FLAG(i)) {
       fputs(bc_program_ready_msg, stderr);
       fflush(stderr);
       s = BC_STATUS_SUCCESS;
@@ -5504,62 +5172,48 @@ BcStatus bc_program_exec(BcProgram *p) {
 
   while (!s && ip->idx < func->code.len) {
 
-    char inst = (char) code[(ip->idx)++];
+    char inst = code[(ip->idx)++];
 
     switch (inst) {
 
       case BC_INST_JUMP_ZERO:
-      {
         s = bc_program_prep(p, &ptr, &num);
         if (s) return s;
         cond = !BC_NUM_CMP_ZERO(num);
         bc_vec_pop(&p->results);
-      }
       // Fallthrough.
       case BC_INST_JUMP:
-      {
         size_t *addr;
         idx = bc_program_index(code, &ip->idx);
         addr = bc_vec_item(&func->labels, idx);
         if (inst == BC_INST_JUMP || cond) ip->idx = *addr;
         break;
-      }
 
       case BC_INST_CALL:
-      {
         s = bc_program_call(p, code, &ip->idx);
         break;
-      }
 
       case BC_INST_INC_PRE:
       case BC_INST_DEC_PRE:
       case BC_INST_INC_POST:
       case BC_INST_DEC_POST:
-      {
         s = bc_program_incdec(p, inst);
         break;
-      }
 
       case BC_INST_HALT:
-      {
         s = BC_STATUS_QUIT;
         break;
-      }
 
       case BC_INST_RET:
       case BC_INST_RET0:
       case BC_INST_RET_VOID:
-      {
         s = bc_program_return(p, inst);
         break;
-      }
 
       case BC_INST_LAST:
-      {
         r.t = BC_RESULT_LAST;
         bc_vec_push(&p->results, &r);
         break;
-      }
 
       case BC_INST_BOOL_OR:
       case BC_INST_BOOL_AND:
@@ -5569,76 +5223,56 @@ BcStatus bc_program_exec(BcProgram *p) {
       case BC_INST_REL_NE:
       case BC_INST_REL_LT:
       case BC_INST_REL_GT:
-      {
         s = bc_program_logical(p, inst);
         break;
-      }
 
       case BC_INST_READ:
-      {
         s = bc_program_read(p);
         break;
-      }
 
       case BC_INST_VAR:
-      {
         s = bc_program_pushVar(p, code, &ip->idx);
         break;
-      }
 
       case BC_INST_ARRAY_ELEM:
       case BC_INST_ARRAY:
-      {
         s = bc_program_pushArray(p, code, &ip->idx, inst);
         break;
-      }
 
       case BC_INST_IBASE:
       case BC_INST_SCALE:
       case BC_INST_OBASE:
-      {
         bc_program_pushGlobal(p, inst);
         break;
-      }
 
       case BC_INST_LENGTH:
       case BC_INST_SCALE_FUNC:
       case BC_INST_SQRT:
       case BC_INST_ABS:
-      {
         s = bc_program_builtin(p, inst);
         break;
-      }
 
       case BC_INST_NUM:
-      {
         r.t = BC_RESULT_CONSTANT;
         r.d.id.len = bc_program_index(code, &ip->idx);
         bc_vec_push(&p->results, &r);
         break;
-      }
 
       case BC_INST_POP:
-      {
         bc_vec_pop(&p->results);
         break;
-      }
 
       case BC_INST_PRINT:
       case BC_INST_PRINT_POP:
       case BC_INST_PRINT_STR:
-      {
         s = bc_program_print(p, inst, 0);
         break;
-      }
 
       case BC_INST_STR:
-      {
         r.t = BC_RESULT_STR;
         r.d.id.len = bc_program_index(code, &ip->idx);
         bc_vec_push(&p->results, &r);
         break;
-      }
 
       case BC_INST_POWER:
       case BC_INST_MULTIPLY:
@@ -5646,17 +5280,13 @@ BcStatus bc_program_exec(BcProgram *p) {
       case BC_INST_MODULUS:
       case BC_INST_PLUS:
       case BC_INST_MINUS:
-      {
         s = bc_program_op(p, inst);
         break;
-      }
 
       case BC_INST_NEG:
       case BC_INST_BOOL_NOT:
-      {
         s = bc_program_unary(p, inst);
         break;
-      }
 
       case BC_INST_ASSIGN_POWER:
       case BC_INST_ASSIGN_MULTIPLY:
@@ -5665,10 +5295,8 @@ BcStatus bc_program_exec(BcProgram *p) {
       case BC_INST_ASSIGN_PLUS:
       case BC_INST_ASSIGN_MINUS:
       case BC_INST_ASSIGN:
-      {
         s = bc_program_assign(p, inst);
         break;
-      }
     }
 
     if ((s && s != BC_STATUS_QUIT) || TT.sig) s = bc_program_reset(p, s);
@@ -5682,9 +5310,9 @@ BcStatus bc_program_exec(BcProgram *p) {
   return s;
 }
 
-static void bc_vm_sig(int sig) {
+static void bc_vm_sig(int sig)
+{
   int err = errno;
-
   // If you run bc 2>/dev/full ctrl-C is ignored. Why? No idea.
   if (sig == SIGINT) {
     size_t len = strlen(bc_sig_msg);
@@ -5694,25 +5322,20 @@ static void bc_vm_sig(int sig) {
   errno = err;
 }
 
-void bc_vm_info(void) {
-  printf("%s %s\n", toys.which->name, "1.1.0");
-  fputs(bc_copyright, stdout);
-}
-
-static void bc_vm_printError(BcError e, char *fmt,
+static void bc_vm_printError(enum BcError e, char *fmt,
                              size_t line, va_list args)
 {
   // Make sure all of stdout is written first.
   fflush(stdout);
 
-  fprintf(stderr, fmt, bc_errs[(size_t) bc_err_ids[e]]);
+  fprintf(stderr, fmt, bc_errs[bc_err_ids[e]]);
   vfprintf(stderr, bc_err_msgs[e], args);
 
   // This is the condition for parsing vs runtime.
   // If line is not 0, it is parsing.
   if (line) {
     fprintf(stderr, "\n    %s", TT.file);
-    fprintf(stderr, bc_err_line, line);
+    fprintf(stderr, ":%zu", line);
   }
   else {
     BcInstPtr *ip = bc_vec_item_rev(&BC_VM->prog.stack, 0);
@@ -5724,30 +5347,17 @@ static void bc_vm_printError(BcError e, char *fmt,
   fflush(stderr);
 }
 
-BcStatus bc_vm_error(BcError e, size_t line, ...) {
-
+BcStatus bc_vm_error(enum BcError e, size_t line, ...)
+{
   va_list args;
 
   va_start(args, line);
-  bc_vm_printError(e, bc_err_fmt, line, args);
+  bc_vm_printError(e, "\n%s error:", line, args);
   va_end(args);
 
   return BC_STATUS_ERROR;
 }
 
-BcStatus bc_vm_posixError(BcError e, size_t line, ...) {
-
-  va_list args;
-
-  if (!(FLAG(s) || FLAG(w))) return BC_STATUS_SUCCESS;
-
-  va_start(args, line);
-  bc_vm_printError(e, FLAG(s) ? bc_err_fmt : bc_warn_fmt, line, args);
-  va_end(args);
-
-  return FLAG(s) ? BC_STATUS_ERROR : BC_STATUS_SUCCESS;
-}
-
 static void bc_vm_clean()
 {
   BcProgram *prog = &BC_VM->prog;
@@ -5768,7 +5378,6 @@ static void bc_vm_clean()
 }
 
 static BcStatus bc_vm_process(char *text, int is_stdin) {
-
   BcStatus s;
   uint16_t *flags;
 
@@ -5817,7 +5426,6 @@ err:
 }
 
 static BcStatus bc_vm_stdin(void) {
-
   BcStatus s = BC_STATUS_SUCCESS;
   BcVec buf, buffer;
   size_t string = 0;
@@ -5825,8 +5433,8 @@ static BcStatus bc_vm_stdin(void) {
 
   bc_lex_file(&BC_VM->prs.l, "<stdin>");
 
-  bc_vec_init(&buffer, sizeof(char), NULL);
-  bc_vec_init(&buf, sizeof(char), NULL);
+  bc_vec_init(&buffer, 1, NULL);
+  bc_vec_init(&buf, 1, NULL);
   bc_vec_pushByte(&buffer, '\0');
 
   // This loop is complex because the vm tries not to send any lines that end
@@ -5849,7 +5457,7 @@ static BcStatus bc_vm_stdin(void) {
     for (i = 0; i < len; ++i) {
 
       int notend = len > i + 1;
-      char c = (char) str[i];
+      char c = str[i];
 
       if (!comment && (i - 1 > len || str[i - 1] != '\\')) string ^= c == '"';
 
@@ -5909,8 +5517,7 @@ void bc_main(void)
   sigaction(SIGQUIT, &sa, NULL);
 
   TT.line_len = 69;
-  ss = getenv("BC_LINE_LENGTH");
-  if (ss) {
+  if ((ss = getenv("BC_LINE_LENGTH"))) {
     int len = atoi(ss);
     if (len>=2 && len <= UINT16_MAX) TT.line_len = len;
   }
@@ -5919,17 +5526,19 @@ void bc_main(void)
   bc_program_init(&BC_VM->prog);
   bc_parse_init(&BC_VM->prs, &BC_VM->prog, BC_PROG_MAIN);
 
-  if (getenv("POSIXLY_CORRECT")) toys.optflags |= FLAG_s;
-  toys.optflags |= isatty(0) ? BC_FLAG_TTYIN : 0;
-  toys.optflags |= BC_TTYIN && isatty(1) ? FLAG_i : 0;
+  toys.optflags |= isatty(0) ? FLAG_i : 0;
+  toys.optflags |= FLAG(i) && isatty(1) ? FLAG_i : 0;
 
-  TT.max_ibase = !FLAG(s) && !FLAG(w) ? 16 : 36;
-
-  if (FLAG(i) && !(toys.optflags & FLAG_q)) bc_vm_info();
+  if (FLAG(i) && !(toys.optflags & FLAG_q)) {
+    printf("%s 1.1.0\n", toys.which->name);
+    puts("Copyright (c) 2018 Gavin D. Howard and contributors\n"
+  "Report bugs at: https://github.com/gavinhoward/bc\n";
+  "This is free software with ABSOLUTELY NO WARRANTY.");
+  }
 
   // load -l library (if any)
   if (FLAG(l)) {
-    bc_lex_file(&BC_VM->prs.l, bc_lib_name);
+    bc_lex_file(&BC_VM->prs.l, "");
     s = bc_parse_text(&BC_VM->prs, bc_lib);
 
     while (!s && BC_VM->prs.l.t != BC_LEX_EOF) s = bc_parse_parse(&BC_VM->prs);
@@ -5944,7 +5553,15 @@ void bc_main(void)
   }
 
   if (CFG_TOYBOX_FREE) {
-    bc_program_free(&BC_VM->prog);
+    bc_vec_free(&BC_VM->prog.fns);
+    bc_vec_free(&BC_VM->prog.fn_map);
+    bc_vec_free(&BC_VM->prog.vars);
+    bc_vec_free(&BC_VM->prog.var_map);
+    bc_vec_free(&BC_VM->prog.arrs);
+    bc_vec_free(&BC_VM->prog.arr_map);
+    bc_vec_free(&BC_VM->prog.results);
+    bc_vec_free(&BC_VM->prog.stack);
+    bc_num_free(&BC_VM->prog.last);
     bc_parse_free(&BC_VM->prs);
     free(TT.vm);
   }
-- 
2.44.0

_______________________________________________
Toybox mailing list
Toybox@lists.landley.net
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to