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): fix edge cases with $ at the end of th...



details:   https://anonhg.NetBSD.org/src/rev/f8dfaf2801b4
branches:  trunk
changeset: 936199:f8dfaf2801b4
user:      rillig <rillig%NetBSD.org@localhost>
date:      Mon Jul 20 19:53:40 2020 +0000

description:
make(1): fix edge cases with $ at the end of the :@ modifier

In both parts of the :@ modifier, by passing &pflags to
ParseModifierPart, a final $ was interpreted as an anchor, which only
makes sense in the :S and :C modifiers.

This edge case is neither used by src nor by pkgsrc, except for the unit
tests that have been adjusted.

diffstat:

 usr.bin/make/nonints.h              |  13 +++++++++----
 usr.bin/make/unit-tests/modmisc.exp |   8 ++++----
 usr.bin/make/var.c                  |  30 +++++++++++-------------------
 3 files changed, 24 insertions(+), 27 deletions(-)

diffs (154 lines):

diff -r 51c812dbbb35 -r f8dfaf2801b4 usr.bin/make/nonints.h
--- a/usr.bin/make/nonints.h    Mon Jul 20 19:03:25 2020 +0000
+++ b/usr.bin/make/nonints.h    Mon Jul 20 19:53:40 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nonints.h,v 1.81 2020/07/20 18:12:48 sjg Exp $ */
+/*     $NetBSD: nonints.h,v 1.82 2020/07/20 19:53:40 rillig Exp $      */
 
 /*-
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -179,9 +179,14 @@
 /* var.c */
 
 typedef enum {
-       VARE_UNDEFERR = 1,
-       VARE_WANTRES = 2,
-       VARE_ASSIGN = 4
+    /* Treat undefined variables as errors. */
+    VARE_UNDEFERR      = 0x01,
+    /* Actually evaluate the text, fully expanding variables.
+     * Without this flag, the text is only parsed but not evaluated. */
+    VARE_WANTRES       = 0x02,
+    VARE_ASSIGN                = 0x04,
+    /* Return the literal text, without expanding variables. */
+    VARE_NOSUBST       = 0x08
 } VarEvalFlags;
 
 void Var_Delete(const char *, GNode *);
diff -r 51c812dbbb35 -r f8dfaf2801b4 usr.bin/make/unit-tests/modmisc.exp
--- a/usr.bin/make/unit-tests/modmisc.exp       Mon Jul 20 19:03:25 2020 +0000
+++ b/usr.bin/make/unit-tests/modmisc.exp       Mon Jul 20 19:53:40 2020 +0000
@@ -33,7 +33,7 @@
 :+one+ +two+ +three+:
 mod-at-resolve:w1d2d3w w2i3w w1i2d3 2i${RES3}w w1d2d3 2i${RES3} 1i${RES2}w:
 mod-at-dollar:(1) (2) (3).
-mod-at-dollar:(1) (2) (3).
+mod-at-dollar:() () ().
 mod-at-dollar:() () ().
 mod-subst-dollar:$1:
 mod-subst-dollar:$2:
@@ -46,11 +46,11 @@
 mod-subst-dollar:U8:
 mod-subst-dollar:$$$$:
 mod-loop-dollar:1:
-mod-loop-dollar:${word}:
+mod-loop-dollar:${word}$:
 mod-loop-dollar:$3$:
-mod-loop-dollar:$${word}$:
+mod-loop-dollar:$${word}$$:
 mod-loop-dollar:$$5$$:
-mod-loop-dollar:$$${word}$$:
+mod-loop-dollar:$$${word}$$$:
 mod-C-limits:00-ok:1 2323 45456
 make: No subexpression \1
 make: No subexpression \1
