From ae83f298ec7e518fa4a3869abf7c03326b6735c5 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Sun, 29 Mar 2020 18:23:33 +0900 Subject: [PATCH] Add #undef --- preprocess.c | 15 ++++++++++++++- test/macro.c | 7 +++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/preprocess.c b/preprocess.c index 5cb7400..82a0ef3 100644 --- a/preprocess.c +++ b/preprocess.c @@ -5,6 +5,7 @@ struct Macro { Macro *next; char *name; Token *body; + bool deleted; }; // `#if` can be nested, so we use a stack to manage nested `#if`s. @@ -150,7 +151,7 @@ static Macro *find_macro(Token *tok) { for (Macro *m = macros; m; m = m->next) if (strlen(m->name) == tok->len && !strncmp(m->name, tok->loc, tok->len)) - return m; + return m->deleted ? NULL : m; return NULL; } @@ -223,6 +224,18 @@ static Token *preprocess2(Token *tok) { continue; } + if (equal(tok, "undef")) { + tok = tok->next; + if (tok->kind != TK_IDENT) + error_tok(tok, "macro name must be an identifier"); + char *name = strndup(tok->loc, tok->len); + tok = skip_line(tok->next); + + Macro *m = add_macro(name, NULL); + m->deleted = true; + continue; + } + if (equal(tok, "if")) { long val = eval_const_expr(&tok, tok); push_cond_incl(start, val); diff --git a/test/macro.c b/test/macro.c index c260080..6481464 100644 --- a/test/macro.c +++ b/test/macro.c @@ -121,6 +121,13 @@ int main() { #define END ) ASSERT_ 5, if, five END; +#undef ASSERT_ +#undef if +#undef five +#undef END + + if (0); + printf("OK\n"); return 0; } -- GitLab