tech-toolchain archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
make: allow > in :? expressions
In an expression like:
CFLAGS += ${${MAX_FOO:U0} > 0:?-max-foo ${MAX_FOO}:}
${MAX_FOO:U0} has already been expanded by the time we get to
CondToken(), so we just blow by the check for '"' or '$'.
This lets us step back there... and also print a parse error if we get
it wrong.
Index: cond.c
===================================================================
RCS file: /cvsroot/src/usr.bin/make/cond.c,v
retrieving revision 1.41
diff -u -p -r1.41 cond.c
--- cond.c 15 Feb 2008 21:29:50 -0000 1.41
+++ cond.c 21 Oct 2008 18:46:41 -0000
@@ -710,6 +710,8 @@ CondToken(Boolean doEval)
Boolean lhsQuoted;
Boolean rhsQuoted;
+do_compare_setup:
+
rhs = NULL;
lhsFree = rhsFree = FALSE;
lhsQuoted = rhsQuoted = FALSE;
@@ -985,6 +987,13 @@ error:
* binary operator) and set to invert the evaluation
* function if condInvert is TRUE.
*/
+ if (isdigit((unsigned char)condExpr[0])) {
+ /*
+ * Variables may already be substituted
+ * by the time we get here.
+ */
+ goto do_compare_setup;
+ }
use_default:
invert = condInvert;
evalProc = condDefProc;
Index: parse.c
===================================================================
RCS file: /cvsroot/src/usr.bin/make/parse.c,v
retrieving revision 1.147
diff -u -p -r1.147 parse.c
--- parse.c 6 Oct 2008 22:09:21 -0000 1.147
+++ parse.c 21 Oct 2008 18:46:42 -0000
@@ -392,7 +392,7 @@ ParseVErrorInternal(FILE *f, const char
(void)fprintf(f, "%s: \"", progname);
- if (*cfname != '/' && strcmp(cfname, "(stdin)") != 0) {
+ if (*cfname != '/' && *cfname != '(') {
char *cp;
const char *dir;
@@ -471,6 +471,15 @@ Parse_Error(int type, const char *fmt, .
va_list ap;
va_start(ap, fmt);
+ if (curFile == (IFile *)NIL) {
+ /* avoid segfault */
+ static IFile intFile = {
+ .fname = "(unknown)",
+ .lineno = 0,
+ .fd = -1,
+ };
+ curFile = &intFile;
+ }
ParseVErrorInternal(stderr, curFile->fname, curFile->lineno,
type, fmt, ap);
va_end(ap);
Index: unit-tests/cond1
===================================================================
RCS file: /cvsroot/src/usr.bin/make/unit-tests/cond1,v
retrieving revision 1.3
diff -u -p -r1.3 cond1
--- unit-tests/cond1 13 Apr 2004 16:06:23 -0000 1.3
+++ unit-tests/cond1 21 Oct 2008 18:46:42 -0000
@@ -100,3 +100,5 @@ all:
@echo "A='$A' B='$B' C='$C' o='$o,${o2}'"
@echo "Passed:${.newline} ${Ok:S/,/${.newline}/}"
@echo "${NUMBERS:@n@$n is ${("${PRIMES:M$n}" == ""):?not:}
prime${.newline}@}"
+ @echo "${"${DoNotQuoteHere:U0}" > 0:?OK:No}"
+ @echo "${${NoSuchNumber:U42} > 0:?OK:No}"
Index: unit-tests/test.exp
===================================================================
RCS file: /cvsroot/src/usr.bin/make/unit-tests/test.exp,v
retrieving revision 1.25
diff -u -p -r1.25 test.exp
--- unit-tests/test.exp 15 May 2008 21:05:55 -0000 1.25
+++ unit-tests/test.exp 21 Oct 2008 18:46:42 -0000
@@ -20,6 +20,10 @@ Passed:
4 is not prime
5 is prime
+make: "(unknown)" line 0: warning: String comparison operator should be either
== or !=
+make: Bad conditional expression `"0" > 0' in "0" > 0?OK:No
+
+OK
UT_DOLLAR=This is $UT_FU
UT_FOO=foobar is fubar
UT_FU=fubar
Home |
Main Index |
Thread Index |
Old Index