Module Name:    src
Committed By:   rillig
Date:           Sun Oct  4 20:37:11 UTC 2020

Modified Files:
        src/usr.bin/make: parse.c

Log Message:
make(1): clean up code for parsing ?= variable assignments

There is no need to handle the ?= operator in ParseVarassignOp already,
when all other operators are handled later.


To generate a diff of this commit:
cvs rdiff -u -r1.357 -r1.358 src/usr.bin/make/parse.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/make/parse.c
diff -u src/usr.bin/make/parse.c:1.357 src/usr.bin/make/parse.c:1.358
--- src/usr.bin/make/parse.c:1.357	Sun Oct  4 20:23:32 2020
+++ src/usr.bin/make/parse.c	Sun Oct  4 20:37:11 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.c,v 1.357 2020/10/04 20:23:32 rillig Exp $	*/
+/*	$NetBSD: parse.c,v 1.358 2020/10/04 20:37:11 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -131,7 +131,7 @@
 #include "pathnames.h"
 
 /*	"@(#)parse.c	8.3 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: parse.c,v 1.357 2020/10/04 20:23:32 rillig Exp $");
+MAKE_RCSID("$NetBSD: parse.c,v 1.358 2020/10/04 20:37:11 rillig Exp $");
 
 /* types and constants */
 
@@ -1743,48 +1743,37 @@ Parse_IsVar(const char *p, VarAssign *ou
 
 /* Determine the assignment operator and adjust the end of the variable
  * name accordingly. */
-static Boolean
+static void
 ParseVarassignOp(VarAssign *var, const char **out_op, GNode *ctxt)
 {
     const char *op = var->eq;
-    const char * const nameStart = var->nameStart;
+    const char * const name = var->nameStart;
     VarAssignOp type;
 
     var->varname = NULL;
-    if (op > nameStart && op[-1] == '+') {
+    if (op > name && op[-1] == '+') {
 	type = VAR_APPEND;
 	op--;
 
-    } else if (op > nameStart && op[-1] == '?') {
-	/* If the variable already has a value, we don't do anything. */
-	Boolean exists;
-	const char *nameEnd;
-
-	op--;
-	nameEnd = var->nameEndDraft < op ? var->nameEndDraft : op;
-	var->varname = bmake_strsedup(nameStart, nameEnd);
-	exists = Var_Exists(var->varname, ctxt);
-	if (exists) {
-	    free(var->varname);
-	    return FALSE;
-	}
-	type = VAR_NORMAL;
+    } else if (op > name && op[-1] == '?') {
+        op--;
+        type = VAR_DEFAULT;
 
-    } else if (op > nameStart && op[-1] == ':') {
+    } else if (op > name && op[-1] == ':') {
 	op--;
 	type = VAR_SUBST;
 
-    } else if (op > nameStart && op[-1] == '!') {
+    } else if (op > name && op[-1] == '!') {
 	op--;
 	type = VAR_SHELL;
 
     } else {
 	type = VAR_NORMAL;
 #ifdef SUNSHCMD
-	while (op > nameStart && ch_isspace(op[-1]))
+	while (op > name && ch_isspace(op[-1]))
 	    op--;
 
-	if (op >= nameStart + 3 && op[-3] == ':' && op[-2] == 's' && op[-1] == 'h') {
+	if (op >= name + 3 && op[-3] == ':' && op[-2] == 's' && op[-1] == 'h') {
 	    type = VAR_SHELL;
 	    op -= 3;
 	}
@@ -1793,7 +1782,6 @@ ParseVarassignOp(VarAssign *var, const c
 
     *out_op = op;
     var->op = type;
-    return TRUE;
 }
 
 static void
@@ -1812,7 +1800,7 @@ VarCheckSyntax(VarAssignOp type, const c
     }
 }
 
-static void
+static Boolean
 VarAssign_Eval(VarAssign *var,
 	  const char *const uvalue, const char **out_avalue, char **out_evalue,
 	  GNode *ctxt)
@@ -1875,14 +1863,16 @@ VarAssign_Eval(VarAssign *var,
 	if (error)
 	    Parse_Error(PARSE_WARNING, error, avalue);
     } else {
-	/*
-	 * Normal assignment -- just do it.
-	 */
+	if (type == VAR_DEFAULT && Var_Exists(var->varname, ctxt))
+	    return FALSE;
+
+	/* Normal assignment -- just do it. */
 	Var_Set(name, uvalue, ctxt);
     }
 
     *out_avalue = avalue;
     *out_evalue = evalue;
+    return TRUE;
 }
 
 static void
@@ -1934,8 +1924,7 @@ Parse_DoVar(VarAssign *var, GNode *ctxt)
      * actual end of the variable name. */
     const char *op;
 
-    if (!ParseVarassignOp(var, &op, ctxt))
-	return;
+    ParseVarassignOp(var, &op, ctxt);
 
     uvalue = var->value;
     avalue = uvalue;
@@ -1947,8 +1936,8 @@ Parse_DoVar(VarAssign *var, GNode *ctxt)
 	var->varname = bmake_strsedup(var->nameStart, nameEnd);
     }
 
-    VarAssign_Eval(var, uvalue, &avalue, &evalue, ctxt);
-    VarAssignSpecial(var->varname, avalue);
+    if (VarAssign_Eval(var, uvalue, &avalue, &evalue, ctxt))
+	VarAssignSpecial(var->varname, avalue);
 
     free(evalue);
     free(var->varname);

Reply via email to