summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@linux.intel.com>2010-07-13 12:00:58 -0700
committerH. Peter Anvin <hpa@linux.intel.com>2010-07-13 12:00:58 -0700
commit6d9b2b59b5f6679c5ed16cc06ed24d432838c8dc (patch)
tree6fed986684432cd6d3b918794b9df7a690624fcc
parent5b00bf4d4923756ac6da6e5f9282dacb2877047f (diff)
downloadnasm-6d9b2b59b5f6679c5ed16cc06ed24d432838c8dc.tar.gz
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>
-rw-r--r--pptok.dat3
-rw-r--r--preproc.c21
2 files changed, 23 insertions, 1 deletions
diff --git a/pptok.dat b/pptok.dat
index 76ca3609..b78d138a 100644
--- a/pptok.dat
+++ b/pptok.dat
@@ -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
diff --git a/preproc.c b/preproc.c
index cc5034f3..ba1acd55 100644
--- a/preproc.c
+++ b/preproc.c
@@ -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);