preproc: add %ifenv

Add %ifenv to test for the presence of an environment variable.  The
environment variable can, but does not have to be, prefixed with %!.

Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:
H. Peter Anvin 2010-07-13 12:00:58 -07:00
parent 5b00bf4d49
commit 6d9b2b59b5
2 changed files with 23 additions and 1 deletions

View File

@ -1,6 +1,6 @@
## --------------------------------------------------------------------------
##
## Copyright 1996-2009 The NASM Authors - All Rights Reserved
## Copyright 1996-2010 The NASM Authors - All Rights Reserved
## See the file AUTHORS included with the NASM distribution for
## the specific copyright holders.
##
@ -39,6 +39,7 @@
*ctx
*def
*empty
*env
*id
*idn
*idni

View File

@ -1610,6 +1610,7 @@ static bool if_condition(Token * tline, enum preproc_token ct)
struct tokenval tokval;
expr *evalresult;
enum pp_token_type needtype;
const char *p;
origline = tline;
@ -1649,6 +1650,26 @@ static bool if_condition(Token * tline, enum preproc_token ct)
}
break;
case PPC_IFENV:
tline = expand_smacro(tline);
j = false; /* have we matched yet? */
while (tline) {
skip_white_(tline);
if (!tline || (tline->type != TOK_ID &&
(tline->type != TOK_PREPROC_ID ||
tline->text[1] != '!'))) {
error(ERR_NONFATAL,
"`%s' expects environment variable names",
pp_directives[ct]);
goto fail;
}
p = tline->type == TOK_ID ? tline->text : tline->text + 2;
if (getenv(p))
j = true;
tline = tline->next;
}
break;
case PPC_IFIDN:
case PPC_IFIDNI:
tline = expand_smacro(tline);