diff options
author | adam <adam@FreeBSD.org> | 1995-11-01 12:18:32 +0000 |
---|---|---|
committer | adam <adam@FreeBSD.org> | 1995-11-01 12:18:32 +0000 |
commit | e8894e8b3819d60167ef5d7d414df66575948fc7 (patch) | |
tree | 74f78c26f1e97f1130f627bdb9e1acef51b84d99 | |
parent | a86aed0f23da053d84b317b36f0071f1112950d2 (diff) | |
download | FreeBSD-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.
-rw-r--r-- | usr.bin/make/var.c | 22 |
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: |