Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/make make(1): migrate get_mpt_arg to Var_ParsePP
details: https://anonhg.NetBSD.org/src/rev/639ca8dd6601
branches: trunk
changeset: 943484:639ca8dd6601
user: rillig <rillig%NetBSD.org@localhost>
date: Fri Sep 04 20:51:01 2020 +0000
description:
make(1): migrate get_mpt_arg to Var_ParsePP
This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.
diffstat:
usr.bin/make/cond.c | 27 +++++++++------------------
usr.bin/make/unit-tests/cond-func-empty.mk | 14 +++++++++++++-
2 files changed, 22 insertions(+), 19 deletions(-)
diffs (95 lines):
diff -r 73a101737d60 -r 639ca8dd6601 usr.bin/make/cond.c
--- a/usr.bin/make/cond.c Fri Sep 04 20:32:34 2020 +0000
+++ b/usr.bin/make/cond.c Fri Sep 04 20:51:01 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: cond.c,v 1.110 2020/09/04 20:32:34 rillig Exp $ */
+/* $NetBSD: cond.c,v 1.111 2020/09/04 20:51:01 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -70,14 +70,14 @@
*/
#ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: cond.c,v 1.110 2020/09/04 20:32:34 rillig Exp $";
+static char rcsid[] = "$NetBSD: cond.c,v 1.111 2020/09/04 20:51:01 rillig Exp $";
#else
#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)cond.c 8.2 (Berkeley) 1/2/94";
#else
-__RCSID("$NetBSD: cond.c,v 1.110 2020/09/04 20:32:34 rillig Exp $");
+__RCSID("$NetBSD: cond.c,v 1.111 2020/09/04 20:51:01 rillig Exp $");
#endif
#endif /* not lint */
#endif
@@ -676,25 +676,16 @@
get_mpt_arg(Boolean doEval, const char **linePtr, char **argPtr,
const char *func MAKE_ATTR_UNUSED)
{
- /*
- * Use Var_Parse to parse the spec in parens and return
- * TOK_TRUE if the resulting string is empty.
- */
- int length;
void *val_freeIt;
const char *val;
- const char *cp = *linePtr;
+ int magic_res;
/* We do all the work here and return the result as the length */
*argPtr = NULL;
- val = Var_Parse(cp - 1, VAR_CMD, doEval ? VARE_WANTRES : 0, &length,
- &val_freeIt);
- /*
- * Advance *linePtr to beyond the closing ). Note that
- * we subtract one because 'length' is calculated from 'cp - 1'.
- */
- *linePtr = cp - 1 + length;
+ (*linePtr)--; /* Make (*linePtr)[1] point to the '('. */
+ val = Var_ParsePP(linePtr, VAR_CMD, doEval ? VARE_WANTRES : 0, &val_freeIt);
+ /* If successful, *linePtr points beyond the closing ')' now. */
if (val == var_Error) {
free(val_freeIt);
@@ -709,9 +700,9 @@
* For consistency with the other functions we can't generate the
* true/false here.
*/
- length = *val ? 2 : 1;
+ magic_res = *val != '\0' ? 2 : 1;
free(val_freeIt);
- return length;
+ return magic_res;
}
static Boolean
diff -r 73a101737d60 -r 639ca8dd6601 usr.bin/make/unit-tests/cond-func-empty.mk
--- a/usr.bin/make/unit-tests/cond-func-empty.mk Fri Sep 04 20:32:34 2020 +0000
+++ b/usr.bin/make/unit-tests/cond-func-empty.mk Fri Sep 04 20:51:01 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: cond-func-empty.mk,v 1.4 2020/09/04 20:28:16 rillig Exp $
+# $NetBSD: cond-func-empty.mk,v 1.5 2020/09/04 20:51:01 rillig Exp $
#
# Tests for the empty() function in .if conditions, which tests a variable
# expression for emptiness.
@@ -121,5 +121,17 @@
. error
.endif
+# Ensure that variable expressions that appear as part of the argument are
+# properly parsed. Typical use cases for this are .for loops, which are
+# expanded to exactly these ${:U} expressions.
+#
+# If everything goes well, the argument expands to "WORD", and that variable
+# is defined at the beginning of this file. The surrounding 'W' and 'D'
+# ensure that the parser in ParseEmptyArg has the correct position, both
+# before and after the call to Var_ParsePP.
+.if empty(W${:UOR}D)
+. error
+.endif
+
all:
@:;
Home |
Main Index |
Thread Index |
Old Index