Module Name:    src
Committed By:   rillig
Date:           Tue Sep 22 17:51:06 UTC 2020

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

Log Message:
make(1): handle errors about missing delimiter in a single place


To generate a diff of this commit:
cvs rdiff -u -r1.529 -r1.530 src/usr.bin/make/var.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/var.c
diff -u src/usr.bin/make/var.c:1.529 src/usr.bin/make/var.c:1.530
--- src/usr.bin/make/var.c:1.529	Tue Sep 22 17:42:57 2020
+++ src/usr.bin/make/var.c	Tue Sep 22 17:51:06 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.529 2020/09/22 17:42:57 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.530 2020/09/22 17:51:06 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -121,7 +121,7 @@
 #include    "metachar.h"
 
 /*	"@(#)var.c	8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.529 2020/09/22 17:42:57 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.530 2020/09/22 17:51:06 rillig Exp $");
 
 #define VAR_DEBUG_IF(cond, fmt, ...)	\
     if (!(DEBUG(VAR) && (cond)))	\
@@ -1709,7 +1709,7 @@ VarStrftime(const char *fmt, Boolean zul
  * st->endc.
  *
  * If parsing fails because of a missing delimiter (as in the :S, :C or :@
- * modifiers), set st->missing_delim and return AMR_CLEANUP.
+ * modifiers), return AMR_CLEANUP.
  *
  * If parsing fails because the modifier is unknown, return AMR_UNKNOWN to
  * try the SysV modifier ${VAR:from=to} as fallback.  This should only be
@@ -1775,8 +1775,6 @@ typedef struct {
 				 * before applying the modifier, never NULL */
     char *newVal;		/* The new value of the expression,
 				 * after applying the modifier, never NULL */
-    char missing_delim;		/* For error reporting */
-
     char sep;			/* Word separator in expansions
 				 * (see the :ts modifier) */
     Boolean oneBigWord;		/* TRUE if some modifiers that otherwise split
@@ -1797,8 +1795,7 @@ typedef enum {
     AMR_OK,			/* Continue parsing */
     AMR_UNKNOWN,		/* Not a match, try other modifiers as well */
     AMR_BAD,			/* Error out with "Bad modifier" message */
-    AMR_CLEANUP			/* Error out, with "Unfinished modifier"
-				 * if st->missing_delim is set. */
+    AMR_CLEANUP			/* Error out without error message */
 } ApplyModifierResult;
 
 /*-
@@ -1924,6 +1921,7 @@ ParseModifierPart(
 
     if (*p != delim) {
 	*pp = p;
+	Error("Unfinished modifier for %s ('%c' missing)", st->v->name, delim);
 	return NULL;
     }
 
@@ -1969,10 +1967,8 @@ ApplyModifier_Loop(const char **pp, Appl
     delim = '@';
     args.tvar = ParseModifierPart(pp, delim, eflags, st,
 				  NULL, NULL, NULL);
-    if (args.tvar == NULL) {
-	st->missing_delim = delim;
+    if (args.tvar == NULL)
 	return AMR_CLEANUP;
-    }
     if (DEBUG(LINT) && strchr(args.tvar, '$') != NULL) {
 	Parse_Error(PARSE_FATAL,
 		    "In the :@ modifier of \"%s\", the variable name \"%s\" "
@@ -1983,10 +1979,8 @@ ApplyModifier_Loop(const char **pp, Appl
 
     args.str = ParseModifierPart(pp, delim, eflags, st,
 				 NULL, NULL, NULL);
-    if (args.str == NULL) {
-	st->missing_delim = delim;
+    if (args.str == NULL)
 	return AMR_CLEANUP;
-    }
 
     args.eflags = st->eflags & (VARE_UNDEFERR | VARE_WANTRES);
     prev_sep = st->sep;
@@ -2151,10 +2145,8 @@ ApplyModifier_ShellCommand(const char **
     delim = '!';
     cmd = ParseModifierPart(pp, delim, st->eflags, st,
 			    NULL, NULL, NULL);
-    if (cmd == NULL) {
-	st->missing_delim = delim;
+    if (cmd == NULL)
 	return AMR_CLEANUP;
-    }
 
     errfmt = NULL;
     if (st->eflags & VARE_WANTRES)
@@ -2317,18 +2309,14 @@ ApplyModifier_Subst(const char **pp, App
 
     lhs = ParseModifierPart(pp, delim, st->eflags, st,
 			    &args.lhsLen, &args.pflags, NULL);
-    if (lhs == NULL) {
-	st->missing_delim = delim;
+    if (lhs == NULL)
 	return AMR_CLEANUP;
-    }
     args.lhs = lhs;
 
     rhs = ParseModifierPart(pp, delim, st->eflags, st,
 			    &args.rhsLen, NULL, &args);
-    if (rhs == NULL) {
-	st->missing_delim = delim;
+    if (rhs == NULL)
 	return AMR_CLEANUP;
-    }
     args.rhs = rhs;
 
     oneBigWord = st->oneBigWord;
@@ -2377,16 +2365,13 @@ ApplyModifier_Regex(const char **pp, App
 
     re = ParseModifierPart(pp, delim, st->eflags, st,
 			   NULL, NULL, NULL);
-    if (re == NULL) {
-	st->missing_delim = delim;
+    if (re == NULL)
 	return AMR_CLEANUP;
-    }
 
     args.replace = ParseModifierPart(pp, delim, st->eflags, st,
 				     NULL, NULL, NULL);
     if (args.replace == NULL) {
 	free(re);
-	st->missing_delim = delim;
 	return AMR_CLEANUP;
     }
 
@@ -2566,10 +2551,8 @@ ApplyModifier_Words(const char **pp, App
     delim = ']';		/* look for closing ']' */
     estr = ParseModifierPart(pp, delim, st->eflags, st,
 			     NULL, NULL, NULL);
