summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authoradam <adam@FreeBSD.org>1995-11-01 12:18:32 +0000
committeradam <adam@FreeBSD.org>1995-11-01 12:18:32 +0000
commite8894e8b3819d60167ef5d7d414df66575948fc7 (patch)
tree74f78c26f1e97f1130f627bdb9e1acef51b84d99 /usr.bin
parenta86aed0f23da053d84b317b36f0071f1112950d2 (diff)
downloadFreeBSD-src-e8894e8b3819d60167ef5d7d414df66575948fc7.zip
FreeBSD-src-e8894e8b3819d60167ef5d7d414df66575948fc7.tar.gz
Fix the :S modifier to substitute in each word of the variable, according
to the description in the manpage. g flag means "replace every occurence in each word", and its absence means "replace first occurence in each word". Previously, absence of the g flag was implemented to mean "replace first occurence found in all words, and then stop replacing", which was incorrect.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/make/var.c22
1 files changed, 6 insertions, 16 deletions
diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c
index 851a80c..c0c9c36 100644
--- a/usr.bin/make/var.c
+++ b/usr.bin/make/var.c
@@ -147,7 +147,6 @@ typedef struct {
#define VAR_SUB_GLOBAL 1 /* Apply substitution globally */
#define VAR_MATCH_START 2 /* Match at start of word */
#define VAR_MATCH_END 4 /* Match at end of word */
-#define VAR_NO_SUB 8 /* Substitution is non-global and already done */
} VarPattern;
static int VarCmp __P((ClientData, ClientData));
@@ -883,9 +882,9 @@ VarSubstitute (word, addSpace, buf, patternp)
VarPattern *pattern = (VarPattern *) patternp;
wordLen = strlen(word);
- if ((pattern->flags & VAR_NO_SUB) == 0) {
+ if (1) { /* substitute in each word of the variable */
/*
- * Still substituting -- break it down into simple anchored cases
+ * Break substitution down into simple anchored cases
* and if none of them fits, perform the general substitution case.
*/
if ((pattern->flags & VAR_MATCH_START) &&
@@ -967,7 +966,7 @@ VarSubstitute (word, addSpace, buf, patternp)
* Pattern is unanchored: search for the pattern in the word using
* String_FindSubstring, copying unmatched portions and the
* right-hand-side for each match found, handling non-global
- * subsititutions correctly, etc. When the loop is done, any
+ * substitutions correctly, etc. When the loop is done, any
* remaining part of the word (word and wordLen are adjusted
* accordingly through the loop) is copied straight into the
* buffer.
@@ -990,13 +989,9 @@ VarSubstitute (word, addSpace, buf, patternp)
Buf_AddBytes(buf, pattern->rightLen, (Byte *)pattern->rhs);
wordLen -= (cp - word) + pattern->leftLen;
word = cp + pattern->leftLen;
- if (wordLen == 0) {
+ if (wordLen == 0 || (pattern->flags & VAR_SUB_GLOBAL) == 0){
done = TRUE;
}
- if ((pattern->flags & VAR_SUB_GLOBAL) == 0) {
- done = TRUE;
- pattern->flags |= VAR_NO_SUB;
- }
} else {
done = TRUE;
}
@@ -1015,14 +1010,9 @@ VarSubstitute (word, addSpace, buf, patternp)
return ((Buf_Size(buf) != origSize) || addSpace);
}
/*
- * Common code for anchored substitutions: if performed a substitution
- * and it's not supposed to be global, mark the pattern as requiring
- * no more substitutions. addSpace was set TRUE if characters were
- * added to the buffer.
+ * Common code for anchored substitutions:
+ * addSpace was set TRUE if characters were added to the buffer.
*/
- if ((pattern->flags & VAR_SUB_GLOBAL) == 0) {
- pattern->flags |= VAR_NO_SUB;
- }
return (addSpace);
}
nosub:
OpenPOWER on IntegriCloud