diff options
-rw-r--r-- | asm/pptok.dat | 2 | ||||
-rw-r--r-- | asm/preproc.c | 22 |
2 files changed, 21 insertions, 3 deletions
diff --git a/asm/pptok.dat b/asm/pptok.dat index bb908a31..d2f361c8 100644 --- a/asm/pptok.dat +++ b/asm/pptok.dat @@ -53,6 +53,8 @@ *num *str *token +*usable +*using # Directives with -i- versions for case insensitive %!assign diff --git a/asm/preproc.c b/asm/preproc.c index 1828c8a8..6c623327 100644 --- a/asm/preproc.c +++ b/asm/preproc.c @@ -521,6 +521,8 @@ static Token *new_Token(Token * next, enum pp_token_type type, const char *text, size_t txtlen); static Token *dup_Token(Token *next, const Token *src); static Token *delete_Token(Token * t); +static const struct use_package * +get_use_pkg(Token *t, const char *dname, bool *err); /* * Macros for safe checking of token pointers, avoid *(NULL) @@ -1989,10 +1991,11 @@ static enum cond_state if_condition(Token * tline, enum preproc_token ct) char *p; const char *dname = pp_directives[ct]; bool casesense = true; + enum preproc_token cond = PP_COND(ct); origline = tline; - switch (PP_COND(ct)) { + switch (cond) { case PP_IFCTX: j = false; /* have we matched yet? */ while (true) { @@ -2235,6 +2238,20 @@ iftype: j = reloc_value(evalresult) != 0; break; + case PP_IFUSING: + case PP_IFUSABLE: + { + const struct use_package *pkg; + bool err; + + pkg = get_use_pkg(tline, dname, &err); + if (err) + goto fail; + + j = pkg && ((cond == PP_IFUSABLE) | use_loaded[pkg->index]); + break; + } + default: nasm_nonfatal("unknown preprocessor directive `%s'", dname); goto fail; @@ -2767,7 +2784,6 @@ get_use_pkg(Token *t, const char *dname, bool *err) *err = false; - t = t->next; /* Skip directive */ skip_white_(t); t = expand_smacro(t); @@ -3188,7 +3204,7 @@ static int do_directive(Token *tline, Token **output) const struct use_package *pkg; bool err; - pkg = get_use_pkg(tline, dname, &err); + pkg = get_use_pkg(tline->next, dname, &err); if (err) goto done; |