1# $NetBSD: varmod-match.mk,v 1.6 2020/11/15 18:33:41 rillig Exp $
2#
3# Tests for the :M variable modifier, which filters words that match the
4# given pattern.
5#
6# See ApplyModifier_Match and ModifyWord_Match for the implementation.
7
8.MAKEFLAGS: -dc
9
10NUMBERS=	One Two Three Four five six seven
11
12# Only keep words that start with an uppercase letter.
13.if ${NUMBERS:M[A-Z]*} != "One Two Three Four"
14.  error
15.endif
16
17# Only keep words that start with a character other than an uppercase letter.
18.if ${NUMBERS:M[^A-Z]*} != "five six seven"
19.  error
20.endif
21
22# Only keep words that don't start with s and at the same time end with
23# either of [ex].
24#
25# This test case ensures that the negation from the first character class
26# does not propagate to the second character class.
27.if ${NUMBERS:M[^s]*[ex]} != "One Three five"
28.  error
29.endif
30
31# Before 2020-06-13, this expression took quite a long time in Str_Match,
32# calling itself 601080390 times for 16 asterisks.
33.if ${:U****************:M****************b}
34.endif
35
36# To match a dollar sign in a word, double it.
37#
38# This is different from the :S and :C variable modifiers, where a '$'
39# has to be escaped as '\$'.
40.if ${:Ua \$ sign:M*$$*} != "\$"
41.  error
42.endif
43
44# In the :M modifier, '\$' does not escape a dollar.  Instead it is
45# interpreted as a backslash followed by whatever expression the
46# '$' starts.
47#
48# This differs from the :S, :C and several other variable modifiers.
49${:U*}=		asterisk
50.if ${:Ua \$ sign any-asterisk:M*\$*} != "any-asterisk"
51.  error
52.endif
53
54# TODO: ${VAR:M(((}}}}
55# TODO: ${VAR:M{{{)))}
56# TODO: ${VAR:M${UNBALANCED}}
57# TODO: ${VAR:M${:U(((\}\}\}}}
58
59all:
60	@:;
61