diff options
| author | Ian Moffett <ian@mirocom.org> | 2026-05-23 08:49:17 -0400 |
|---|---|---|
| committer | Ian Moffett <ian@mirocom.org> | 2026-05-23 08:49:17 -0400 |
| commit | 62451acdd4dd4cf369a801b0603e2e0841bfb627 (patch) | |
| tree | 853db2d031239dd9e7e27c8ed679f6e0f884bc8c /core/lexer.c | |
| parent | 82e68e92a92e8973dcca8d94f175c9d16be94c80 (diff) | |
core: lexer: Add preprocessor tokens
Signed-off-by: Ian Moffett <ian@mirocom.org>
Diffstat (limited to 'core/lexer.c')
| -rw-r--r-- | core/lexer.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/core/lexer.c b/core/lexer.c index 1a62e71..6c7a4c9 100644 --- a/core/lexer.c +++ b/core/lexer.c @@ -190,6 +190,45 @@ lexer_check_kw(struct cescal_state *state, struct token *res) } /* + * Check if an identifier token is actually a directive + * + * @state: Compiler state + * @res: Token result is written here + */ +static int +lexer_check_direc(struct cescal_state *state, struct token *res) +{ + if (state == NULL || res == NULL) { + errno = EINVAL; + return -1; + } + + switch (*res->s) { + case 'd': + if (strcmp(res->s, "define") == 0) { + res->type = TT_DEFINE; + return 0; + } + + break; + case 'i': + if (strcmp(res->s, "ifndef") == 0) { + res->type = TT_IFNDEF; + return 0; + } + + if (strcmp(res->s, "ifdef") == 0) { + res->type = TT_IFDEF; + return 0; + } + + break; + } + + return -1; +} + +/* * Skip anything after a comment * * @state: Compiler state @@ -237,6 +276,19 @@ lexer_nom(struct cescal_state *state, struct token *res) res->type = TT_COMMA; res->c = c; return 0; + case '#': + if ((c = lexer_consume_single(state, true)) == '\0') { + return -1; + } + + if (lexer_scan_ident(state, c, res) == 0) { + if (lexer_check_direc(state, res) != 0) { + cc_error("bad directive '%s'\n", res->s); + return -1; + } + } + + return 0; case '/': if (lexer_consume_single(state, true) == '/') { res->type = TT_COMMENT; |
