bc: fold struct BcLex into BcParse
No binary (build failed)
—
(log yok)
| @@ -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 "[\<newline>].[\<newline>]" (with any number of \<NL> 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 "\<NL>"'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 <enter>). | |
| // IOW: typing "1p<enter>" 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) | |