aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--miscutils/bc.c29
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
647struct BcParse; 637struct BcParse;
648 638
649struct BcProgram; 639struct 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 }
842static const BcParseNext bc_parse_next_expr = 836static 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);
844static const BcParseNext bc_parse_next_param = 838static 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
1104static void bc_vec_pushByte(BcVec *v, char data) 1100static 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.
3592static void bc_parse_reset(BcParse *p) 3591static void bc_parse_reset(BcParse *p)