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}

Reply via email to