-    if (estr == NULL) {
-	st->missing_delim = delim;
+    if (estr == NULL)
 	return AMR_CLEANUP;
-    }
 
     /* now *pp points just after the closing ']' */
     if (**pp != ':' && **pp != st->endc)
@@ -2736,18 +2719,14 @@ ApplyModifier_IfElse(const char **pp, Ap
     delim = ':';
     then_expr = ParseModifierPart(pp, delim, then_eflags, st,
 				  NULL, NULL, NULL);
-    if (then_expr == NULL) {
-	st->missing_delim = delim;
+    if (then_expr == NULL)
 	return AMR_CLEANUP;
-    }
 
     delim = st->endc;		/* BRCLOSE or PRCLOSE */
     else_expr = ParseModifierPart(pp, delim, else_eflags, st,
 				  NULL, NULL, NULL);
-    if (else_expr == NULL) {
-	st->missing_delim = delim;
+    if (else_expr == NULL)
 	return AMR_CLEANUP;
-    }
 
     (*pp)--;
     if (cond_rc == COND_INVALID) {
@@ -2843,10 +2822,8 @@ ApplyModifier_Assign(const char **pp, Ap
 	free(st->v->name);
 	st->v->name = sv_name;
     }
-    if (val == NULL) {
-	st->missing_delim = delim;
+    if (val == NULL)
 	return AMR_CLEANUP;
-    }
 
     (*pp)--;
 
@@ -2953,17 +2930,13 @@ ApplyModifier_SysV(const char **pp, Appl
     delim = '=';
     *pp = mod;
     lhs = ParseModifierPart(pp, delim, st->eflags, st, NULL, NULL, NULL);
-    if (lhs == NULL) {
-	st->missing_delim = delim;
+    if (lhs == NULL)
 	return AMR_CLEANUP;
-    }
 
     delim = st->endc;
     rhs = ParseModifierPart(pp, delim, st->eflags, st, NULL, NULL, NULL);
-    if (rhs == NULL) {
-	st->missing_delim = delim;
+    if (rhs == NULL)
 	return AMR_CLEANUP;
-    }
 
     /*
      * SYSV modifications happen through the whole
@@ -2999,7 +2972,6 @@ ApplyModifiers(
     ApplyModifiersState st = {
 	startc, endc, v, ctxt, eflags, val,
 	var_Error,		/* .newVal */
-	'\0',			/* .missing_delim */
 	' ',			/* .sep */
 	FALSE,			/* .oneBigWord */
 	*exprFlags		/* .exprFlags */
@@ -3267,9 +3239,6 @@ bad_modifier:
 
 cleanup:
     *pp = p;
-    if (st.missing_delim != '\0')
-	Error("Unfinished modifier for %s ('%c' missing)",
-	      st.v->name, st.missing_delim);
     free(*freePtr);
     *freePtr = NULL;
     *exprFlags = st.exprFlags;

Reply via email to