diff options
author | Federico G. Schwindt <fgsch@cvs.openbsd.org> | 2009-11-11 00:12:11 +0000 |
---|---|---|
committer | Federico G. Schwindt <fgsch@cvs.openbsd.org> | 2009-11-11 00:12:11 +0000 |
commit | 5db91da9805ee015db1db9f8f352af0d211cfc7f (patch) | |
tree | d7087d168149e25e37bcd86297100c867bdda134 | |
parent | b7a9969813ce8c8fa03181f315dc859eda7a5e75 (diff) |
If this is an else-type conditional and previous corresponding one
evaluated to true, skip. tested by simon@ and myself. espie@ ok.
-rw-r--r-- | usr.bin/make/cond.c | 55 |
1 files changed, 23 insertions, 32 deletions
diff --git a/usr.bin/make/cond.c b/usr.bin/make/cond.c index eab4e96262a..9b572842ee6 100644 --- a/usr.bin/make/cond.c +++ b/usr.bin/make/cond.c @@ -1,5 +1,5 @@ /* $OpenPackages$ */ -/* $OpenBSD: cond.c,v 1.40 2008/11/24 16:23:04 espie Exp $ */ +/* $OpenBSD: cond.c,v 1.41 2009/11/11 00:12:10 fgsch Exp $ */ /* $NetBSD: cond.c,v 1.7 1996/11/06 17:59:02 christos Exp $ */ /* @@ -1045,11 +1045,13 @@ Cond_Eval(const char *line) if (condTop == MAXIF) { Parse_Error(level, "if-less elif"); return COND_INVALID; - } else if (skipIfLevel != 0) { - /* If skipping this conditional, just ignore the whole - * thing. If we don't, the user might be employing a - * variable that's undefined, for which there's an - * enclosing ifdef that we're skipping... */ + } else if (skipIfLevel != 0 || condStack[condTop].value) { + /* + * Skip if we're meant to or is an else-type + * conditional and previous corresponding one was + * evaluated to true. + */ + skipLine = true; return COND_SKIP; } } else if (skipLine) { @@ -1057,6 +1059,16 @@ Cond_Eval(const char *line) * if we're skipping things... */ skipIfLevel++; return COND_SKIP; + } else + condTop--; + + if (condTop < 0) { + /* This is the one case where we can definitely proclaim a fatal + * error. If we don't, we're hosed. */ + Parse_Error(PARSE_FATAL, "Too many nested if's. %d max.", + MAXIF); + condTop = 0; + return COND_INVALID; } if (ifp->defProc) { @@ -1095,32 +1107,11 @@ err: } } - if (!ifp->isElse) - condTop--; - else if (skipIfLevel != 0 || condStack[condTop].value) { - /* If this is an else-type conditional, it should only take - * effect if its corresponding if was evaluated and false. If - * its if was true or skipped, we return COND_SKIP (and start - * skipping in case we weren't already), leaving the stack - * unmolested so later elif's don't screw up... */ - skipLine = true; - return COND_SKIP; - } - - if (condTop < 0) { - /* This is the one case where we can definitely proclaim a fatal - * error. If we don't, we're hosed. */ - Parse_Error(PARSE_FATAL, "Too many nested if's. %d max.", - MAXIF); - condTop = 0; - return COND_INVALID; - } else { - condStack[condTop].value = value; - condStack[condTop].lineno = Parse_Getlineno(); - condStack[condTop].filename = Parse_Getfilename(); - skipLine = !value; - return value ? COND_PARSE : COND_SKIP; - } + condStack[condTop].value = value; + condStack[condTop].lineno = Parse_Getlineno(); + condStack[condTop].filename = Parse_Getfilename(); + skipLine = !value; + return value ? COND_PARSE : COND_SKIP; } void |