Module Name: src
Committed By: rillig
Date: Sun Jul 19 13:21:56 UTC 2020
Modified Files:
src/usr.bin/make: var.c
Log Message:
make(1): rename flags for :S and :C pattern matching
Renaming these flags makes it obvious that VarPattern is used in a few
places where it doesn't belong. These will be fixed in follow-up
commits.
To generate a diff of this commit:
cvs rdiff -u -r1.260 -r1.261 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.260 src/usr.bin/make/var.c:1.261
--- src/usr.bin/make/var.c:1.260 Sun Jul 19 12:51:06 2020
+++ src/usr.bin/make/var.c Sun Jul 19 13:21:56 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.260 2020/07/19 12:51:06 rillig Exp $ */
+/* $NetBSD: var.c,v 1.261 2020/07/19 13:21:56 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
*/
#ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: var.c,v 1.260 2020/07/19 12:51:06 rillig Exp $";
+static char rcsid[] = "$NetBSD: var.c,v 1.261 2020/07/19 13:21:56 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.260 2020/07/19 12:51:06 rillig Exp $");
+__RCSID("$NetBSD: var.c,v 1.261 2020/07/19 13:21:56 rillig Exp $");
#endif
#endif /* not lint */
#endif
@@ -235,14 +235,18 @@ static int var_exportedVars = VAR_EXPORT
*/
#define VAR_EXPORT_LITERAL 2
+/* Flags for pattern matching in the :S and :C modifiers */
typedef enum {
- VAR_SUB_GLOBAL = 0x01, /* Apply substitution globally */
- VAR_SUB_ONE = 0x02, /* Apply substitution to one word */
- VAR_SUB_MATCHED = 0x04, /* There was a match */
- VAR_MATCH_START = 0x08, /* Match at start of word */
- VAR_MATCH_END = 0x10, /* Match at end of word */
- VAR_NOSUBST = 0x20 /* don't expand vars in VarGetPattern */
-} VarPattern_Flags;
+ VARP_SUB_GLOBAL = 0x01, /* Apply substitution globally */
+ VARP_SUB_ONE = 0x02, /* Apply substitution to one word */
+ VARP_SUB_MATCHED = 0x04, /* There was a match */
+ VARP_MATCH_START = 0x08, /* Match at start of word */
+ VARP_MATCH_END = 0x10, /* Match at end of word */
+
+ /* FIXME: This constant doesn't belong here. It is not related to
+ * pattern matching, and VarGetPattern is badly named as well. */
+ VAR_NOSUBST = 0x20 /* don't expand vars in VarGetPattern */
+} VarPatternFlags;
typedef enum {
VAR_NO_EXPORT = 0x01 /* do not export */
@@ -269,7 +273,7 @@ typedef struct {
int leftLen; /* Length of string */
const char *rhs; /* Replacement string (w/ &'s removed) */
int rightLen; /* Length of replacement */
- VarPattern_Flags flags;
+ VarPatternFlags pflags;
} VarPattern;
/* struct passed as 'void *' to VarLoopExpand() for ":@tvar@str@" */
@@ -289,7 +293,7 @@ typedef struct {
int nsub;
regmatch_t *matches;
char *replace;
- int flags;
+ VarPatternFlags pflags;
} VarREPattern;
#endif
@@ -1360,18 +1364,18 @@ VarSubstitute(GNode *ctx MAKE_ATTR_UNUSE
const char *cp; /* General pointer */
VarPattern *pattern = data;
- if ((pattern->flags & (VAR_SUB_ONE|VAR_SUB_MATCHED)) !=
- (VAR_SUB_ONE|VAR_SUB_MATCHED)) {
+ if ((pattern->pflags & (VARP_SUB_ONE | VARP_SUB_MATCHED)) !=
+ (VARP_SUB_ONE | VARP_SUB_MATCHED)) {
/*
* Still substituting -- break it down into simple anchored cases
* and if none of them fits, perform the general substitution case.
*/
- if ((pattern->flags & VAR_MATCH_START) &&
+ if ((pattern->pflags & VARP_MATCH_START) &&
(strncmp(word, pattern->lhs, pattern->leftLen) == 0)) {
/*
* Anchored at start and beginning of word matches pattern
*/
- if ((pattern->flags & VAR_MATCH_END) &&
+ if ((pattern->pflags & VARP_MATCH_END) &&
(wordLen == pattern->leftLen)) {
/*
* Also anchored at end and matches to the end (word
@@ -1385,8 +1389,8 @@ VarSubstitute(GNode *ctx MAKE_ATTR_UNUSE
addSpace = TRUE;
Buf_AddBytes(buf, pattern->rightLen, pattern->rhs);
}
- pattern->flags |= VAR_SUB_MATCHED;
- } else if (pattern->flags & VAR_MATCH_END) {
+ pattern->pflags |= VARP_SUB_MATCHED;
+ } else if (pattern->pflags & VARP_MATCH_END) {
/*
* Doesn't match to end -- copy word wholesale
*/
@@ -1404,14 +1408,14 @@ VarSubstitute(GNode *ctx MAKE_ATTR_UNUSE
Buf_AddBytes(buf, pattern->rightLen, pattern->rhs);
Buf_AddBytes(buf, wordLen - pattern->leftLen,
(word + pattern->leftLen));
- pattern->flags |= VAR_SUB_MATCHED;
+ pattern->pflags |= VARP_SUB_MATCHED;
}
- } else if (pattern->flags & VAR_MATCH_START) {
+ } else if (pattern->pflags & VARP_MATCH_START) {
/*
* Had to match at start of word and didn't -- copy whole word.
*/
goto nosub;
- } else if (pattern->flags & VAR_MATCH_END) {
+ } else if (pattern->pflags & VARP_MATCH_END) {
/*
* Anchored at end, Find only place match could occur (leftLen
* characters from the end of the word) and see if it does. Note
@@ -1435,7 +1439,7 @@ VarSubstitute(GNode *ctx MAKE_ATTR_UNUSE
}
Buf_AddBytes(buf, cp - word, word);
Buf_AddBytes(buf, pattern->rightLen, pattern->rhs);
- pattern->flags |= VAR_SUB_MATCHED;
+ pattern->pflags |= VARP_SUB_MATCHED;
} else {
/*
* Had to match at end and didn't. Copy entire word.
@@ -1473,10 +1477,10 @@ VarSubstitute(GNode *ctx MAKE_ATTR_UNUSE
if (wordLen == 0) {
done = TRUE;
}
- if ((pattern->flags & VAR_SUB_GLOBAL) == 0) {
+ if ((pattern->pflags & VARP_SUB_GLOBAL) == 0) {
done = TRUE;
}
- pattern->flags |= VAR_SUB_MATCHED;
+ pattern->pflags |= VARP_SUB_MATCHED;
} else {
done = TRUE;
}
@@ -1548,8 +1552,8 @@ VarRESubstitute(GNode *ctx MAKE_ATTR_UNU
Buf_AddByte(buf, ' '); \
added = 1
- if ((pat->flags & (VAR_SUB_ONE|VAR_SUB_MATCHED)) ==
- (VAR_SUB_ONE|VAR_SUB_MATCHED))
+ if ((pat->pflags & (VARP_SUB_ONE | VARP_SUB_MATCHED)) ==
+ (VARP_SUB_ONE | VARP_SUB_MATCHED))
xrv = REG_NOMATCH;
else {
tryagain:
@@ -1558,7 +1562,7 @@ VarRESubstitute(GNode *ctx MAKE_ATTR_UNU
switch (xrv) {
case 0:
- pat->flags |= VAR_SUB_MATCHED;
+ pat->pflags |= VARP_SUB_MATCHED;
if (pat->matches[0].rm_so > 0) {
MAYBE_ADD_SPACE();
Buf_AddBytes(buf, pat->matches[0].rm_so, wp);
@@ -1612,7 +1616,7 @@ VarRESubstitute(GNode *ctx MAKE_ATTR_UNU
}
}
wp += pat->matches[0].rm_eo;
- if (pat->flags & VAR_SUB_GLOBAL) {
+ if (pat->pflags & VARP_SUB_GLOBAL) {
flags |= REG_NOTBOL;
if (pat->matches[0].rm_so == 0 && pat->matches[0].rm_eo == 0) {
MAYBE_ADD_SPACE();
@@ -2043,14 +2047,14 @@ VarRange(const char *str, int ac)
*/
static char *
VarGetPattern(GNode *ctxt, Var_Parse_State *vpstate MAKE_ATTR_UNUSED,
- VarPattern_Flags flags, const char **tstr, int delim,
- VarPattern_Flags *vflags, int *length, VarPattern *pattern)
+ VarEvalFlags eflags, const char **tstr, int delim,
+ VarPatternFlags *mpflags, int *length, VarPattern *pattern)
{
const char *cp;
char *rstr;
Buffer buf;
int junk;
- int errnum = flags & VARE_UNDEFERR;
+ VarEvalFlags errnum = eflags & VARE_UNDEFERR;
Buf_Init(&buf, 0);
if (length == NULL)
@@ -2072,16 +2076,17 @@ VarGetPattern(GNode *ctxt, Var_Parse_Sta
cp++;
} else if (*cp == '$') {
if (cp[1] == delim) {
- if (vflags == NULL)
+ if (mpflags == NULL)
Buf_AddByte(&buf, *cp);
else
/*
* Unescaped $ at end of pattern => anchor
* pattern at end.
*/
- *vflags |= VAR_MATCH_END;
+ *mpflags |= VARP_MATCH_END;
} else {
- if (vflags == NULL || (*vflags & VAR_NOSUBST) == 0) {
+ /* FIXME: mismatch between mpflags and VAR_NOSUBST */
+ if (mpflags == NULL || !(*mpflags & VAR_NOSUBST)) {
char *cp2;
int len;
void *freeIt;
@@ -2091,7 +2096,7 @@ VarGetPattern(GNode *ctxt, Var_Parse_Sta
* delimiter, assume it's a variable
* substitution and recurse.
*/
- cp2 = Var_Parse(cp, ctxt, errnum | (flags & VARE_WANTRES),
+ cp2 = Var_Parse(cp, ctxt, errnum | (eflags & VARE_WANTRES),
&len, &freeIt);
Buf_AddBytes(&buf, strlen(cp2), cp2);
free(freeIt);
@@ -2319,19 +2324,19 @@ typedef struct {
static Boolean
ApplyModifier_At(ApplyModifiersState *st) {
VarLoop loop;
- VarPattern_Flags vflags = VAR_NOSUBST;
+ VarPatternFlags pflags = VAR_NOSUBST; /* FIXME: mismatch between pflags and VAR_NOSUBST */
- st->cp = ++(st->tstr);
+ st->cp = ++st->tstr;
st->delim = '@';
loop.tvar = VarGetPattern(
st->ctxt, &st->parsestate, st->flags, &st->cp, st->delim,
- &vflags, &loop.tvarLen, NULL);
+ &pflags, &loop.tvarLen, NULL);
if (loop.tvar == NULL)
return FALSE;
loop.str = VarGetPattern(
st->ctxt, &st->parsestate, st->flags, &st->cp, st->delim,
- &vflags, &loop.strLen, NULL);
+ &pflags, &loop.strLen, NULL);
if (loop.str == NULL)
return FALSE;
@@ -2500,7 +2505,7 @@ ApplyModifier_Exclam(ApplyModifiersState
const char *emsg;
VarPattern pattern;
- pattern.flags = 0;
+ pattern.pflags = 0;
st->delim = '!';
emsg = NULL;
@@ -2642,7 +2647,7 @@ ApplyModifier_Subst(ApplyModifiersState
VarPattern pattern;
Var_Parse_State tmpparsestate;
- pattern.flags = 0;
+ pattern.pflags = 0;
tmpparsestate = st->parsestate;
st->delim = st->tstr[1];
st->tstr += 2;
@@ -2652,14 +2657,14 @@ ApplyModifier_Subst(ApplyModifiersState
* start of the word -- skip over it and flag pattern.
*/
if (*st->tstr == '^') {
- pattern.flags |= VAR_MATCH_START;
- st->tstr += 1;
+ pattern.pflags |= VARP_MATCH_START;
+ st->tstr++;
}
st->cp = st->tstr;
pattern.lhs = VarGetPattern(
st->ctxt, &st->parsestate, st->flags, &st->cp, st->delim,
- &pattern.flags, &pattern.leftLen, NULL);
+ &pattern.pflags, &pattern.leftLen, NULL);
if (pattern.lhs == NULL)
return FALSE;
@@ -2677,10 +2682,10 @@ ApplyModifier_Subst(ApplyModifiersState
for (;; st->cp++) {
switch (*st->cp) {
case 'g':
- pattern.flags |= VAR_SUB_GLOBAL;
+ pattern.pflags |= VARP_SUB_GLOBAL;
continue;
case '1':
- pattern.flags |= VAR_SUB_ONE;
+ pattern.pflags |= VARP_SUB_ONE;
continue;
case 'W':
tmpparsestate.oneBigWord = TRUE;
@@ -2710,7 +2715,7 @@ ApplyModifier_Regex(ApplyModifiersState
int error;
Var_Parse_State tmpparsestate;
- pattern.flags = 0;
+ pattern.pflags = 0;
tmpparsestate = st->parsestate;
st->delim = st->tstr[1];
st->tstr += 2;
@@ -2734,10 +2739,10 @@ ApplyModifier_Regex(ApplyModifiersState
for (;; st->cp++) {
switch (*st->cp) {
case 'g':
- pattern.flags |= VAR_SUB_GLOBAL;
+ pattern.pflags |= VARP_SUB_GLOBAL;
continue;
case '1':
- pattern.flags |= VAR_SUB_ONE;
+ pattern.pflags |= VARP_SUB_ONE;
continue;
case 'W':
tmpparsestate.oneBigWord = TRUE;
@@ -2839,7 +2844,7 @@ ApplyModifier_To(ApplyModifiersState *st
* is a subsequent modifier, so do a no-op VarSubstitute now to for
* str to be re-expanded without the spaces.
*/
- pattern.flags = VAR_SUB_ONE;
+ pattern.pflags = VARP_SUB_ONE;
pattern.lhs = pattern.rhs = "\032";
pattern.leftLen = pattern.rightLen = 1;
@@ -3046,7 +3051,8 @@ ApplyModifier_IfElse(ApplyModifiersState
{
Boolean value;
int cond_rc;
- VarPattern_Flags then_flags, else_flags;
+ VarPatternFlags then_flags, else_flags;
+ /* FIXME: IfElse has nothing to do with VarPatternFlags */
/* find ':', and then substitute accordingly */
if (st->flags & VARE_WANTRES) {
@@ -3109,7 +3115,8 @@ ApplyModifier_Assign(ApplyModifiersState
char *sv_name;
VarPattern pattern;
int how;
- VarPattern_Flags vflags;
+ VarPatternFlags pflags;
+ /* FIXME: Assign has nothing to do with VarPatternFlags */
if (st->v->name[0] == 0)
return 'b';
@@ -3143,12 +3150,12 @@ ApplyModifier_Assign(ApplyModifiersState
break;
}
st->delim = st->startc == PROPEN ? PRCLOSE : BRCLOSE;
- pattern.flags = 0;
+ pattern.pflags = 0;
- vflags = (st->flags & VARE_WANTRES) ? 0 : VAR_NOSUBST;
+ pflags = (st->flags & VARE_WANTRES) ? 0 : VAR_NOSUBST;
pattern.rhs = VarGetPattern(
st->ctxt, &st->parsestate, st->flags, &st->cp, st->delim,
- &vflags, &pattern.rightLen, NULL);
+ &pflags, &pattern.rightLen, NULL);
if (st->v->flags & VAR_JUNK) {
/* restore original name */
free(st->v->name);
@@ -3226,9 +3233,10 @@ ApplyModifier_SysV(ApplyModifiersState *
* substitution command.
*/
VarPattern pattern;
+ /* FIXME: SysV modifiers have nothing to do with :S or :C pattern matching */
Boolean eqFound = FALSE;
- pattern.flags = 0;
+ pattern.pflags = 0;
/*
* First we make a pass through the string trying
@@ -3253,9 +3261,12 @@ ApplyModifier_SysV(ApplyModifiersState *
st->delim = '=';
st->cp = st->tstr;
+ /* FIXME: There's no point in having a single $ at the end of a
+ * SysV substitution since that will not be interpreted as an
+ * anchor anyway. */
pattern.lhs = VarGetPattern(
st->ctxt, &st->parsestate, st->flags, &st->cp, st->delim,
- &pattern.flags, &pattern.leftLen, NULL);
+ &pattern.pflags, &pattern.leftLen, NULL);
if (pattern.lhs == NULL)
return 'c';