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;