diff -r 51c812dbbb35 -r f8dfaf2801b4 usr.bin/make/var.c
--- a/usr.bin/make/var.c        Mon Jul 20 19:03:25 2020 +0000
+++ b/usr.bin/make/var.c        Mon Jul 20 19:53:40 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: var.c,v 1.286 2020/07/20 18:12:48 sjg Exp $    */
+/*     $NetBSD: var.c,v 1.287 2020/07/20 19:53:40 rillig Exp $ */
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: var.c,v 1.286 2020/07/20 18:12:48 sjg Exp $";
+static char rcsid[] = "$NetBSD: var.c,v 1.287 2020/07/20 19:53:40 rillig Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)var.c      8.3 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: var.c,v 1.286 2020/07/20 18:12:48 sjg Exp $");
+__RCSID("$NetBSD: var.c,v 1.287 2020/07/20 19:53:40 rillig Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -241,11 +241,7 @@
     VARP_SUB_ONE       = 0x02, /* Apply substitution to one word */
     VARP_SUB_MATCHED   = 0x04, /* There was a match */
     VARP_MATCH_START   = 0x08, /* Match at start of word */
-    VARP_MATCH_END     = 0x10, /* Match at end of word */
-
-    /* FIXME: This constant doesn't belong here.
-     * It is not related to pattern matching. */
-    VAR_NOSUBST        = 0x20          /* don't expand vars in ParseModifierPart */
+    VARP_MATCH_END     = 0x10  /* Match at end of word */
 } VarPatternFlags;
 
 typedef enum {
@@ -1879,7 +1875,7 @@
 /*-
  * Parse a text part of a modifier such as the "from" and "to" in :S/from/to/
  * or the :@ modifier. Nested variables in the text are expanded unless
- * VAR_NOSUBST is set.
+ * VARE_NOSUBST is set.
  *
  * The text part is parsed until the next delimiter.  To escape the delimiter,
  * a backslash or a dollar, put a backslash before it.
@@ -1930,8 +1926,7 @@
                     */
                    *mpflags |= VARP_MATCH_END;
            } else {
-               /* FIXME: mismatch between mpflags and VAR_NOSUBST */
-               if (mpflags == NULL || !(*mpflags & VAR_NOSUBST)) {
+               if (!(eflags & VARE_NOSUBST)) {
                    char   *cp2;
                    int     len;
                    void   *freeIt;
@@ -2166,17 +2161,16 @@
 static Boolean
 ApplyModifier_At(ApplyModifiersState *st) {
     VarLoop loop;
-    VarPatternFlags pflags = VAR_NOSUBST; /* FIXME: mismatch between pflags and VAR_NOSUBST */
 
     st->cp = ++st->tstr;
     st->delim = '@';
     loop.tvar = ParseModifierPart(
-       st->ctxt, &st->cp, st->delim, st->eflags, &pflags, NULL, NULL);
+       st->ctxt, &st->cp, st->delim, st->eflags | VARE_NOSUBST, NULL, NULL, NULL);
     if (loop.tvar == NULL)
        return FALSE;
 
     loop.str = ParseModifierPart(
-       st->ctxt, &st->cp, st->delim, st->eflags, &pflags, NULL, NULL);
+       st->ctxt, &st->cp, st->delim, st->eflags | VARE_NOSUBST, NULL, NULL, NULL);
     if (loop.str == NULL)
        return FALSE;
 
@@ -2942,8 +2936,6 @@
        return 'd';             /* "::<unrecognised>" */
 
     GNode *v_ctxt;             /* context where v belongs */
-    VarPatternFlags pflags;
-    /* FIXME: Assign has nothing to do with VarPatternFlags */
 
     if (st->v->name[0] == 0)
        return 'b';
@@ -2977,9 +2969,9 @@
     }
     st->delim = st->startc == PROPEN ? PRCLOSE : BRCLOSE;
 
-    pflags = (st->eflags & VARE_WANTRES) ? 0 : VAR_NOSUBST;
-    char *val = ParseModifierPart(st->ctxt, &st->cp, st->delim, st->eflags,
-                                 &pflags, NULL, NULL);
+    VarEvalFlags eflags = (st->eflags & VARE_WANTRES) ? 0 : VARE_NOSUBST;
+    char *val = ParseModifierPart(st->ctxt, &st->cp, st->delim,
+                                 st->eflags | eflags, NULL, NULL, NULL);
     if (st->v->flags & VAR_JUNK) {
        /* restore original name */
        free(st->v->name);



Home | Main Index | Thread Index | Old Index