From e8894e8b3819d60167ef5d7d414df66575948fc7 Mon Sep 17 00:00:00 2001 From: adam <adam@FreeBSD.org> Date: Wed, 1 Nov 1995 12:18:32 +0000 Subject: 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. --- usr.bin/make/var.c | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) (limited to 'usr.bin/make/var.c') 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: -- cgit v1.1