Module Name: src
Committed By: rillig
Date: Sat Oct 31 12:20:36 UTC 2020
Modified Files:
src/usr.bin/make/unit-tests: varmod-subst-regex.mk
Log Message:
make(1): add tests for edge cases in the :C variable modifier
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/usr.bin/make/unit-tests/varmod-subst-regex.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/unit-tests/varmod-subst-regex.mk
diff -u src/usr.bin/make/unit-tests/varmod-subst-regex.mk:1.4 src/usr.bin/make/unit-tests/varmod-subst-regex.mk:1.5
--- src/usr.bin/make/unit-tests/varmod-subst-regex.mk:1.4 Sat Oct 24 08:46:08 2020
+++ src/usr.bin/make/unit-tests/varmod-subst-regex.mk Sat Oct 31 12:20:36 2020
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-subst-regex.mk,v 1.4 2020/10/24 08:46:08 rillig Exp $
+# $NetBSD: varmod-subst-regex.mk,v 1.5 2020/10/31 12:20:36 rillig Exp $
#
# Tests for the :C,from,to, variable modifier.
@@ -48,21 +48,38 @@ all: mod-regex-errors
# and since the matches must not overlap, the next possible match would
# start at the 6, but at that point, there is only one character left,
# and that cannot match the regular expression "..". Therefore only the
-# "45" is doubled in the result.
+# "45" is doubled in the third word.
.if ${:U1 23 456:C,..,\0\0,} != "1 2323 45456"
. error
.endif
# The modifier '1' applies the replacement at most once, across the whole
-# variable value, no matter whether it is a single big word or many small
+# expression value, no matter whether it is a single big word or many small
# words.
#
# Up to 2020-08-28, the manual page said that the modifiers '1' and 'g'
-# were orthogonal, which was wrong.
+# were orthogonal, which was wrong. It doesn't make sense to specify both
+# 'g' and '1' at the same time.
.if ${:U12345 12345:C,.,\0\0,1} != "112345 12345"
. error
.endif
+# A regular expression that matches the empty string applies before every
+# single character of the word.
+# XXX: Most other places where regular expression are used match at the end
+# of the string as well.
+.if ${:U1a2b3c:C,a*,*,g} != "*1**2*b*3*c"
+. error
+.endif
+
+# A dot in the regular expression matches any character, even a newline.
+# In most other contexts where regular expressions are used, a dot matches
+# any character except newline. In make, regcomp is called without
+# REG_NEWLINE, thus newline is an ordinary character.
+.if ${:U"${.newline}":C,.,.,g} != "..."
+. error
+.endif
+
# Multiple asterisks form an invalid regular expression. This produces an
# error message and (as of 2020-08-28) stops parsing in the middle of the
# variable expression. The unparsed part of the expression is then copied