Module Name: src Committed By: christos Date: Sat Apr 25 18:20:57 UTC 2020
Modified Files: src/usr.bin/make: nonints.h str.c var.c src/usr.bin/make/unit-tests: sysv.exp sysv.mk Log Message: - Percent on the rhs is special only if the lhs has one too. - If the rhs does not have percent, but the lhs has, the result is the rhs This behavior matches gmake To generate a diff of this commit: cvs rdiff -u -r1.74 -r1.75 src/usr.bin/make/nonints.h cvs rdiff -u -r1.39 -r1.40 src/usr.bin/make/str.c cvs rdiff -u -r1.222 -r1.223 src/usr.bin/make/var.c cvs rdiff -u -r1.1 -r1.2 src/usr.bin/make/unit-tests/sysv.exp cvs rdiff -u -r1.2 -r1.3 src/usr.bin/make/unit-tests/sysv.mk 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/nonints.h diff -u src/usr.bin/make/nonints.h:1.74 src/usr.bin/make/nonints.h:1.75 --- src/usr.bin/make/nonints.h:1.74 Sun Sep 4 20:40:29 2016 +++ src/usr.bin/make/nonints.h Sat Apr 25 14:20:57 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: nonints.h,v 1.74 2016/09/05 00:40:29 sevan Exp $ */ +/* $NetBSD: nonints.h,v 1.75 2020/04/25 18:20:57 christos Exp $ */ /*- * Copyright (c) 1988, 1989, 1990, 1993 @@ -138,8 +138,8 @@ char *str_concat(const char *, const cha char **brk_string(const char *, int *, Boolean, char **); char *Str_FindSubstring(const char *, const char *); int Str_Match(const char *, const char *); -char *Str_SYSVMatch(const char *, const char *, int *len); -void Str_SYSVSubst(Buffer *, char *, char *, int); +char *Str_SYSVMatch(const char *, const char *, size_t *, Boolean *); +void Str_SYSVSubst(Buffer *, char *, char *, size_t, Boolean); /* suff.c */ void Suff_ClearSuffixes(void); Index: src/usr.bin/make/str.c diff -u src/usr.bin/make/str.c:1.39 src/usr.bin/make/str.c:1.40 --- src/usr.bin/make/str.c:1.39 Sun Dec 1 18:53:49 2019 +++ src/usr.bin/make/str.c Sat Apr 25 14:20:57 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: str.c,v 1.39 2019/12/01 23:53:49 rillig Exp $ */ +/* $NetBSD: str.c,v 1.40 2020/04/25 18:20:57 christos Exp $ */ /*- * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,14 +69,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: str.c,v 1.39 2019/12/01 23:53:49 rillig Exp $"; +static char rcsid[] = "$NetBSD: str.c,v 1.40 2020/04/25 18:20:57 christos Exp $"; #else #include <sys/cdefs.h> #ifndef lint #if 0 static char sccsid[] = "@(#)str.c 5.8 (Berkeley) 6/1/90"; #else -__RCSID("$NetBSD: str.c,v 1.39 2019/12/01 23:53:49 rillig Exp $"); +__RCSID("$NetBSD: str.c,v 1.40 2020/04/25 18:20:57 christos Exp $"); #endif #endif /* not lint */ #endif @@ -452,12 +452,14 @@ thisCharOK: ++pattern; *----------------------------------------------------------------------- */ char * -Str_SYSVMatch(const char *word, const char *pattern, int *len) +Str_SYSVMatch(const char *word, const char *pattern, size_t *len, + Boolean *hasPercent) { const char *p = pattern; const char *w = word; const char *m; + *hasPercent = FALSE; if (*p == '\0') { /* Null pattern is the whole string */ *len = strlen(w); @@ -465,6 +467,7 @@ Str_SYSVMatch(const char *word, const ch } if ((m = strchr(p, '%')) != NULL) { + *hasPercent = TRUE; /* check that the prefix matches */ for (; p != m && *w && *w == *p; w++, p++) continue; @@ -509,19 +512,21 @@ Str_SYSVMatch(const char *word, const ch *----------------------------------------------------------------------- */ void -Str_SYSVSubst(Buffer *buf, char *pat, char *src, int len) +Str_SYSVSubst(Buffer *buf, char *pat, char *src, size_t len, + Boolean lhsHasPercent) { char *m; - if ((m = strchr(pat, '%')) != NULL) { + if ((m = strchr(pat, '%')) != NULL && lhsHasPercent) { /* Copy the prefix */ Buf_AddBytes(buf, m - pat, pat); /* skip the % */ pat = m + 1; } - - /* Copy the pattern */ - Buf_AddBytes(buf, len, src); + if (m != NULL || !lhsHasPercent) { + /* Copy the pattern */ + Buf_AddBytes(buf, len, src); + } /* append the rest */ Buf_AddBytes(buf, strlen(pat), pat); Index: src/usr.bin/make/var.c diff -u src/usr.bin/make/var.c:1.222 src/usr.bin/make/var.c:1.223 --- src/usr.bin/make/var.c:1.222 Sat Feb 2 22:19:29 2019 +++ src/usr.bin/make/var.c Sat Apr 25 14:20:57 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.222 2019/02/03 03:19:29 mrg Exp $ */ +/* $NetBSD: var.c,v 1.223 2020/04/25 18:20:57 christos Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,14 +69,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: var.c,v 1.222 2019/02/03 03:19:29 mrg Exp $"; +static char rcsid[] = "$NetBSD: var.c,v 1.223 2020/04/25 18:20:57 christos 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.222 2019/02/03 03:19:29 mrg Exp $"); +__RCSID("$NetBSD: var.c,v 1.223 2020/04/25 18:20:57 christos Exp $"); #endif #endif /* not lint */ #endif @@ -1402,8 +1402,9 @@ VarSYSVMatch(GNode *ctx, Var_Parse_State char *word, Boolean addSpace, Buffer *buf, void *patp) { - int len; + size_t len; char *ptr; + Boolean hasPercent; VarPattern *pat = (VarPattern *)patp; char *varexp; @@ -1412,9 +1413,9 @@ VarSYSVMatch(GNode *ctx, Var_Parse_State addSpace = TRUE; - if ((ptr = Str_SYSVMatch(word, pat->lhs, &len)) != NULL) { + if ((ptr = Str_SYSVMatch(word, pat->lhs, &len, &hasPercent)) != NULL) { varexp = Var_Subst(NULL, pat->rhs, ctx, VARF_WANTRES); - Str_SYSVSubst(buf, varexp, ptr, len); + Str_SYSVSubst(buf, varexp, ptr, len, hasPercent); free(varexp); } else { Buf_AddBytes(buf, strlen(word), word); Index: src/usr.bin/make/unit-tests/sysv.exp diff -u src/usr.bin/make/unit-tests/sysv.exp:1.1 src/usr.bin/make/unit-tests/sysv.exp:1.2 --- src/usr.bin/make/unit-tests/sysv.exp:1.1 Thu Aug 21 09:44:51 2014 +++ src/usr.bin/make/unit-tests/sysv.exp Sat Apr 25 14:20:57 2020 @@ -4,4 +4,11 @@ fun fun fun In the Sun +acme +aam.d +sam.c +a%.c +asam.c.c +asam.c +a.c.c exit status 0 Index: src/usr.bin/make/unit-tests/sysv.mk diff -u src/usr.bin/make/unit-tests/sysv.mk:1.2 src/usr.bin/make/unit-tests/sysv.mk:1.3 --- src/usr.bin/make/unit-tests/sysv.mk:1.2 Sat Aug 30 18:21:08 2014 +++ src/usr.bin/make/unit-tests/sysv.mk Sat Apr 25 14:20:57 2020 @@ -1,4 +1,4 @@ -# $Id: sysv.mk,v 1.2 2014/08/30 22:21:08 sjg Exp $ +# $Id: sysv.mk,v 1.3 2020/04/25 18:20:57 christos Exp $ FOO ?= FOOBAR = ${FOO:=bar} @@ -11,7 +11,7 @@ FUN = ${B}${S}fun SUN = the Sun # we expect nothing when FOO is empty -all: foo fun +all: foo fun sam foo: @echo FOOBAR = ${FOOBAR} @@ -24,3 +24,15 @@ fun: @echo ${FUN:${B}${S}fun=fun} @echo ${FUN:${B}${S}%=%} @echo ${In:L:%=% ${SUN}} + + +SAM=sam.c + +sam: + @echo ${SAM:s%.c=acme} + @echo ${SAM:s%.c=a%.d} + @echo ${SAM:s.c=a%.d} + @echo ${SAM:sam.c=a%.c} + @echo ${SAM:%=a%.c} + @echo ${SAM:%.c=a%.c} + @echo ${SAM:sam%=a%.c}