Module Name:    src
Committed By:   rillig
Date:           Fri Jul 24 07:24:22 UTC 2020

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

Log Message:
make(1): eliminate ApplyModifiersState.tstr

This field always pointed to the beginning of the current modifier.
Therefore a better name is "mod", and there is no need to store it in the
shared state.


To generate a diff of this commit:
cvs rdiff -u -r1.298 -r1.299 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.298 src/usr.bin/make/var.c:1.299
--- src/usr.bin/make/var.c:1.298	Thu Jul 23 20:24:22 2020
+++ src/usr.bin/make/var.c	Fri Jul 24 07:24:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.298 2020/07/23 20:24:22 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.299 2020/07/24 07:24:21 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: var.c,v 1.298 2020/07/23 20:24:22 rillig Exp $";
+static char rcsid[] = "$NetBSD: var.c,v 1.299 2020/07/24 07:24:21 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.298 2020/07/23 20:24:22 rillig Exp $");
+__RCSID("$NetBSD: var.c,v 1.299 2020/07/24 07:24:21 rillig Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -2081,7 +2081,6 @@ typedef struct {
 
     /* read-write */
     char *nstr;
-    const char *tstr;
     const char *start;
     const char *cp;		/* Secondary pointer into str (place marker
 				 * for tstr) */
@@ -2104,11 +2103,11 @@ typedef struct {
 
 /* :@var@...${var}...@ */
 static Boolean
-ApplyModifier_Loop(ApplyModifiersState *st) {
+ApplyModifier_Loop(const char *mod, ApplyModifiersState *st) {
     ModifyWord_LoopArgs args;
 
     args.ctx = st->ctxt;
-    st->cp = ++st->tstr;
+    st->cp = mod + 1;
     char delim = '@';
     args.tvar = ParseModifierPart(st->ctxt, &st->cp, delim,
 				  st->eflags | VARE_NOSUBST,
@@ -2142,14 +2141,14 @@ ApplyModifier_Loop(ApplyModifiersState *
 
 /* :Ddefined or :Uundefined */
 static void
-ApplyModifier_Defined(ApplyModifiersState *st)
+ApplyModifier_Defined(const char *mod, ApplyModifiersState *st)
 {
     Buffer buf;			/* Buffer for patterns */
     VarEvalFlags neflags;
 
     if (st->eflags & VARE_WANTRES) {
 	Boolean wantres;
-	if (*st->tstr == 'U')
+	if (*mod == 'U')
 	    wantres = ((st->v->flags & VAR_JUNK) != 0);
 	else
 	    wantres = ((st->v->flags & VAR_JUNK) == 0);
@@ -2167,7 +2166,7 @@ ApplyModifier_Defined(ApplyModifiersStat
      * The result is left in the Buffer buf.
      */
     Buf_Init(&buf, 0);
-    for (st->cp = st->tstr + 1;
+    for (st->cp = mod + 1;
 	 *st->cp != st->endc && *st->cp != ':' && *st->cp != '\0';
 	 st->cp++) {
 	if (*st->cp == '\\' &&
@@ -2207,20 +2206,20 @@ ApplyModifier_Defined(ApplyModifiersStat
 
 /* :gmtime */
 static Boolean
-ApplyModifier_Gmtime(ApplyModifiersState *st)
+ApplyModifier_Gmtime(const char *mod, ApplyModifiersState *st)
 {
     time_t utc;
     char *ep;
 
-    st->cp = st->tstr + 1;	/* make sure it is set */
-    if (!STRMOD_MATCHX(st->tstr, "gmtime", 6))
+    st->cp = mod + 1;		/* make sure it is set */
+    if (!STRMOD_MATCHX(mod, "gmtime", 6))
 	return FALSE;
-    if (st->tstr[6] == '=') {
-	utc = strtoul(&st->tstr[7], &ep, 10);
+    if (mod[6] == '=') {
+	utc = strtoul(mod + 7, &ep, 10);
 	st->cp = ep;
     } else {
 	utc = 0;
-	st->cp = st->tstr + 6;
+	st->cp = mod + 6;
     }
     st->newStr = VarStrftime(st->nstr, 1, utc);
     st->termc = *st->cp;
@@ -2229,21 +2228,21 @@ ApplyModifier_Gmtime(ApplyModifiersState
 
 /* :localtime */
 static Boolean
-ApplyModifier_Localtime(ApplyModifiersState *st)
+ApplyModifier_Localtime(const char *mod, ApplyModifiersState *st)
 {
     time_t utc;
     char *ep;
 
-    st->cp = st->tstr + 1;	/* make sure it is set */
-    if (!STRMOD_MATCHX(st->tstr, "localtime", 9))
+    st->cp = mod + 1;	/* make sure it is set */
+    if (!STRMOD_MATCHX(mod, "localtime", 9))
 	return FALSE;
 
-    if (st->tstr[9] == '=') {
-	utc = strtoul(&st->tstr[10], &ep, 10);
+    if (mod[9] == '=') {
+	utc = strtoul(mod + 10, &ep, 10);
 	st->cp = ep;
     } else {
 	utc = 0;
-	st->cp = st->tstr + 9;
+	st->cp = mod + 9;
     }
     st->newStr = VarStrftime(st->nstr, 0, utc);
     st->termc = *st->cp;
@@ -2252,26 +2251,24 @@ ApplyModifier_Localtime(ApplyModifiersSt
 
 /* :hash */
 static Boolean
-ApplyModifier_Hash(ApplyModifiersState *st)
+ApplyModifier_Hash(const char *mod, ApplyModifiersState *st)
 {
-    st->cp = st->tstr + 1;	/* make sure it is set */
-    if (!STRMOD_MATCH(st->tstr, "hash", 4))
+    st->cp = mod + 1;	/* make sure it is set */
+    if (!STRMOD_MATCH(mod, "hash", 4))
 	return FALSE;
     st->newStr = VarHash(st->nstr);
-    st->cp = st->tstr + 4;
+    st->cp = mod + 4;
     st->termc = *st->cp;
     return TRUE;
 }
 
 /* :P */
 static void
-ApplyModifier_Path(ApplyModifiersState *st)
+ApplyModifier_Path(const char *mod, ApplyModifiersState *st)
 {
-    GNode *gn;
-
     if ((st->v->flags & VAR_JUNK) != 0)
 	st->v->flags |= VAR_KEEP;
-    gn = Targ_FindNode(st->v->name, TARG_NOCREATE);
+    GNode *gn = Targ_FindNode(st->v->name, TARG_NOCREATE);
     if (gn == NULL || gn->type & OP_NOPATH) {
 	st->newStr = NULL;
     } else if (gn->path) {
@@ -2281,15 +2278,15 @@ ApplyModifier_Path(ApplyModifiersState *
     }
     if (!st->newStr)
 	st->newStr = bmake_strdup(st->v->name);
-    st->cp = ++st->tstr;
-    st->termc = *st->tstr;
+    st->cp = mod + 1;
+    st->termc = *st->cp;
 }
 
 /* :!cmd! */
 static Boolean
-ApplyModifier_Exclam(ApplyModifiersState *st)
+ApplyModifier_Exclam(const char *mod, ApplyModifiersState *st)
 {
-    st->cp = ++st->tstr;
+    st->cp = mod + 1;
     char delim = '!';
     char *cmd = ParseModifierPart(st->ctxt, &st->cp, delim, st->eflags,
 				  NULL, NULL, NULL);
@@ -2316,21 +2313,21 @@ ApplyModifier_Exclam(ApplyModifiersState
 
 /* :range */
 static Boolean
-ApplyModifier_Range(ApplyModifiersState *st)
+ApplyModifier_Range(const char *mod, ApplyModifiersState *st)
 {
     int n;
     char *ep;
 
-    st->cp = st->tstr + 1;	/* make sure it is set */
-    if (!STRMOD_MATCHX(st->tstr, "range", 5))
+    st->cp = mod + 1;	/* make sure it is set */
+    if (!STRMOD_MATCHX(mod, "range", 5))
 	return FALSE;
 
-    if (st->tstr[5] == '=') {
-	n = strtoul(&st->tstr[6], &ep, 10);
+    if (mod[5] == '=') {
+	n = strtoul(mod + 6, &ep, 10);
 	st->cp = ep;
     } else {
 	n = 0;
-	st->cp = st->tstr + 5;
+	st->cp = mod + 5;
     }
     st->newStr = VarRange(st->nstr, n);
     st->termc = *st->cp;
@@ -2339,7 +2336,7 @@ ApplyModifier_Range(ApplyModifiersState 
 
 /* :Mpattern or :Npattern */
 static void
-ApplyModifier_Match(ApplyModifiersState *st)
+ApplyModifier_Match(const char *mod, ApplyModifiersState *st)
 {
     Boolean copy = FALSE;	/* pattern should be, or has been, copied */
     Boolean needSubst = FALSE;
@@ -2349,7 +2346,7 @@ ApplyModifier_Match(ApplyModifiersState 
      * XXX This will likely not work right if $() and ${} are intermixed.
      */
     int nest = 1;
-    for (st->cp = st->tstr + 1;
+    for (st->cp = mod + 1;
 	 *st->cp != '\0' && !(*st->cp == ':' && nest == 1);
 	 st->cp++) {
 	if (*st->cp == '\\' &&
@@ -2378,13 +2375,13 @@ ApplyModifier_Match(ApplyModifiersState 
 	/*
 	 * Need to compress the \:'s out of the pattern, so
 	 * allocate enough room to hold the uncompressed
-	 * pattern (note that st->cp started at st->tstr+1, so
-	 * st->cp - st->tstr takes the null byte into account) and
+	 * pattern (note that st->cp started at mod+1, so
+	 * st->cp - mod takes the null byte into account) and
 	 * compress the pattern into the space.
 	 */
-	pattern = bmake_malloc(st->cp - st->tstr);
+	pattern = bmake_malloc(st->cp - mod);
 	char *cp2;
-	for (cp2 = pattern, st->cp = st->tstr + 1;
+	for (cp2 = pattern, st->cp = mod + 1;
 	     st->cp < endpat;
 	     st->cp++, cp2++) {
 	    if ((*st->cp == '\\') && (st->cp+1 < endpat) &&
@@ -2399,7 +2396,7 @@ ApplyModifier_Match(ApplyModifiersState 
 	 * Either Var_Subst or ModifyWords will need a
 	 * nul-terminated string soon, so construct one now.
 	 */
-	pattern = bmake_strndup(st->tstr+1, endpat - (st->tstr + 1));
+	pattern = bmake_strndup(mod + 1, endpat - (mod + 1));
     }
     if (needSubst) {
 	/* pattern contains embedded '$', so use Var_Subst to expand it. */
@@ -2410,7 +2407,7 @@ ApplyModifier_Match(ApplyModifiersState 
     if (DEBUG(VAR))
 	fprintf(debug_file, "Pattern[%s] for [%s] is [%s]\n",
 	    st->v->name, st->nstr, pattern);
-    ModifyWordsCallback callback = st->tstr[0] == 'M'
+    ModifyWordsCallback callback = mod[0] == 'M'
 	? ModifyWord_Match : ModifyWord_NoMatch;
     st->newStr = ModifyWords(st->ctxt, &st->parsestate, st->nstr,
 			     callback, pattern);
@@ -2419,24 +2416,24 @@ ApplyModifier_Match(ApplyModifiersState 
 
 /* :S,from,to, */
 static Boolean
-ApplyModifier_Subst(ApplyModifiersState *st)
+ApplyModifier_Subst(const char * const mod, ApplyModifiersState *st)
 {
     ModifyWord_SubstArgs args;
     Var_Parse_State tmpparsestate = st->parsestate;
-    char delim = st->tstr[1];
-    st->tstr += 2;
+    char delim = mod[1];
+
+    st->cp = mod + 2;
 
     /*
      * If pattern begins with '^', it is anchored to the
      * start of the word -- skip over it and flag pattern.
      */
     args.pflags = 0;
-    if (*st->tstr == '^') {
+    if (*st->cp == '^') {
 	args.pflags |= VARP_ANCHOR_START;
-	st->tstr++;
+	st->cp++;
     }
 
-    st->cp = st->tstr;
     char *lhs = ParseModifierPart(st->ctxt, &st->cp, delim, st->eflags,
 				  &args.pflags, &args.lhsLen, NULL);
     if (lhs == NULL) {
@@ -2486,16 +2483,15 @@ ApplyModifier_Subst(ApplyModifiersState 
 
 /* :C,from,to, */
 static Boolean
-ApplyModifier_Regex(ApplyModifiersState *st)
+ApplyModifier_Regex(const char *mod, ApplyModifiersState *st)
 {
     ModifyWord_SubstRegexArgs args;
 
     args.pflags = 0;
     Var_Parse_State tmpparsestate = st->parsestate;
-    char delim = st->tstr[1];
-    st->tstr += 2;
+    char delim = mod[1];
 
-    st->cp = st->tstr;
+    st->cp = mod + 2;
 
     char *re = ParseModifierPart(st->ctxt, &st->cp, delim,
 				 st->eflags, NULL, NULL, NULL);
@@ -2561,10 +2557,8 @@ ModifyWord_Copy(const char *word, SepBuf
 
 /* :ts<separator> */
 static Boolean
-ApplyModifier_ToSep(ApplyModifiersState *st)
+ApplyModifier_ToSep(const char *sep, ApplyModifiersState *st)
 {
-    const char *sep = st->tstr + 2;
-
     if (sep[0] != st->endc && (sep[1] == st->endc || sep[1] == ':')) {
 	/* ":ts<unrecognised><endc>" or ":ts<unrecognised>:" */
 	st->parsestate.varSpace = sep[0];
@@ -2618,40 +2612,40 @@ ApplyModifier_ToSep(ApplyModifiersState 
 
 /* :tA, :tu, :tl, :ts<separator>, etc. */
 static Boolean
-ApplyModifier_To(ApplyModifiersState *st)
+ApplyModifier_To(const char *mod, ApplyModifiersState *st)
 {
-    st->cp = st->tstr + 1;	/* make sure it is set */
-    if (st->tstr[1] == st->endc || st->tstr[1] == ':')
+    st->cp = mod + 1;	/* make sure it is set */
+    if (mod[1] == st->endc || mod[1] == ':')
 	return FALSE;		/* Found ":t<endc>" or ":t:". */
 
-    if (st->tstr[1] == 's')
-	return ApplyModifier_ToSep(st);
+    if (mod[1] == 's')
+	return ApplyModifier_ToSep(mod + 2, st);
 
-    if (st->tstr[2] != st->endc && st->tstr[2] != ':')
+    if (mod[2] != st->endc && mod[2] != ':')
 	return FALSE;		/* Found ":t<unrecognised><unrecognised>". */
 
     /* Check for two-character options: ":tu", ":tl" */
-    if (st->tstr[1] == 'A') {	/* absolute path */
+    if (mod[1] == 'A') {	/* absolute path */
 	st->newStr = ModifyWords(st->ctxt, &st->parsestate, st->nstr,
 				 ModifyWord_Realpath, NULL);
-	st->cp = st->tstr + 2;
+	st->cp = mod + 2;
 	st->termc = *st->cp;
-    } else if (st->tstr[1] == 'u') {
+    } else if (mod[1] == 'u') {
 	char *dp = bmake_strdup(st->nstr);
 	for (st->newStr = dp; *dp; dp++)
 	    *dp = toupper((unsigned char)*dp);
-	st->cp = st->tstr + 2;
+	st->cp = mod + 2;
 	st->termc = *st->cp;
-    } else if (st->tstr[1] == 'l') {
+    } else if (mod[1] == 'l') {
 	char *dp = bmake_strdup(st->nstr);
 	for (st->newStr = dp; *dp; dp++)
 	    *dp = tolower((unsigned char)*dp);
-	st->cp = st->tstr + 2;
+	st->cp = mod + 2;
 	st->termc = *st->cp;
-    } else if (st->tstr[1] == 'W' || st->tstr[1] == 'w') {
-	st->parsestate.oneBigWord = (st->tstr[1] == 'W');
+    } else if (mod[1] == 'W' || mod[1] == 'w') {
+	st->parsestate.oneBigWord = (mod[1] == 'W');
 	st->newStr = st->nstr;
-	st->cp = st->tstr + 2;
+	st->cp = mod + 2;
 	st->termc = *st->cp;
     } else {
 	/* Found ":t<unrecognised>:" or ":t<unrecognised><endc>". */
@@ -2662,9 +2656,9 @@ ApplyModifier_To(ApplyModifiersState *st
 
 /* :[#], :[1], etc. */
 static int
-ApplyModifier_Words(ApplyModifiersState *st)
+ApplyModifier_Words(const char *mod, ApplyModifiersState *st)
 {
-    st->cp = st->tstr + 1;	/* point to char after '[' */
+    st->cp = mod + 1;	/* point to char after '[' */
     char delim = ']';		/* look for closing ']' */
     char *estr = ParseModifierPart(st->ctxt, &st->cp, delim, st->eflags,
 				   NULL, NULL, NULL);
@@ -2772,18 +2766,18 @@ bad_modifier:
 
 /* :O or :Ox */
 static Boolean
-ApplyModifier_Order(ApplyModifiersState *st)
+ApplyModifier_Order(const char *mod, ApplyModifiersState *st)
 {
     char otype;
 
-    st->cp = st->tstr + 1;	/* skip to the rest in any case */
-    if (st->tstr[1] == st->endc || st->tstr[1] == ':') {
+    st->cp = mod + 1;	/* skip to the rest in any case */
+    if (mod[1] == st->endc || mod[1] == ':') {
 	otype = 's';
 	st->termc = *st->cp;
-    } else if ((st->tstr[1] == 'r' || st->tstr[1] == 'x') &&
-	       (st->tstr[2] == st->endc || st->tstr[2] == ':')) {
-	otype = st->tstr[1];
-	st->cp = st->tstr + 2;
+    } else if ((mod[1] == 'r' || mod[1] == 'x') &&
+	       (mod[2] == st->endc || mod[2] == ':')) {
+	otype = mod[1];
+	st->cp = mod + 2;
 	st->termc = *st->cp;
     } else {
 	return FALSE;
@@ -2794,7 +2788,7 @@ ApplyModifier_Order(ApplyModifiersState 
 
 /* :? then : else */
 static Boolean
-ApplyModifier_IfElse(ApplyModifiersState *st)
+ApplyModifier_IfElse(const char *mod, ApplyModifiersState *st)
 {
     Boolean value = FALSE;
     int cond_rc = 0;
@@ -2809,7 +2803,7 @@ ApplyModifier_IfElse(ApplyModifiersState
 	    else_eflags |= VARE_WANTRES;
     }
 
-    st->cp = ++st->tstr;
+    st->cp = mod + 1;
     char delim = ':';
     char *then_expr = ParseModifierPart(
 	st->ctxt, &st->cp, delim, then_eflags, NULL, NULL, NULL);
@@ -2867,9 +2861,9 @@ ApplyModifier_IfElse(ApplyModifiersState
  *			variable.
  */
 static int
-ApplyModifier_Assign(ApplyModifiersState *st)
+ApplyModifier_Assign(const char *mod, ApplyModifiersState *st)
 {
-    const char *op = st->tstr + 1;
+    const char *op = mod + 1;
     if (!(op[0] == '=' ||
 	(op[1] == '=' &&
 	 (op[0] == '!' || op[0] == '+' || op[0] == '?'))))
@@ -2882,7 +2876,6 @@ ApplyModifier_Assign(ApplyModifiersState
 
     v_ctxt = st->ctxt;
     char *sv_name = NULL;
-    ++st->tstr;
     if (st->v->flags & VAR_JUNK) {
 	/*
 	 * We need to bmake_strdup() it incase ParseModifierPart() recurses.
@@ -2901,10 +2894,10 @@ ApplyModifier_Assign(ApplyModifiersState
     case '+':
     case '?':
     case '!':
-	st->cp = &st->tstr[2];
+	st->cp = mod + 3;
 	break;
     default:
-	st->cp = ++st->tstr;
+	st->cp = mod + 2;
 	break;
     }
 
@@ -2955,13 +2948,13 @@ ApplyModifier_Assign(ApplyModifiersState
 
 /* remember current value */
 static Boolean
-ApplyModifier_Remember(ApplyModifiersState *st)
+ApplyModifier_Remember(const char *mod, ApplyModifiersState *st)
 {
-    st->cp = st->tstr + 1;	/* make sure it is set */
-    if (!STRMOD_MATCHX(st->tstr, "_", 1))
+    st->cp = mod + 1;	/* make sure it is set */
+    if (!STRMOD_MATCHX(mod, "_", 1))
 	return FALSE;
 
-    if (st->tstr[1] == '=') {
+    if (mod[1] == '=') {
 	char *np;
 	int n;
 
@@ -2969,7 +2962,7 @@ ApplyModifier_Remember(ApplyModifiersSta
 	n = strcspn(st->cp, ":)}");
 	np = bmake_strndup(st->cp, n + 1);
 	np[n] = '\0';
-	st->cp = st->tstr + 2 + n;
+	st->cp = mod + 2 + n;
 	Var_Set(np, st->nstr, st->ctxt);
 	free(np);
     } else {
@@ -2983,7 +2976,7 @@ ApplyModifier_Remember(ApplyModifiersSta
 #ifdef SYSVVARSUB
 /* :from=to */
 static int
-ApplyModifier_SysV(ApplyModifiersState *st)
+ApplyModifier_SysV(const char *mod, ApplyModifiersState *st)
 {
     Boolean eqFound = FALSE;
 
@@ -2992,7 +2985,7 @@ ApplyModifier_SysV(ApplyModifiersState *
      * to verify it is a SYSV-make-style translation:
      * it must be: <string1>=<string2>)
      */
-    st->cp = st->tstr;
+    st->cp = mod;
     int nest = 1;
     while (*st->cp != '\0' && nest > 0) {
 	if (*st->cp == '=') {
@@ -3009,7 +3002,7 @@ ApplyModifier_SysV(ApplyModifiersState *
 	return 0;
 
     char delim = '=';
-    st->cp = st->tstr;
+    st->cp = mod;
     char *lhs = ParseModifierPart(st->ctxt, &st->cp, delim, st->eflags,
 				  NULL, NULL, NULL);
     if (lhs == NULL) {
@@ -3117,13 +3110,14 @@ ApplyModifiers(char *nstr, const char *t
 {
     ApplyModifiersState st = {
 	startc, endc, v, ctxt, eflags, lengthPtr, freePtr,
-	nstr, tstr, tstr, tstr,
+	nstr, tstr, tstr,
 	'\0', '\0', 0, {' ', FALSE}, NULL
     };
 
-    while (*st.tstr && *st.tstr != st.endc) {
+    const char *p = tstr;
+    while (*p != '\0' && *p != endc) {
 
-	if (*st.tstr == '$') {
+	if (*p == '$') {
 	    /*
 	     * We may have some complex modifiers in a variable.
 	     */
@@ -3132,14 +3126,14 @@ ApplyModifiers(char *nstr, const char *t
 	    int rlen;
 	    int c;
 
-	    rval = Var_Parse(st.tstr, st.ctxt, st.eflags, &rlen, &freeIt);
+	    rval = Var_Parse(p, st.ctxt, st.eflags, &rlen, &freeIt);
 
 	    /*
 	     * If we have not parsed up to st.endc or ':',
 	     * we are not interested.
 	     */
 	    if (rval != NULL && *rval &&
-		(c = st.tstr[rlen]) != '\0' &&
+		(c = p[rlen]) != '\0' &&
 		c != ':' &&
 		c != st.endc) {
 		free(freeIt);
@@ -3148,10 +3142,10 @@ ApplyModifiers(char *nstr, const char *t
 
 	    if (DEBUG(VAR)) {
 		fprintf(debug_file, "Got '%s' from '%.*s'%.*s\n",
-		       rval, rlen, st.tstr, rlen, st.tstr + rlen);
+		       rval, rlen, p, rlen, p + rlen);
 	    }
 
-	    st.tstr += rlen;
+	    p += rlen;
 
 	    if (rval != NULL && *rval) {
 		int used;
@@ -3166,9 +3160,9 @@ ApplyModifiers(char *nstr, const char *t
 		}
 	    }
 	    free(freeIt);
-	    if (*st.tstr == ':')
-		st.tstr++;
-	    else if (!*st.tstr && st.endc) {
+	    if (*p == ':')
+		p++;
+	    else if (*p == '\0' && endc != '\0') {
 		Error("Unclosed variable specification after complex "
 		    "modifier (expecting '%c') for %s", st.endc, st.v->name);
 		goto out;
@@ -3178,13 +3172,13 @@ ApplyModifiers(char *nstr, const char *t
     apply_mods:
 	if (DEBUG(VAR)) {
 	    fprintf(debug_file, "Applying[%s] :%c to \"%s\"\n", st.v->name,
-		*st.tstr, st.nstr);
+		*p, st.nstr);
 	}
 	st.newStr = var_Error;
-	switch ((st.modifier = *st.tstr)) {
+	switch ((st.modifier = *p)) {
 	case ':':
 	    {
-		int res = ApplyModifier_Assign(&st);
+		int res = ApplyModifier_Assign(p, &st);
 		if (res == 'b')
 		    goto bad_modifier;
 		if (res == 'c')
@@ -3194,35 +3188,35 @@ ApplyModifiers(char *nstr, const char *t
 		break;
 	    }
 	case '@':
-	    ApplyModifier_Loop(&st);
+	    ApplyModifier_Loop(p, &st);
 	    break;
 	case '_':
-	    if (!ApplyModifier_Remember(&st))
+	    if (!ApplyModifier_Remember(p, &st))
 		goto default_case;
 	    break;
 	case 'D':
 	case 'U':
-	    ApplyModifier_Defined(&st);
+	    ApplyModifier_Defined(p, &st);
 	    break;
 	case 'L':
 	    {
 		if ((st.v->flags & VAR_JUNK) != 0)
 		    st.v->flags |= VAR_KEEP;
 		st.newStr = bmake_strdup(st.v->name);
-		st.cp = ++st.tstr;
-		st.termc = *st.tstr;
+		st.cp = p + 1;
+		st.termc = *st.cp;
 		break;
 	    }
 	case 'P':
-	    ApplyModifier_Path(&st);
+	    ApplyModifier_Path(p, &st);
 	    break;
 	case '!':
-	    if (!ApplyModifier_Exclam(&st))
+	    if (!ApplyModifier_Exclam(p, &st))
 		goto cleanup;
 	    break;
 	case '[':
 	    {
-		int res = ApplyModifier_Words(&st);
+		int res = ApplyModifier_Words(p, &st);
 		if (res == 'b')
 		    goto bad_modifier;
 		if (res == 'c')
@@ -3230,103 +3224,103 @@ ApplyModifiers(char *nstr, const char *t
 		break;
 	    }
 	case 'g':
-	    if (!ApplyModifier_Gmtime(&st))
+	    if (!ApplyModifier_Gmtime(p, &st))
 		goto default_case;
 	    break;
 	case 'h':
-	    if (!ApplyModifier_Hash(&st))
+	    if (!ApplyModifier_Hash(p, &st))
 		goto default_case;
 	    break;
 	case 'l':
-	    if (!ApplyModifier_Localtime(&st))
+	    if (!ApplyModifier_Localtime(p, &st))
 		goto default_case;
 	    break;
 	case 't':
-	    if (!ApplyModifier_To(&st))
+	    if (!ApplyModifier_To(p, &st))
 		goto bad_modifier;
 	    break;
 	case 'N':
 	case 'M':
-	    ApplyModifier_Match(&st);
+	    ApplyModifier_Match(p, &st);
 	    break;
 	case 'S':
-	    if (!ApplyModifier_Subst(&st))
+	    if (!ApplyModifier_Subst(p, &st))
 		goto cleanup;
 	    break;
 	case '?':
-	    if (!ApplyModifier_IfElse(&st))
+	    if (!ApplyModifier_IfElse(p, &st))
 		goto cleanup;
 	    break;
 #ifndef NO_REGEX
 	case 'C':
-	    if (!ApplyModifier_Regex(&st))
+	    if (!ApplyModifier_Regex(p, &st))
 		goto cleanup;
 	    break;
 #endif
 	case 'q':
 	case 'Q':
-	    if (st.tstr[1] == st.endc || st.tstr[1] == ':') {
+	    if (p[1] == st.endc || p[1] == ':') {
 		st.newStr = VarQuote(st.nstr, st.modifier == 'q');
-		st.cp = st.tstr + 1;
+		st.cp = p + 1;
 		st.termc = *st.cp;
 		break;
 	    }
 	    goto default_case;
 	case 'T':
-	    if (st.tstr[1] == st.endc || st.tstr[1] == ':') {
+	    if (p[1] == st.endc || p[1] == ':') {
 		st.newStr = ModifyWords(st.ctxt, &st.parsestate, st.nstr,
 					ModifyWord_Tail, NULL);
-		st.cp = st.tstr + 1;
+		st.cp = p + 1;
 		st.termc = *st.cp;
 		break;
 	    }
 	    goto default_case;
 	case 'H':
-	    if (st.tstr[1] == st.endc || st.tstr[1] == ':') {
+	    if (p[1] == st.endc || p[1] == ':') {
 		st.newStr = ModifyWords(st.ctxt, &st.parsestate, st.nstr,
 					ModifyWord_Head, NULL);
-		st.cp = st.tstr + 1;
+		st.cp = p + 1;
 		st.termc = *st.cp;
 		break;
 	    }
 	    goto default_case;
 	case 'E':
-	    if (st.tstr[1] == st.endc || st.tstr[1] == ':') {
+	    if (p[1] == st.endc || p[1] == ':') {
 		st.newStr = ModifyWords(st.ctxt, &st.parsestate, st.nstr,
 					ModifyWord_Suffix, NULL);
-		st.cp = st.tstr + 1;
+		st.cp = p + 1;
 		st.termc = *st.cp;
 		break;
 	    }
 	    goto default_case;
 	case 'R':
-	    if (st.tstr[1] == st.endc || st.tstr[1] == ':') {
+	    if (p[1] == st.endc || p[1] == ':') {
 		st.newStr = ModifyWords(st.ctxt, &st.parsestate, st.nstr,
 					ModifyWord_Root, NULL);
-		st.cp = st.tstr + 1;
+		st.cp = p + 1;
 		st.termc = *st.cp;
 		break;
 	    }
 	    goto default_case;
 	case 'r':
-	    if (!ApplyModifier_Range(&st))
+	    if (!ApplyModifier_Range(p, &st))
 		goto default_case;
 	    break;
 	case 'O':
-	    if (!ApplyModifier_Order(&st))
+	    if (!ApplyModifier_Order(p, &st))
 		goto bad_modifier;
 	    break;
 	case 'u':
-	    if (st.tstr[1] == st.endc || st.tstr[1] == ':') {
+	    if (p[1] == st.endc || p[1] == ':') {
 		st.newStr = VarUniq(st.nstr);
-		st.cp = st.tstr + 1;
+		st.cp = p + 1;
 		st.termc = *st.cp;
 		break;
 	    }
 	    goto default_case;
 #ifdef SUNSHCMD
 	case 's':
-	    if (st.tstr[1] == 'h' && (st.tstr[2] == st.endc || st.tstr[2] == ':')) {
+	    if (p[1] == 'h' && (p[2] == st.endc || p[2] == ':')) {
 		const char *emsg;
 		if (st.eflags & VARE_WANTRES) {
 		    st.newStr = Cmd_Exec(st.nstr, &emsg);
@@ -3334,7 +3328,7 @@ ApplyModifiers(char *nstr, const char *t
 			Error(emsg, st.nstr);
 		} else
 		    st.newStr = varNoError;
-		st.cp = st.tstr + 2;
+		st.cp = p + 2;
 		st.termc = *st.cp;
 		break;
 	    }
@@ -3344,14 +3338,14 @@ ApplyModifiers(char *nstr, const char *t
 	default_case:
 	    {
 #ifdef SYSVVARSUB
-		int res = ApplyModifier_SysV(&st);
+		int res = ApplyModifier_SysV(p, &st);
 		if (res == 'c')
 		    goto cleanup;
 		if (res != '=')
 #endif
 		{
-		    Error("Unknown modifier '%c'", *st.tstr);
-		    for (st.cp = st.tstr+1;
+		    Error("Unknown modifier '%c'", *p);
+		    for (st.cp = p + 1;
 			 *st.cp != ':' && *st.cp != st.endc && *st.cp != '\0';
 			 st.cp++)
 			continue;
@@ -3382,16 +3376,15 @@ ApplyModifiers(char *nstr, const char *t
 	} else if (st.termc == ':') {
 	    st.cp++;
 	}
-	st.tstr = st.cp;
+	p = st.cp;
     }
 out:
-    *st.lengthPtr = st.tstr - st.start;
+    *st.lengthPtr = p - st.start;
     return st.nstr;
 
 bad_modifier:
-    /* "{(" */
-    Error("Bad modifier `:%.*s' for %s", (int)strcspn(st.tstr, ":)}"), st.tstr,
-	  st.v->name);
+    Error("Bad modifier `:%.*s' for %s",
+	  (int)strcspn(p, ":)}"), p, st.v->name);
 
 cleanup:
     *st.lengthPtr = st.cp - st.start;

Reply via email to