diff options
-rw-r--r-- | miscutils/bc.c | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index eae91e9c5..40430d411 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c | |||
@@ -588,15 +588,11 @@ typedef struct BcLex { | |||
588 | 588 | ||
589 | #define BC_PARSE_STREND ((char) UCHAR_MAX) | 589 | #define BC_PARSE_STREND ((char) UCHAR_MAX) |
590 | 590 | ||
591 | #define bc_parse_push(p, i) (bc_vec_pushByte(&(p)->func->code, (char) (i))) | 591 | #define BC_PARSE_REL (1 << 0) |
592 | #define bc_parse_updateFunc(p, f) \ | 592 | #define BC_PARSE_PRINT (1 << 1) |
593 | ((p)->func = bc_vec_item(&G.prog.fns, ((p)->fidx = (f)))) | ||
594 | |||
595 | #define BC_PARSE_REL (1 << 0) | ||
596 | #define BC_PARSE_PRINT (1 << 1) | ||
597 | #define BC_PARSE_NOCALL (1 << 2) | 593 | #define BC_PARSE_NOCALL (1 << 2) |
598 | #define BC_PARSE_NOREAD (1 << 3) | 594 | #define BC_PARSE_NOREAD (1 << 3) |
599 | #define BC_PARSE_ARRAY (1 << 4) | 595 | #define BC_PARSE_ARRAY (1 << 4) |
600 | 596 | ||
601 | #define BC_PARSE_TOP_FLAG_PTR(parse) ((uint8_t *) bc_vec_top(&(parse)->flags)) | 597 | #define BC_PARSE_TOP_FLAG_PTR(parse) ((uint8_t *) bc_vec_top(&(parse)->flags)) |
602 | #define BC_PARSE_TOP_FLAG(parse) (*(BC_PARSE_TOP_FLAG_PTR(parse))) | 598 | #define BC_PARSE_TOP_FLAG(parse) (*(BC_PARSE_TOP_FLAG_PTR(parse))) |
@@ -638,12 +634,6 @@ typedef struct BcParseNext { | |||
638 | BcLexType tokens[4]; | 634 | BcLexType tokens[4]; |
639 | } BcParseNext; | 635 | } BcParseNext; |
640 | 636 | ||
641 | #define BC_PARSE_NEXT_TOKENS(...) .tokens = { __VA_ARGS__ } | ||
642 | #define BC_PARSE_NEXT(a, ...) \ | ||
643 | { \ | ||
644 | .len = (a), BC_PARSE_NEXT_TOKENS(__VA_ARGS__) \ | ||
645 | } | ||
646 | |||
647 | struct BcParse; | 637 | struct BcParse; |
648 | 638 | ||
649 | struct BcProgram; | 639 | struct BcProgram; |
@@ -716,7 +706,6 @@ typedef struct BcProgram { | |||
716 | 706 | ||
717 | #define BC_PROG_MAIN (0) | 707 | #define BC_PROG_MAIN (0) |
718 | #define BC_PROG_READ (1) | 708 | #define BC_PROG_READ (1) |
719 | |||
720 | #if ENABLE_DC | 709 | #if ENABLE_DC |
721 | #define BC_PROG_REQ_FUNCS (2) | 710 | #define BC_PROG_REQ_FUNCS (2) |
722 | #endif | 711 | #endif |
@@ -839,6 +828,11 @@ static const uint8_t bc_parse_ops[] = { | |||
839 | #define bc_parse_op_LEFT(i) (bc_parse_ops[i] & 0x10) | 828 | #define bc_parse_op_LEFT(i) (bc_parse_ops[i] & 0x10) |
840 | 829 | ||
841 | // These identify what tokens can come after expressions in certain cases. | 830 | // These identify what tokens can come after expressions in certain cases. |
831 | #define BC_PARSE_NEXT_TOKENS(...) .tokens = { __VA_ARGS__ } | ||
832 | #define BC_PARSE_NEXT(a, ...) \ | ||
833 | { \ | ||
834 | .len = (a), BC_PARSE_NEXT_TOKENS(__VA_ARGS__) \ | ||
835 | } | ||
842 | static const BcParseNext bc_parse_next_expr = | 836 | static const BcParseNext bc_parse_next_expr = |
843 | BC_PARSE_NEXT(4, BC_LEX_NLINE, BC_LEX_SCOLON, BC_LEX_RBRACE, BC_LEX_EOF); | 837 | BC_PARSE_NEXT(4, BC_LEX_NLINE, BC_LEX_SCOLON, BC_LEX_RBRACE, BC_LEX_EOF); |
844 | static const BcParseNext bc_parse_next_param = | 838 | static const BcParseNext bc_parse_next_param = |
@@ -1101,6 +1095,8 @@ static void bc_vec_push(BcVec *v, const void *data) | |||
1101 | v->len += 1; | 1095 | v->len += 1; |
1102 | } | 1096 | } |
1103 | 1097 | ||
1098 | #define bc_parse_push(p, i) bc_vec_pushByte(&(p)->func->code, (char) (i)) | ||
1099 | |||
1104 | static void bc_vec_pushByte(BcVec *v, char data) | 1100 | static void bc_vec_pushByte(BcVec *v, char data) |
1105 | { | 1101 | { |
1106 | bc_vec_push(v, &data); | 1102 | bc_vec_push(v, &data); |
@@ -3377,7 +3373,7 @@ static BcStatus dc_lex_register(BcLex *l) | |||
3377 | } | 3373 | } |
3378 | else { | 3374 | else { |
3379 | bc_vec_pop_all(&l->t.v); | 3375 | bc_vec_pop_all(&l->t.v); |
3380 | bc_vec_pushByte(&l->t.v, l->buf[l->i - 1]); | 3376 | bc_vec_push(&l->t.v, &l->buf[l->i - 1]); |
3381 | bc_vec_pushZeroByte(&l->t.v); | 3377 | bc_vec_pushZeroByte(&l->t.v); |
3382 | l->t.t = BC_LEX_NAME; | 3378 | l->t.t = BC_LEX_NAME; |
3383 | } | 3379 | } |
@@ -3587,6 +3583,9 @@ static BcStatus bc_parse_text(BcParse *p, const char *text) | |||
3587 | return bc_lex_text(&p->l, text); | 3583 | return bc_lex_text(&p->l, text); |
3588 | } | 3584 | } |
3589 | 3585 | ||
3586 | #define bc_parse_updateFunc(p, f) \ | ||
3587 | ((p)->func = bc_vec_item(&G.prog.fns, ((p)->fidx = (f)))) | ||
3588 | |||
3590 | // Called when bc/dc_parse_parse() detects a failure, | 3589 | // Called when bc/dc_parse_parse() detects a failure, |
3591 | // resets parsing structures. | 3590 | // resets parsing structures. |
3592 | static void bc_parse_reset(BcParse *p) | 3591 | static void bc_parse_reset(BcParse *p) |