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;