From ecb62edd478e8ae2b1a5f3d122e316345909a805 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 25 Dec 2018 22:32:41 +0100 Subject: bc: fold struct BcLex into BcParse Signed-off-by: Denys Vlasenko --- miscutils/bc.c | 529 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 262 insertions(+), 267 deletions(-) (limited to 'miscutils') diff --git a/miscutils/bc.c b/miscutils/bc.c index 44d4976cc..61fb24304 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c @@ -710,7 +710,7 @@ dc_LEX_to_INST[] = { // starts at XC_LEX_OP_POWER // corresponding XC/DC_L }; #endif // ENABLE_DC -typedef struct BcLex { +typedef struct BcParse { smallint lex; // was BcLexType // first member is most used smallint lex_last; // was BcLexType bool lex_newline; @@ -719,14 +719,9 @@ typedef struct BcLex { size_t lex_len; const char *lex_inbuf; const char *lex_next_at; // last lex_next() was called at this string + const char *lex_filename; + FILE *lex_input_fp; BcVec lex_strnumbuf; -} BcLex; - -typedef struct BcParse { - BcLex l; // first member is most used - - const char *filename; - FILE *input_fp; BcFunc *func; size_t fidx; @@ -937,12 +932,12 @@ static void quit(void) static void bc_verror_msg(const char *fmt, va_list p) { const char *sv = sv; // for compiler - if (G.prs.filename) { + if (G.prs.lex_filename) { sv = applet_name; - applet_name = xasprintf("%s: %s:%u", applet_name, G.prs.filename, G.err_line); + applet_name = xasprintf("%s: %s:%u", applet_name, G.prs.lex_filename, G.err_line); } bb_verror_msg(fmt, p, NULL); - if (G.prs.filename) { + if (G.prs.lex_filename) { free((char*)applet_name); applet_name = sv; } @@ -2582,12 +2577,12 @@ static void bc_read_line(BcVec *vec, FILE *fp) if (bad_chars) { // Bad chars on this line - if (!G.prs.filename) { // stdin + if (!G.prs.lex_filename) { // stdin // ignore entire line, get another one vec->len = len; goto again; } - bb_perror_msg_and_die("file '%s' is not text", G.prs.filename); + bb_perror_msg_and_die("file '%s' is not text", G.prs.lex_filename); } bc_vec_pushZeroByte(vec); } @@ -2751,39 +2746,39 @@ static BC_STATUS zbc_num_parse(BcNum *n, const char *val, unsigned base_t) static void bc_lex_lineComment(void) { - BcLex *l = &G.prs.l; + BcParse *p = &G.prs; // Try: echo -n '#foo' | bc size_t i; - l->lex = XC_LEX_WHITESPACE; - i = l->lex_i; - while (i < l->lex_len && l->lex_inbuf[i] != '\n') + p->lex = XC_LEX_WHITESPACE; + i = p->lex_i; + while (i < p->lex_len && p->lex_inbuf[i] != '\n') i++; - l->lex_i = i; + p->lex_i = i; } static void bc_lex_whitespace(void) { - BcLex *l = &G.prs.l; - l->lex = XC_LEX_WHITESPACE; + BcParse *p = &G.prs; + p->lex = XC_LEX_WHITESPACE; for (;;) { - char c = l->lex_inbuf[l->lex_i]; + char c = p->lex_inbuf[p->lex_i]; if (c == '\n') // this is XC_LEX_NLINE, not XC_LEX_WHITESPACE break; if (!isspace(c)) break; - l->lex_i++; + p->lex_i++; } } static BC_STATUS zbc_lex_number(char start) { - BcLex *l = &G.prs.l; - const char *buf = l->lex_inbuf + l->lex_i; + BcParse *p = &G.prs; + const char *buf = p->lex_inbuf + p->lex_i; size_t len, i, ccnt; bool pt; pt = (start == '.'); - l->lex = XC_LEX_NUMBER; + p->lex = XC_LEX_NUMBER; ccnt = i = 0; for (;;) { char c = buf[i]; @@ -2808,7 +2803,7 @@ static BC_STATUS zbc_lex_number(char start) //ccnt is the number of chars in the number string, excluding possible //trailing "[\].[\]" (with any number of \ repetitions). //i is buf[i] index of the first not-yet-parsed char after that. - l->lex_i += i; + p->lex_i += i; // This might overestimate the size, if there are "\"'s // in the number. Subtracting number_of_backslashes*2 correctly @@ -2823,9 +2818,9 @@ static BC_STATUS zbc_lex_number(char start) RETURN_STATUS(bc_error("number too long: must be [1,"BC_MAX_NUM_STR"]")); } - bc_vec_pop_all(&l->lex_strnumbuf); - bc_vec_expand(&l->lex_strnumbuf, 1 + len); - bc_vec_push(&l->lex_strnumbuf, &start); + bc_vec_pop_all(&p->lex_strnumbuf); + bc_vec_expand(&p->lex_strnumbuf, 1 + len); + bc_vec_push(&p->lex_strnumbuf, &start); while (ccnt != 0) { // If we have hit a backslash, skip it. We don't have @@ -2835,12 +2830,12 @@ static BC_STATUS zbc_lex_number(char start) ccnt -= 2; continue; } - bc_vec_push(&l->lex_strnumbuf, buf); + bc_vec_push(&p->lex_strnumbuf, buf); buf++; ccnt--; } - bc_vec_pushZeroByte(&l->lex_strnumbuf); + bc_vec_pushZeroByte(&p->lex_strnumbuf); RETURN_STATUS(BC_STATUS_SUCCESS); } @@ -2848,14 +2843,14 @@ static BC_STATUS zbc_lex_number(char start) static void bc_lex_name(void) { - BcLex *l = &G.prs.l; + BcParse *p = &G.prs; size_t i; const char *buf; - l->lex = XC_LEX_NAME; + p->lex = XC_LEX_NAME; i = 0; - buf = l->lex_inbuf + l->lex_i - 1; + buf = p->lex_inbuf + p->lex_i - 1; for (;;) { char c = buf[i]; if ((c < 'a' || c > 'z') && !isdigit(c) && c != '_') break; @@ -2869,33 +2864,33 @@ static void bc_lex_name(void) return bc_error("name too long: must be [1,"BC_MAX_STRING_STR"]"); } #endif - bc_vec_string(&l->lex_strnumbuf, i, buf); + bc_vec_string(&p->lex_strnumbuf, i, buf); // Increment the index. We minus 1 because it has already been incremented. - l->lex_i += i - 1; + p->lex_i += i - 1; //return BC_STATUS_SUCCESS; } static void bc_lex_init(void) { - bc_char_vec_init(&G.prs.l.lex_strnumbuf); + bc_char_vec_init(&G.prs.lex_strnumbuf); } static void bc_lex_free(void) { - bc_vec_free(&G.prs.l.lex_strnumbuf); + bc_vec_free(&G.prs.lex_strnumbuf); } static void bc_lex_file(void) { - G.err_line = G.prs.l.lex_line = 1; - G.prs.l.lex_newline = false; + G.err_line = G.prs.lex_line = 1; + G.prs.lex_newline = false; } static bool bc_lex_more_input(void) { - BcLex *l = &G.prs.l; + BcParse *p = &G.prs; size_t str; bool comment; @@ -2911,7 +2906,7 @@ static bool bc_lex_more_input(void) size_t prevlen = G.input_buffer.len; char *string; - bc_read_line(&G.input_buffer, G.prs.input_fp); + bc_read_line(&G.input_buffer, G.prs.lex_input_fp); // No more input means EOF if (G.input_buffer.len <= prevlen + 1) // (we expect +1 for NUL byte) break; @@ -2958,12 +2953,12 @@ static bool bc_lex_more_input(void) break; } - l->lex_inbuf = G.input_buffer.v; - l->lex_i = 0; + p->lex_inbuf = G.input_buffer.v; + p->lex_i = 0; // bb_error_msg("G.input_buffer.len:%d '%s'", G.input_buffer.len, G.input_buffer.v); - l->lex_len = G.input_buffer.len - 1; // do not include NUL + p->lex_len = G.input_buffer.len - 1; // do not include NUL - return l->lex_len != 0; + return p->lex_len != 0; } IF_BC(static BC_STATUS zbc_lex_token(void);) @@ -2973,43 +2968,43 @@ IF_DC(static BC_STATUS zdc_lex_token(void);) static BC_STATUS zbc_lex_next(void) { - BcLex *l = &G.prs.l; + BcParse *p = &G.prs; BcStatus s; - l->lex_last = l->lex; - if (l->lex_last == XC_LEX_EOF) RETURN_STATUS(bc_error("end of file")); + p->lex_last = p->lex; + if (p->lex_last == XC_LEX_EOF) RETURN_STATUS(bc_error("end of file")); - l->lex_line += l->lex_newline; - G.err_line = l->lex_line; - l->lex_newline = false; + p->lex_line += p->lex_newline; + G.err_line = p->lex_line; + p->lex_newline = false; // Loop until failure or we don't have whitespace. This // is so the parser doesn't get inundated with whitespace. // Comments are also XC_LEX_WHITESPACE tokens and eaten here. s = BC_STATUS_SUCCESS; do { - if (l->lex_i == l->lex_len) { - l->lex = XC_LEX_EOF; - if (!G.prs.input_fp) + if (p->lex_i == p->lex_len) { + p->lex = XC_LEX_EOF; + if (!G.prs.lex_input_fp) RETURN_STATUS(BC_STATUS_SUCCESS); if (!bc_lex_more_input()) { - G.prs.input_fp = NULL; + G.prs.lex_input_fp = NULL; RETURN_STATUS(BC_STATUS_SUCCESS); } - // here it's guaranteed that l->lex_i is below l->lex_len + // here it's guaranteed that p->lex_i is below p->lex_len } - l->lex_next_at = l->lex_inbuf + l->lex_i; + p->lex_next_at = p->lex_inbuf + p->lex_i; dbg_lex("next string to parse:'%.*s'", - (int)(strchrnul(l->lex_next_at, '\n') - l->lex_next_at), - l->lex_next_at + (int)(strchrnul(p->lex_next_at, '\n') - p->lex_next_at), + p->lex_next_at ); if (IS_BC) { IF_BC(s = zbc_lex_token()); } else { IF_DC(s = zdc_lex_token()); } - } while (!s && l->lex == XC_LEX_WHITESPACE); - dbg_lex("l->lex from string:%d", l->lex); + } while (!s && p->lex == XC_LEX_WHITESPACE); + dbg_lex("p->lex from string:%d", p->lex); RETURN_STATUS(s); } @@ -3018,7 +3013,7 @@ static BC_STATUS zbc_lex_next(void) #if ENABLE_BC static BC_STATUS zbc_lex_skip_if_at_NLINE(void) { - if (G.prs.l.lex == XC_LEX_NLINE) + if (G.prs.lex == XC_LEX_NLINE) RETURN_STATUS(zbc_lex_next()); RETURN_STATUS(BC_STATUS_SUCCESS); } @@ -3038,10 +3033,10 @@ static BC_STATUS zbc_lex_next_and_skip_NLINE(void) static BC_STATUS zbc_lex_text_init(const char *text) { - G.prs.l.lex_inbuf = text; - G.prs.l.lex_i = 0; - G.prs.l.lex_len = strlen(text); - G.prs.l.lex = G.prs.l.lex_last = XC_LEX_INVALID; + G.prs.lex_inbuf = text; + G.prs.lex_i = 0; + G.prs.lex_len = strlen(text); + G.prs.lex = G.prs.lex_last = XC_LEX_INVALID; RETURN_STATUS(zbc_lex_next()); } #define zbc_lex_text_init(...) (zbc_lex_text_init(__VA_ARGS__) COMMA_SUCCESS) @@ -3049,10 +3044,10 @@ static BC_STATUS zbc_lex_text_init(const char *text) #if ENABLE_BC static BC_STATUS zbc_lex_identifier(void) { - BcLex *l = &G.prs.l; + BcParse *p = &G.prs; BcStatus s; unsigned i; - const char *buf = l->lex_inbuf + l->lex_i - 1; + const char *buf = p->lex_inbuf + p->lex_i - 1; for (i = 0; i < ARRAY_SIZE(bc_lex_kws); ++i) { const char *keyword8 = bc_lex_kws[i].name8; @@ -3067,21 +3062,21 @@ static BC_STATUS zbc_lex_identifier(void) // buf starts with keyword bc_lex_kws[i] if (isalnum(buf[j]) || buf[j]=='_') continue; // "ifz" does not match "if" keyword, "if." does - l->lex = BC_LEX_KEY_1st_keyword + i; + p->lex = BC_LEX_KEY_1st_keyword + i; if (!keyword_is_POSIX(i)) { s = zbc_posix_error_fmt("%sthe '%.8s' keyword", "POSIX does not allow ", bc_lex_kws[i].name8); if (s) RETURN_STATUS(s); } // We minus 1 because the index has already been incremented. - l->lex_i += j - 1; + p->lex_i += j - 1; RETURN_STATUS(BC_STATUS_SUCCESS); } bc_lex_name(); s = BC_STATUS_SUCCESS; - if (l->lex_strnumbuf.len > 2) { + if (p->lex_strnumbuf.len > 2) { // Prevent this: // >>> qwe=1 // bc: POSIX only allows one character names; this is bad: 'qwe=1 @@ -3096,17 +3091,17 @@ static BC_STATUS zbc_lex_identifier(void) static BC_STATUS zbc_lex_string(void) { - BcLex *l = &G.prs.l; + BcParse *p = &G.prs; size_t len, nls, i; - l->lex = XC_LEX_STR; + p->lex = XC_LEX_STR; nls = 0; - i = l->lex_i; + i = p->lex_i; for (;;) { - char c = l->lex_inbuf[i]; + char c = p->lex_inbuf[i]; if (c == '\0') { - l->lex_i = i; + p->lex_i = i; RETURN_STATUS(bc_error("unterminated string")); } if (c == '"') @@ -3115,17 +3110,17 @@ static BC_STATUS zbc_lex_string(void) i++; } - len = i - l->lex_i; + len = i - p->lex_i; // This check makes sense only if size_t is (much) larger than BC_MAX_STRING. if (SIZE_MAX > (BC_MAX_STRING | 0xff)) { if (len > BC_MAX_STRING) RETURN_STATUS(bc_error("string too long: must be [1,"BC_MAX_STRING_STR"]")); } - bc_vec_string(&l->lex_strnumbuf, len, l->lex_inbuf + l->lex_i); + bc_vec_string(&p->lex_strnumbuf, len, p->lex_inbuf + p->lex_i); - l->lex_i = i + 1; - l->lex_line += nls; - G.err_line = l->lex_line; + p->lex_i = i + 1; + p->lex_line += nls; + G.err_line = p->lex_line; RETURN_STATUS(BC_STATUS_SUCCESS); } @@ -3133,24 +3128,24 @@ static BC_STATUS zbc_lex_string(void) static void bc_lex_assign(unsigned with_and_without) { - BcLex *l = &G.prs.l; - if (l->lex_inbuf[l->lex_i] == '=') { - l->lex_i++; + BcParse *p = &G.prs; + if (p->lex_inbuf[p->lex_i] == '=') { + p->lex_i++; with_and_without >>= 8; // store "with" value } // else store "without" value - l->lex = (with_and_without & 0xff); + p->lex = (with_and_without & 0xff); } #define bc_lex_assign(with, without) \ bc_lex_assign(((with)<<8)|(without)) static BC_STATUS zbc_lex_comment(void) { - BcLex *l = &G.prs.l; + BcParse *p = &G.prs; size_t i, nls = 0; - const char *buf = l->lex_inbuf; + const char *buf = p->lex_inbuf; - l->lex = XC_LEX_WHITESPACE; - i = l->lex_i; /* here buf[l->lex_i] is the '*' of opening comment delimiter */ + p->lex = XC_LEX_WHITESPACE; + i = p->lex_i; /* here buf[p->lex_i] is the '*' of opening comment delimiter */ for (;;) { char c = buf[++i]; check_star: @@ -3161,15 +3156,15 @@ static BC_STATUS zbc_lex_comment(void) goto check_star; } if (c == '\0') { - l->lex_i = i; + p->lex_i = i; RETURN_STATUS(bc_error("unterminated comment")); } nls += (c == '\n'); } - l->lex_i = i + 1; - l->lex_line += nls; - G.err_line = l->lex_line; + p->lex_i = i + 1; + p->lex_line += nls; + G.err_line = p->lex_line; RETURN_STATUS(BC_STATUS_SUCCESS); } @@ -3178,20 +3173,20 @@ static BC_STATUS zbc_lex_comment(void) #undef zbc_lex_token static BC_STATUS zbc_lex_token(void) { - BcLex *l = &G.prs.l; + BcParse *p = &G.prs; BcStatus s = BC_STATUS_SUCCESS; - char c = l->lex_inbuf[l->lex_i++], c2; + char c = p->lex_inbuf[p->lex_i++], c2; // This is the workhorse of the lexer. switch (c) { // case '\0': // probably never reached -// l->lex_i--; -// l->lex = XC_LEX_EOF; -// l->lex_newline = true; +// p->lex_i--; +// p->lex = XC_LEX_EOF; +// p->lex_newline = true; // break; case '\n': - l->lex = XC_LEX_NLINE; - l->lex_newline = true; + p->lex = XC_LEX_NLINE; + p->lex_newline = true; break; case '\t': case '\v': @@ -3202,7 +3197,7 @@ static BC_STATUS zbc_lex_token(void) break; case '!': bc_lex_assign(XC_LEX_OP_REL_NE, BC_LEX_OP_BOOL_NOT); - if (l->lex == BC_LEX_OP_BOOL_NOT) { + if (p->lex == BC_LEX_OP_BOOL_NOT) { s = zbc_POSIX_does_not_allow_bool_ops_this_is_bad("!"); if (s) RETURN_STATUS(s); } @@ -3219,53 +3214,53 @@ static BC_STATUS zbc_lex_token(void) bc_lex_assign(BC_LEX_OP_ASSIGN_MODULUS, XC_LEX_OP_MODULUS); break; case '&': - c2 = l->lex_inbuf[l->lex_i]; + c2 = p->lex_inbuf[p->lex_i]; if (c2 == '&') { s = zbc_POSIX_does_not_allow_bool_ops_this_is_bad("&&"); if (s) RETURN_STATUS(s); - l->lex_i++; - l->lex = BC_LEX_OP_BOOL_AND; + p->lex_i++; + p->lex = BC_LEX_OP_BOOL_AND; } else { - l->lex = XC_LEX_INVALID; + p->lex = XC_LEX_INVALID; s = bc_error_bad_character('&'); } break; case '(': case ')': - l->lex = (BcLexType)(c - '(' + BC_LEX_LPAREN); + p->lex = (BcLexType)(c - '(' + BC_LEX_LPAREN); break; case '*': bc_lex_assign(BC_LEX_OP_ASSIGN_MULTIPLY, XC_LEX_OP_MULTIPLY); break; case '+': - c2 = l->lex_inbuf[l->lex_i]; + c2 = p->lex_inbuf[p->lex_i]; if (c2 == '+') { - l->lex_i++; - l->lex = BC_LEX_OP_INC; + p->lex_i++; + p->lex = BC_LEX_OP_INC; } else bc_lex_assign(BC_LEX_OP_ASSIGN_PLUS, XC_LEX_OP_PLUS); break; case ',': - l->lex = BC_LEX_COMMA; + p->lex = BC_LEX_COMMA; break; case '-': - c2 = l->lex_inbuf[l->lex_i]; + c2 = p->lex_inbuf[p->lex_i]; if (c2 == '-') { - l->lex_i++; - l->lex = BC_LEX_OP_DEC; + p->lex_i++; + p->lex = BC_LEX_OP_DEC; } else bc_lex_assign(BC_LEX_OP_ASSIGN_MINUS, XC_LEX_OP_MINUS); break; case '.': - if (isdigit(l->lex_inbuf[l->lex_i])) + if (isdigit(p->lex_inbuf[p->lex_i])) s = zbc_lex_number(c); else { - l->lex = BC_LEX_KEY_LAST; + p->lex = BC_LEX_KEY_LAST; s = zbc_POSIX_does_not_allow("'.' as 'last'"); } break; case '/': - c2 = l->lex_inbuf[l->lex_i]; + c2 = p->lex_inbuf[p->lex_i]; if (c2 == '*') s = zbc_lex_comment(); else @@ -3290,7 +3285,7 @@ static BC_STATUS zbc_lex_token(void) s = zbc_lex_number(c); break; case ';': - l->lex = BC_LEX_SCOLON; + p->lex = BC_LEX_SCOLON; break; case '<': bc_lex_assign(XC_LEX_OP_REL_LE, XC_LEX_OP_REL_LT); @@ -3303,12 +3298,12 @@ static BC_STATUS zbc_lex_token(void) break; case '[': case ']': - l->lex = (BcLexType)(c - '[' + BC_LEX_LBRACKET); + p->lex = (BcLexType)(c - '[' + BC_LEX_LBRACKET); break; case '\\': - if (l->lex_inbuf[l->lex_i] == '\n') { - l->lex = XC_LEX_WHITESPACE; - l->lex_i++; + if (p->lex_inbuf[p->lex_i] == '\n') { + p->lex = XC_LEX_WHITESPACE; + p->lex_i++; } else s = bc_error_bad_character(c); break; @@ -3345,22 +3340,22 @@ static BC_STATUS zbc_lex_token(void) break; case '{': case '}': - l->lex = (BcLexType)(c - '{' + BC_LEX_LBRACE); + p->lex = (BcLexType)(c - '{' + BC_LEX_LBRACE); break; case '|': - c2 = l->lex_inbuf[l->lex_i]; + c2 = p->lex_inbuf[p->lex_i]; if (c2 == '|') { s = zbc_POSIX_does_not_allow_bool_ops_this_is_bad("||"); if (s) RETURN_STATUS(s); - l->lex_i++; - l->lex = BC_LEX_OP_BOOL_OR; + p->lex_i++; + p->lex = BC_LEX_OP_BOOL_OR; } else { - l->lex = XC_LEX_INVALID; + p->lex = XC_LEX_INVALID; s = bc_error_bad_character(c); } break; default: - l->lex = XC_LEX_INVALID; + p->lex = XC_LEX_INVALID; s = bc_error_bad_character(c); break; } @@ -3373,16 +3368,16 @@ static BC_STATUS zbc_lex_token(void) #if ENABLE_DC static BC_STATUS zdc_lex_register(void) { - BcLex *l = &G.prs.l; - if (G_exreg && isspace(l->lex_inbuf[l->lex_i])) { + BcParse *p = &G.prs; + if (G_exreg && isspace(p->lex_inbuf[p->lex_i])) { bc_lex_whitespace(); // eats whitespace (but not newline) - l->lex_i++; // bc_lex_name() expects this + p->lex_i++; // bc_lex_name() expects this bc_lex_name(); } else { - bc_vec_pop_all(&l->lex_strnumbuf); - bc_vec_push(&l->lex_strnumbuf, &l->lex_inbuf[l->lex_i++]); - bc_vec_pushZeroByte(&l->lex_strnumbuf); - l->lex = XC_LEX_NAME; + bc_vec_pop_all(&p->lex_strnumbuf); + bc_vec_push(&p->lex_strnumbuf, &p->lex_inbuf[p->lex_i++]); + bc_vec_pushZeroByte(&p->lex_strnumbuf); + p->lex = XC_LEX_NAME; } RETURN_STATUS(BC_STATUS_SUCCESS); @@ -3391,43 +3386,43 @@ static BC_STATUS zdc_lex_register(void) static BC_STATUS zdc_lex_string(void) { - BcLex *l = &G.prs.l; + BcParse *p = &G.prs; size_t depth, nls, i; - l->lex = XC_LEX_STR; - bc_vec_pop_all(&l->lex_strnumbuf); + p->lex = XC_LEX_STR; + bc_vec_pop_all(&p->lex_strnumbuf); nls = 0; depth = 1; - i = l->lex_i; + i = p->lex_i; for (;;) { - char c = l->lex_inbuf[i]; + char c = p->lex_inbuf[i]; if (c == '\0') { - l->lex_i = i; + p->lex_i = i; RETURN_STATUS(bc_error("string end could not be found")); } nls += (c == '\n'); - if (i == l->lex_i || l->lex_inbuf[i - 1] != '\\') { + if (i == p->lex_i || p->lex_inbuf[i - 1] != '\\') { if (c == '[') depth++; if (c == ']') if (--depth == 0) break; } - bc_vec_push(&l->lex_strnumbuf, &l->lex_inbuf[i]); + bc_vec_push(&p->lex_strnumbuf, &p->lex_inbuf[i]); i++; } i++; - bc_vec_pushZeroByte(&l->lex_strnumbuf); + bc_vec_pushZeroByte(&p->lex_strnumbuf); // This check makes sense only if size_t is (much) larger than BC_MAX_STRING. if (SIZE_MAX > (BC_MAX_STRING | 0xff)) { - if (i - l->lex_i > BC_MAX_STRING) + if (i - p->lex_i > BC_MAX_STRING) RETURN_STATUS(bc_error("string too long: must be [1,"BC_MAX_STRING_STR"]")); } - l->lex_i = i; - l->lex_line += nls; - G.err_line = l->lex_line; + p->lex_i = i; + p->lex_line += nls; + G.err_line = p->lex_line; RETURN_STATUS(BC_STATUS_SUCCESS); } @@ -3436,7 +3431,7 @@ static BC_STATUS zdc_lex_string(void) #undef zdc_lex_token static BC_STATUS zdc_lex_token(void) { - BcLex *l = &G.prs.l; + BcParse *p = &G.prs; static const //BcLexType - should be this type, but narrower type saves size: uint8_t dc_lex_regs[] = { @@ -3451,14 +3446,14 @@ static BC_STATUS zdc_lex_token(void) size_t i; for (i = 0; i < ARRAY_SIZE(dc_lex_regs); ++i) { - if (l->lex_last == dc_lex_regs[i]) + if (p->lex_last == dc_lex_regs[i]) RETURN_STATUS(zdc_lex_register()); } s = BC_STATUS_SUCCESS; - c = l->lex_inbuf[l->lex_i++]; + c = p->lex_inbuf[p->lex_i++]; if (c >= '%' && c <= '~' - && (l->lex = dc_char_to_LEX[c - '%']) != XC_LEX_INVALID + && (p->lex = dc_char_to_LEX[c - '%']) != XC_LEX_INVALID ) { RETURN_STATUS(s); } @@ -3466,7 +3461,7 @@ static BC_STATUS zdc_lex_token(void) // This is the workhorse of the lexer. switch (c) { // case '\0': // probably never reached -// l->lex = XC_LEX_EOF; +// p->lex = XC_LEX_EOF; // break; case '\n': // '\n' is XC_LEX_NLINE, not XC_LEX_WHITESPACE @@ -3477,34 +3472,34 @@ static BC_STATUS zdc_lex_token(void) // commands are not executed on pressing ). // IOW: typing "1p" should print "1" _at once_, // not after some more input. - l->lex = XC_LEX_NLINE; - l->lex_newline = true; + p->lex = XC_LEX_NLINE; + p->lex_newline = true; break; case '\t': case '\v': case '\f': case '\r': case ' ': - l->lex_newline = 0; // was (c == '\n') + p->lex_newline = 0; // was (c == '\n') bc_lex_whitespace(); break; case '!': - c2 = l->lex_inbuf[l->lex_i]; + c2 = p->lex_inbuf[p->lex_i]; if (c2 == '=') - l->lex = XC_LEX_OP_REL_NE; + p->lex = XC_LEX_OP_REL_NE; else if (c2 == '<') - l->lex = XC_LEX_OP_REL_LE; + p->lex = XC_LEX_OP_REL_LE; else if (c2 == '>') - l->lex = XC_LEX_OP_REL_GE; + p->lex = XC_LEX_OP_REL_GE; else RETURN_STATUS(bc_error_bad_character(c)); - l->lex_i++; + p->lex_i++; break; case '#': bc_lex_lineComment(); break; case '.': - if (isdigit(l->lex_inbuf[l->lex_i])) + if (isdigit(p->lex_inbuf[p->lex_i])) s = zbc_lex_number(c); else s = bc_error_bad_character(c); @@ -3531,7 +3526,7 @@ static BC_STATUS zdc_lex_token(void) s = zdc_lex_string(); break; default: - l->lex = XC_LEX_INVALID; + p->lex = XC_LEX_INVALID; s = bc_error_bad_character(c); break; } @@ -3593,7 +3588,7 @@ static void bc_parse_pushJUMP_ZERO(size_t idx) static BC_STATUS zbc_parse_pushSTR(void) { BcParse *p = &G.prs; - char *str = xstrdup(p->l.lex_strnumbuf.v); + char *str = xstrdup(p->lex_strnumbuf.v); bc_parse_push(XC_INST_STR); bc_parse_pushIndex(p->func->strs.len); @@ -3607,7 +3602,7 @@ static BC_STATUS zbc_parse_pushSTR(void) static void bc_parse_pushNUM(void) { BcParse *p = &G.prs; - char *num = xstrdup(p->l.lex_strnumbuf.v); + char *num = xstrdup(p->lex_strnumbuf.v); #if ENABLE_BC && ENABLE_DC size_t idx = bc_vec_push(IS_BC ? &p->func->consts : &G.prog.consts, &num); #elif ENABLE_BC @@ -3656,8 +3651,8 @@ static void bc_parse_reset(void) p->func = bc_program_func_BC_PROG_MAIN(); } - p->l.lex_i = p->l.lex_len; - p->l.lex = XC_LEX_EOF; + p->lex_i = p->lex_len; + p->lex = XC_LEX_EOF; IF_BC(bc_vec_pop_all(&p->exits);) IF_BC(bc_vec_pop_all(&p->conds);) @@ -3765,7 +3760,7 @@ static BC_STATUS zbc_parse_stmt_allow_NLINE_before(const char *after_X) // Same for "else", "while()", "for()". BcStatus s = zbc_lex_next_and_skip_NLINE(); if (s) RETURN_STATUS(s); - if (p->l.lex == XC_LEX_NLINE) + if (p->lex == XC_LEX_NLINE) RETURN_STATUS(bc_error_fmt("no statement after '%s'", after_X)); RETURN_STATUS(zbc_parse_stmt()); @@ -3825,20 +3820,20 @@ static BC_STATUS zbc_parse_params(uint8_t flags) BcStatus s; size_t nparams; - dbg_lex("%s:%d p->l.lex:%d", __func__, __LINE__, p->l.lex); + dbg_lex("%s:%d p->lex:%d", __func__, __LINE__, p->lex); flags = (flags & ~(BC_PARSE_PRINT | BC_PARSE_REL)) | BC_PARSE_ARRAY; s = zbc_lex_next(); if (s) RETURN_STATUS(s); nparams = 0; - if (p->l.lex != BC_LEX_RPAREN) { + if (p->lex != BC_LEX_RPAREN) { for (;;) { s = zbc_parse_expr(flags); if (s) RETURN_STATUS(s); nparams++; - if (p->l.lex != BC_LEX_COMMA) { - if (p->l.lex == BC_LEX_RPAREN) + if (p->lex != BC_LEX_COMMA) { + if (p->lex == BC_LEX_RPAREN) break; RETURN_STATUS(bc_error_bad_token()); } @@ -3867,7 +3862,7 @@ static BC_STATUS zbc_parse_call(char *name, uint8_t flags) s = zbc_parse_params(flags); if (s) goto err; - if (p->l.lex != BC_LEX_RPAREN) { + if (p->lex != BC_LEX_RPAREN) { s = bc_error_bad_token(); goto err; } @@ -3897,15 +3892,15 @@ static BC_STATUS zbc_parse_name(BcInst *type, uint8_t flags) BcStatus s; char *name; - name = xstrdup(p->l.lex_strnumbuf.v); + name = xstrdup(p->lex_strnumbuf.v); s = zbc_lex_next(); if (s) goto err; - if (p->l.lex == BC_LEX_LBRACKET) { + if (p->lex == BC_LEX_LBRACKET) { s = zbc_lex_next(); if (s) goto err; - if (p->l.lex == BC_LEX_RBRACKET) { + if (p->lex == BC_LEX_RBRACKET) { if (!(flags & BC_PARSE_ARRAY)) { s = bc_error_bad_expression(); goto err; @@ -3922,7 +3917,7 @@ static BC_STATUS zbc_parse_name(BcInst *type, uint8_t flags) bc_parse_push(*type); bc_parse_pushName(name); free(name); - } else if (p->l.lex == BC_LEX_LPAREN) { + } else if (p->lex == BC_LEX_LPAREN) { if (flags & BC_PARSE_NOCALL) { s = bc_error_bad_token(); goto err; @@ -3950,11 +3945,11 @@ static BC_STATUS zbc_parse_read(void) s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_LPAREN) RETURN_STATUS(bc_error_bad_token()); + if (p->lex != BC_LEX_LPAREN) RETURN_STATUS(bc_error_bad_token()); s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token()); + if (p->lex != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token()); bc_parse_push(XC_INST_READ); @@ -3969,7 +3964,7 @@ static BC_STATUS zbc_parse_builtin(BcLexType type, uint8_t flags, BcInst *prev) s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_LPAREN) RETURN_STATUS(bc_error_bad_token()); + if (p->lex != BC_LEX_LPAREN) RETURN_STATUS(bc_error_bad_token()); flags = (flags & ~(BC_PARSE_PRINT | BC_PARSE_REL)) | BC_PARSE_ARRAY; @@ -3979,7 +3974,7 @@ static BC_STATUS zbc_parse_builtin(BcLexType type, uint8_t flags, BcInst *prev) s = zbc_parse_expr(flags); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token()); + if (p->lex != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token()); *prev = (type == BC_LEX_KEY_LENGTH) ? XC_INST_LENGTH : XC_INST_SQRT; bc_parse_push(*prev); @@ -3996,7 +3991,7 @@ static BC_STATUS zbc_parse_scale(BcInst *type, uint8_t flags) s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_LPAREN) { + if (p->lex != BC_LEX_LPAREN) { *type = XC_INST_SCALE; bc_parse_push(XC_INST_SCALE); RETURN_STATUS(BC_STATUS_SUCCESS); @@ -4010,7 +4005,7 @@ static BC_STATUS zbc_parse_scale(BcInst *type, uint8_t flags) s = zbc_parse_expr(flags); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_RPAREN) + if (p->lex != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token()); bc_parse_push(XC_INST_SCALE_FUNC); @@ -4031,16 +4026,16 @@ static BC_STATUS zbc_parse_incdec(BcInst *prev, bool *paren_expr, || etype == XC_INST_SCALE || etype == BC_INST_LAST || etype == XC_INST_IBASE || etype == XC_INST_OBASE ) { - *prev = inst = BC_INST_INC_POST + (p->l.lex != BC_LEX_OP_INC); + *prev = inst = BC_INST_INC_POST + (p->lex != BC_LEX_OP_INC); bc_parse_push(inst); s = zbc_lex_next(); } else { - *prev = inst = BC_INST_INC_PRE + (p->l.lex != BC_LEX_OP_INC); + *prev = inst = BC_INST_INC_PRE + (p->lex != BC_LEX_OP_INC); *paren_expr = true; s = zbc_lex_next(); if (s) RETURN_STATUS(s); - type = p->l.lex; + type = p->lex; // Because we parse the next part of the expression // right here, we need to increment this. @@ -4059,7 +4054,7 @@ static BC_STATUS zbc_parse_incdec(BcInst *prev, bool *paren_expr, case BC_LEX_KEY_SCALE: s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (p->l.lex == BC_LEX_LPAREN) + if (p->lex == BC_LEX_LPAREN) s = bc_error_bad_token(); else bc_parse_push(XC_INST_SCALE); @@ -4128,7 +4123,7 @@ static BC_STATUS zbc_parse_print(void) for (;;) { s = zbc_lex_next(); if (s) RETURN_STATUS(s); - type = p->l.lex; + type = p->lex; if (type == XC_LEX_STR) { s = zbc_parse_pushSTR(); } else { @@ -4136,7 +4131,7 @@ static BC_STATUS zbc_parse_print(void) } if (s) RETURN_STATUS(s); bc_parse_push(XC_INST_PRINT_POP); - if (p->l.lex != BC_LEX_COMMA) + if (p->lex != BC_LEX_COMMA) break; } @@ -4154,7 +4149,7 @@ static BC_STATUS zbc_parse_return(void) s = zbc_lex_next(); if (s) RETURN_STATUS(s); - t = p->l.lex; + t = p->lex; if (t == XC_LEX_NLINE || t == BC_LEX_SCOLON) bc_parse_push(BC_INST_RET0); else { @@ -4166,7 +4161,7 @@ static BC_STATUS zbc_parse_return(void) } if (s) RETURN_STATUS(s); - if (!paren || p->l.lex_last != BC_LEX_RPAREN) { + if (!paren || p->lex_last != BC_LEX_RPAREN) { s = zbc_POSIX_requires("parentheses around return expressions"); if (s) RETURN_STATUS(s); } @@ -4195,13 +4190,13 @@ static BC_STATUS zbc_parse_if(void) dbg_lex_enter("%s:%d entered", __func__, __LINE__); s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_LPAREN) RETURN_STATUS(bc_error_bad_token()); + if (p->lex != BC_LEX_LPAREN) RETURN_STATUS(bc_error_bad_token()); s = zbc_lex_next(); if (s) RETURN_STATUS(s); s = zbc_parse_expr(BC_PARSE_REL); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token()); + if (p->lex != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token()); // Encode "if zero, jump to ..." // Pushed value (destination of the jump) is uninitialized, @@ -4212,8 +4207,8 @@ static BC_STATUS zbc_parse_if(void) s = zbc_parse_stmt_allow_NLINE_before(STRING_if); if (s) RETURN_STATUS(s); - dbg_lex("%s:%d in if after stmt: p->l.lex:%d", __func__, __LINE__, p->l.lex); - if (p->l.lex == BC_LEX_KEY_ELSE) { + dbg_lex("%s:%d in if after stmt: p->lex:%d", __func__, __LINE__, p->lex); + if (p->lex == BC_LEX_KEY_ELSE) { size_t ip2_idx; // Encode "after then_stmt, jump to end of if()" @@ -4247,7 +4242,7 @@ static BC_STATUS zbc_parse_while(void) s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_LPAREN) RETURN_STATUS(bc_error_bad_token()); + if (p->lex != BC_LEX_LPAREN) RETURN_STATUS(bc_error_bad_token()); s = zbc_lex_next(); if (s) RETURN_STATUS(s); @@ -4260,7 +4255,7 @@ static BC_STATUS zbc_parse_while(void) s = zbc_parse_expr(BC_PARSE_REL); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token()); + if (p->lex != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token()); bc_parse_pushJUMP_ZERO(ip_idx); @@ -4286,14 +4281,14 @@ static BC_STATUS zbc_parse_for(void) BcStatus s; size_t cond_idx, exit_idx, body_idx, update_idx; - dbg_lex("%s:%d p->l.lex:%d", __func__, __LINE__, p->l.lex); + dbg_lex("%s:%d p->lex:%d", __func__, __LINE__, p->lex); s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_LPAREN) RETURN_STATUS(bc_error_bad_token()); + if (p->lex != BC_LEX_LPAREN) RETURN_STATUS(bc_error_bad_token()); s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_SCOLON) { + if (p->lex != BC_LEX_SCOLON) { s = zbc_parse_expr(0); bc_parse_push(XC_INST_POP); if (s) RETURN_STATUS(s); @@ -4302,7 +4297,7 @@ static BC_STATUS zbc_parse_for(void) if (s) RETURN_STATUS(s); } - if (p->l.lex != BC_LEX_SCOLON) RETURN_STATUS(bc_error_bad_token()); + if (p->lex != BC_LEX_SCOLON) RETURN_STATUS(bc_error_bad_token()); s = zbc_lex_next(); if (s) RETURN_STATUS(s); @@ -4311,19 +4306,19 @@ static BC_STATUS zbc_parse_for(void) body_idx = update_idx + 1; exit_idx = body_idx + 1; - if (p->l.lex != BC_LEX_SCOLON) + if (p->lex != BC_LEX_SCOLON) s = zbc_parse_expr(BC_PARSE_REL); else { // Set this for the next call to bc_parse_pushNUM(). // This is safe to set because the current token is a semicolon, // which has no string requirement. - bc_vec_string(&p->l.lex_strnumbuf, 1, "1"); + bc_vec_string(&p->lex_strnumbuf, 1, "1"); bc_parse_pushNUM(); s = zbc_POSIX_does_not_allow_empty_X_expression_in_for("condition"); } if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_SCOLON) RETURN_STATUS(bc_error_bad_token()); + if (p->lex != BC_LEX_SCOLON) RETURN_STATUS(bc_error_bad_token()); s = zbc_lex_next(); if (s) RETURN_STATUS(s); @@ -4334,10 +4329,10 @@ static BC_STATUS zbc_parse_for(void) bc_vec_push(&p->conds, &update_idx); bc_vec_push(&p->func->labels, &p->func->code.len); - if (p->l.lex != BC_LEX_RPAREN) { + if (p->lex != BC_LEX_RPAREN) { s = zbc_parse_expr(0); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token()); + if (p->lex != BC_LEX_RPAREN) RETURN_STATUS(bc_error_bad_token()); bc_parse_push(XC_INST_POP); } else { s = zbc_POSIX_does_not_allow_empty_X_expression_in_for("update"); @@ -4415,37 +4410,37 @@ static BC_STATUS zbc_parse_funcdef(void) dbg_lex_enter("%s:%d entered", __func__, __LINE__); s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (p->l.lex != XC_LEX_NAME) + if (p->lex != XC_LEX_NAME) RETURN_STATUS(bc_error("bad function definition")); - name = xstrdup(p->l.lex_strnumbuf.v); + name = xstrdup(p->lex_strnumbuf.v); p->fidx = bc_program_addFunc(name); p->func = bc_program_func(p->fidx); s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_LPAREN) + if (p->lex != BC_LEX_LPAREN) RETURN_STATUS(bc_error("bad function definition")); s = zbc_lex_next(); if (s) RETURN_STATUS(s); - while (p->l.lex != BC_LEX_RPAREN) { - if (p->l.lex != XC_LEX_NAME) + while (p->lex != BC_LEX_RPAREN) { + if (p->lex != XC_LEX_NAME) RETURN_STATUS(bc_error("bad function definition")); ++p->func->nparams; - name = xstrdup(p->l.lex_strnumbuf.v); + name = xstrdup(p->lex_strnumbuf.v); s = zbc_lex_next(); if (s) goto err; - var = p->l.lex != BC_LEX_LBRACKET; + var = p->lex != BC_LEX_LBRACKET; if (!var) { s = zbc_lex_next(); if (s) goto err; - if (p->l.lex != BC_LEX_RBRACKET) { + if (p->lex != BC_LEX_RBRACKET) { s = bc_error("bad function definition"); goto err; } @@ -4454,7 +4449,7 @@ static BC_STATUS zbc_parse_funcdef(void) if (s) goto err; } - comma = p->l.lex == BC_LEX_COMMA; + comma = p->lex == BC_LEX_COMMA; if (comma) { s = zbc_lex_next(); if (s) goto err; @@ -4469,7 +4464,7 @@ static BC_STATUS zbc_parse_funcdef(void) s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (p->l.lex != BC_LEX_LBRACE) { + if (p->lex != BC_LEX_LBRACE) { s = zbc_POSIX_requires("the left brace be on the same line as the function header"); if (s) RETURN_STATUS(s); } @@ -4478,7 +4473,7 @@ static BC_STATUS zbc_parse_funcdef(void) s = zbc_lex_skip_if_at_NLINE(); if (s) RETURN_STATUS(s); //GNU bc requires a {} block even if function body has single stmt, enforce this? - if (p->l.lex != BC_LEX_LBRACE) + if (p->lex != BC_LEX_LBRACE) RETURN_STATUS(bc_error("function { body } expected")); p->in_funcdef++; // to determine whether "return" stmt is allowed, and such @@ -4514,19 +4509,19 @@ static BC_STATUS zbc_parse_auto(void) for (;;) { bool var; - if (p->l.lex != XC_LEX_NAME) + if (p->lex != XC_LEX_NAME) RETURN_STATUS(bc_error("bad 'auto' syntax")); - name = xstrdup(p->l.lex_strnumbuf.v); + name = xstrdup(p->lex_strnumbuf.v); s = zbc_lex_next(); if (s) goto err; - var = (p->l.lex != BC_LEX_LBRACKET); + var = (p->lex != BC_LEX_LBRACKET); if (!var) { s = zbc_lex_next(); if (s) goto err; - if (p->l.lex != BC_LEX_RBRACKET) { + if (p->lex != BC_LEX_RBRACKET) { s = bc_error("bad 'auto' syntax"); goto err; } @@ -4537,13 +4532,13 @@ static BC_STATUS zbc_parse_auto(void) s = zbc_func_insert(p->func, name, var); if (s) goto err; - if (p->l.lex == XC_LEX_NLINE - || p->l.lex == BC_LEX_SCOLON - //|| p->l.lex == BC_LEX_RBRACE // allow "define f() {auto a}" + if (p->lex == XC_LEX_NLINE + || p->lex == BC_LEX_SCOLON + //|| p->lex == BC_LEX_RBRACE // allow "define f() {auto a}" ) { break; } - if (p->l.lex != BC_LEX_COMMA) + if (p->lex != BC_LEX_COMMA) RETURN_STATUS(bc_error("bad 'auto' syntax")); s = zbc_lex_next(); // skip comma if (s) RETURN_STATUS(s); @@ -4564,29 +4559,29 @@ static BC_STATUS zbc_parse_stmt_possibly_auto(bool auto_allowed) BcParse *p = &G.prs; BcStatus s = BC_STATUS_SUCCESS; - dbg_lex_enter("%s:%d entered, p->l.lex:%d", __func__, __LINE__, p->l.lex); + dbg_lex_enter("%s:%d entered, p->lex:%d", __func__, __LINE__, p->lex); - if (p->l.lex == XC_LEX_NLINE) { + if (p->lex == XC_LEX_NLINE) { dbg_lex_done("%s:%d done (seen XC_LEX_NLINE)", __func__, __LINE__); RETURN_STATUS(zbc_lex_next()); } - if (p->l.lex == BC_LEX_SCOLON) { + if (p->lex == BC_LEX_SCOLON) { dbg_lex_done("%s:%d done (seen BC_LEX_SCOLON)", __func__, __LINE__); RETURN_STATUS(zbc_lex_next()); } - if (p->l.lex == BC_LEX_LBRACE) { + if (p->lex == BC_LEX_LBRACE) { dbg_lex("%s:%d BC_LEX_LBRACE: (auto_allowed:%d)", __func__, __LINE__, auto_allowed); do { s = zbc_lex_next(); if (s) RETURN_STATUS(s); - } while (p->l.lex == XC_LEX_NLINE); - if (auto_allowed && p->l.lex == BC_LEX_KEY_AUTO) { + } while (p->lex == XC_LEX_NLINE); + if (auto_allowed && p->lex == BC_LEX_KEY_AUTO) { dbg_lex("%s:%d calling zbc_parse_auto()", __func__, __LINE__); s = zbc_parse_auto(); if (s) RETURN_STATUS(s); } - while (p->l.lex != BC_LEX_RBRACE) { + while (p->lex != BC_LEX_RBRACE) { dbg_lex("%s:%d block parsing loop", __func__, __LINE__); s = zbc_parse_stmt(); if (s) RETURN_STATUS(s); @@ -4596,8 +4591,8 @@ static BC_STATUS zbc_parse_stmt_possibly_auto(bool auto_allowed) RETURN_STATUS(s); } - dbg_lex("%s:%d p->l.lex:%d", __func__, __LINE__, p->l.lex); - switch (p->l.lex) { + dbg_lex("%s:%d p->lex:%d", __func__, __LINE__, p->lex); + switch (p->lex) { case XC_LEX_OP_MINUS: case BC_LEX_OP_INC: case BC_LEX_OP_DEC: @@ -4620,7 +4615,7 @@ static BC_STATUS zbc_parse_stmt_possibly_auto(bool auto_allowed) break; case BC_LEX_KEY_BREAK: case BC_LEX_KEY_CONTINUE: - s = zbc_parse_break_or_continue(p->l.lex); + s = zbc_parse_break_or_continue(p->lex); break; case BC_LEX_KEY_FOR: s = zbc_parse_for(); @@ -4679,13 +4674,13 @@ static BC_STATUS zbc_parse_stmt_or_funcdef(void) BcStatus s; dbg_lex_enter("%s:%d entered", __func__, __LINE__); - if (p->l.lex == XC_LEX_EOF) + if (p->lex == XC_LEX_EOF) s = bc_error("end of file"); - else if (p->l.lex == BC_LEX_KEY_DEFINE) { - dbg_lex("%s:%d p->l.lex:BC_LEX_KEY_DEFINE", __func__, __LINE__); + else if (p->lex == BC_LEX_KEY_DEFINE) { + dbg_lex("%s:%d p->lex:BC_LEX_KEY_DEFINE", __func__, __LINE__); s = zbc_parse_funcdef(); } else { - dbg_lex("%s:%d p->l.lex:%d (not BC_LEX_KEY_DEFINE)", __func__, __LINE__, p->l.lex); + dbg_lex("%s:%d p->lex:%d (not BC_LEX_KEY_DEFINE)", __func__, __LINE__, p->lex); s = zbc_parse_stmt(); } @@ -4704,7 +4699,7 @@ static BcStatus bc_parse_expr_empty_ok(uint8_t flags) bool paren_first, paren_expr, rprn, assign, bin_last; dbg_lex_enter("%s:%d entered", __func__, __LINE__); - paren_first = (p->l.lex == BC_LEX_LPAREN); + paren_first = (p->lex == BC_LEX_LPAREN); nparens = nrelops = 0; paren_expr = rprn = assign = false; bin_last = true; @@ -4712,7 +4707,7 @@ static BcStatus bc_parse_expr_empty_ok(uint8_t flags) for (;;) { bool get_token; BcStatus s; - BcLexType t = p->l.lex; + BcLexType t = p->lex; if (!lex_allowed_in_bc_expr(t)) break; @@ -4923,9 +4918,9 @@ static BC_STATUS zdc_parse_register(void) s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (p->l.lex != XC_LEX_NAME) RETURN_STATUS(bc_error_bad_token()); + if (p->lex != XC_LEX_NAME) RETURN_STATUS(bc_error_bad_token()); - bc_parse_pushName(p->l.lex_strnumbuf.v); + bc_parse_pushName(p->lex_strnumbuf.v); RETURN_STATUS(s); } @@ -4939,7 +4934,7 @@ static void dc_parse_string(void) dbg_lex_enter("%s:%d entered", __func__, __LINE__); - str = xstrdup(p->l.lex_strnumbuf.v); + str = xstrdup(p->lex_strnumbuf.v); bc_parse_push(XC_INST_STR); bc_parse_pushIndex(len); bc_vec_push(&G.prog.strs, &str); @@ -4988,7 +4983,7 @@ static BC_STATUS zdc_parse_cond(uint8_t inst) // Note that 'else' part can not be on the next line: // echo -e '[1p]sa [2p]sb 2 1>a eb' | dc - OK, prints "2" // echo -e '[1p]sa [2p]sb 2 1>a\neb' | dc - parse error - if (p->l.lex == DC_LEX_ELSE) { + if (p->lex == DC_LEX_ELSE) { s = zdc_parse_register(); if (s) RETURN_STATUS(s); s = zbc_lex_next(); @@ -5033,7 +5028,7 @@ static BC_STATUS zdc_parse_token(BcLexType t) dbg_lex("%s:%d LEX_NEG", __func__, __LINE__); s = zbc_lex_next(); if (s) RETURN_STATUS(s); - if (G.prs.l.lex != XC_LEX_NUMBER) + if (G.prs.lex != XC_LEX_NUMBER) RETURN_STATUS(bc_error_bad_token()); bc_parse_pushNUM(); bc_parse_push(XC_INST_NEG); @@ -5083,7 +5078,7 @@ static BC_STATUS zdc_parse_expr(void) BcParse *p = &G.prs; int i; - i = (int)p->l.lex - (int)XC_LEX_OP_POWER; + i = (int)p->lex - (int)XC_LEX_OP_POWER; if (i >= 0) { BcInst inst = dc_LEX_to_INST[i]; if (inst != DC_INST_INVALID) { @@ -5091,15 +5086,15 @@ static BC_STATUS zdc_parse_expr(void) RETURN_STATUS(zbc_lex_next()); } } - RETURN_STATUS(zdc_parse_token(p->l.lex)); + RETURN_STATUS(zdc_parse_token(p->lex)); } #define zdc_parse_expr(...) (zdc_parse_expr(__VA_ARGS__) COMMA_SUCCESS) static BC_STATUS zdc_parse_exprs_until_eof(void) { BcParse *p = &G.prs; - dbg_lex_enter("%s:%d entered, p->l.lex:%d", __func__, __LINE__, p->l.lex); - while (p->l.lex != XC_LEX_EOF) { + dbg_lex_enter("%s:%d entered, p->lex:%d", __func__, __LINE__, p->lex); + while (p->lex != XC_LEX_EOF) { BcStatus s = zdc_parse_expr(); if (s) RETURN_STATUS(s); } @@ -5329,7 +5324,7 @@ static BC_STATUS zbc_program_read(void) } if (s) goto exec_err; - if (G.prs.l.lex != XC_LEX_NLINE && G.prs.l.lex != XC_LEX_EOF) { + if (G.prs.lex != XC_LEX_NLINE && G.prs.lex != XC_LEX_EOF) { s = bc_error("bad read() expression"); goto exec_err; } @@ -6460,7 +6455,7 @@ static BC_STATUS zdc_program_execStr(char *code, size_t *bgn, bool cond) s = zdc_parse_exprs_until_eof(); if (s) goto err; bc_parse_push(DC_INST_POP_EXEC); - if (G.prs.l.lex != XC_LEX_EOF) + if (G.prs.lex != XC_LEX_EOF) s = bc_error_bad_expression(); bc_parse_free(); G.prs = sv_parse; // struct copy @@ -6797,15 +6792,15 @@ static BC_STATUS zbc_vm_process(const char *text) if (s) RETURN_STATUS(s); IF_BC(check_eof:) - while (G.prs.l.lex != XC_LEX_EOF) { + while (G.prs.lex != XC_LEX_EOF) { BcInstPtr *ip; BcFunc *f; - dbg_lex("%s:%d G.prs.l.lex:%d, parsing...", __func__, __LINE__, G.prs.l.lex); + dbg_lex("%s:%d G.prs.lex:%d, parsing...", __func__, __LINE__, G.prs.lex); if (IS_BC) { #if ENABLE_BC - if (G.prs.l.lex == BC_LEX_SCOLON - || G.prs.l.lex == XC_LEX_NLINE + if (G.prs.lex == BC_LEX_SCOLON + || G.prs.lex == XC_LEX_NLINE ) { s = zbc_lex_next(); if (s) goto err; @@ -6817,13 +6812,13 @@ static BC_STATUS zbc_vm_process(const char *text) // Check that next token is a correct stmt delimiter - // disallows "print 1 print 2" and such. - if (G.prs.l.lex != BC_LEX_SCOLON - && G.prs.l.lex != XC_LEX_NLINE - && G.prs.l.lex != XC_LEX_EOF + if (G.prs.lex != BC_LEX_SCOLON + && G.prs.lex != XC_LEX_NLINE + && G.prs.lex != XC_LEX_EOF ) { const char *err_at; //TODO: commonalize for other parse errors: - err_at = G.prs.l.lex_next_at ? G.prs.l.lex_next_at : "UNKNOWN"; + err_at = G.prs.lex_next_at ? G.prs.lex_next_at : "UNKNOWN"; bc_error_fmt("bad statement terminator at '%.*s'", (int)(strchrnul(err_at, '\n') - err_at), err_at @@ -6837,10 +6832,10 @@ static BC_STATUS zbc_vm_process(const char *text) #if ENABLE_DC // Most of dc parsing assumes all whitespace, // including '\n', is eaten. - while (G.prs.l.lex == XC_LEX_NLINE) { + while (G.prs.lex == XC_LEX_NLINE) { s = zbc_lex_next(); if (s) goto err; - if (G.prs.l.lex == XC_LEX_EOF) + if (G.prs.lex == XC_LEX_EOF) goto done; } s = zdc_parse_expr(); @@ -6914,12 +6909,12 @@ static BC_STATUS zbc_vm_process(const char *text) static BC_STATUS zbc_vm_execute_FILE(FILE *fp, const char *filename) { // So far bc/dc have no way to include a file from another file, - // therefore we know G.prs.filename == NULL on entry + // therefore we know G.prs.lex_filename == NULL on entry //const char *sv_file; BcStatus s; - G.prs.filename = filename; - G.prs.input_fp = fp; + G.prs.lex_filename = filename; + G.prs.lex_input_fp = fp; bc_lex_file(); do { @@ -6928,8 +6923,8 @@ static BC_STATUS zbc_vm_execute_FILE(FILE *fp, const char *filename) // Example: start interactive bc and enter "return". // It should say "'return' not in a function" // but should not exit. - } while (G.prs.input_fp == stdin); - G.prs.filename = NULL; + } while (G.prs.lex_input_fp == stdin); + G.prs.lex_filename = NULL; RETURN_STATUS(s); } #define zbc_vm_execute_FILE(...) (zbc_vm_execute_FILE(__VA_ARGS__) COMMA_SUCCESS) -- cgit v1.2.3