From 508ef51fc8f36362609b2940bf9deb4f737f908b Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sun, 15 Feb 2026 14:38:35 -0500 Subject: [PATCH] core: Add support for '#ifdef' directive Signed-off-by: Ian Moffett --- core/parser.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++ core/rifle.c | 8 +++-- 2 files changed, 95 insertions(+), 3 deletions(-) diff --git a/core/parser.c b/core/parser.c index 5c96020..d29b87c 100644 --- a/core/parser.c +++ b/core/parser.c @@ -158,6 +158,69 @@ parse_define(struct rifle_state *state, struct token *tok) return 0; } +/* + * Skip to an '#endif' token + * + * @state: Compiler state + * @tok: Last token + * + * Returns zero on success + */ +static int +parse_skip_to_endif(struct rifle_state *state, struct token *tok) +{ + if (state == NULL || tok == NULL) { + return -1; + } + + while (tok->type != TT_ENDIF) { + if (parse_scan(state, tok) < 0) { + ueof(state); + return -1; + } + } + + return 0; +} + +/* + * Parse an '#ifdef' preprocessing directive + * + * @state: Compiler state + * @tok: Last token + * + * Returns zero on success + */ +static int +parse_ifdef(struct rifle_state *state, struct token *tok) +{ + struct symbol *symbol; + + if (state == NULL || tok == NULL) { + return -1; + } + + if (tok->type != TT_IFDEF) { + return -1; + } + + /* EXPECT */ + if (parse_expect(state, TT_IDENT, tok) < 0) { + return -1; + } + + symbol = symbol_from_name( + &state->symtab, + tok->s + ); + + if (symbol == NULL) { + parse_skip_to_endif(state, tok); + } + + return 0; +} + /* * Handle the preprocessing stage * @@ -175,6 +238,14 @@ parse_preprocess(struct rifle_state *state) return -1; } + break; + case TT_IFDEF: + if (parse_ifdef(state, &tok) < 0) { + return -1; + } + + break; + case TT_ENDIF: break; default: tokbuf_push(&state->tokbuf, &tok); @@ -185,6 +256,18 @@ parse_preprocess(struct rifle_state *state) return 0; } +static int +parse_begin(struct rifle_state *state) +{ + struct token tok; + + while (parse_scan(state, &tok) == 0) { + printf("got token %s\n", tokstr(&tok)); + } + + return 0; +} + int parser_parse(struct rifle_state *state) { @@ -199,6 +282,13 @@ parser_parse(struct rifle_state *state) return -1; } + break; + case 1: + /* Parse loop */ + if (parse_begin(state) < 0) { + return -1; + } + break; } diff --git a/core/rifle.c b/core/rifle.c index 95030b3..4223d5b 100644 --- a/core/rifle.c +++ b/core/rifle.c @@ -39,9 +39,11 @@ compile(const char *in_path) return -1; } - if (parser_parse(&state) < 0) { - rifle_state_destroy(&state); - return -1; + for (int i = 0; i < 2; ++i) { + if (parser_parse(&state) < 0) { + rifle_state_destroy(&state); + return -1; + } } rifle_state_destroy(&state);