1# $NetBSD: varmod-subst-regex.mk,v 1.3 2020/08/28 17:15:04 rillig Exp $ 2# 3# Tests for the :C,from,to, variable modifier. 4 5all: mod-regex-compile-error 6all: mod-regex-limits 7all: mod-regex-errors 8 9# The variable expression expands to 4 words. Of these words, none matches 10# the regular expression "a b" since these words don't contain any 11# whitespace. 12.if ${:Ua b b c:C,a b,,} != "a b b c" 13.error 14.endif 15 16# Using the '1' modifier does not change anything. The '1' modifier just 17# means to apply at most 1 replacement in the whole variable expression. 18.if ${:Ua b b c:C,a b,,1} != "a b b c" 19.error 20.endif 21 22# The 'W' modifier treats the whole variable value as a single big word, 23# containing whitespace. This big word matches the regular expression, 24# therefore it gets replaced. Whitespace is preserved after replacing. 25.if ${:Ua b b c:C,a b,,W} != " b c" 26.error 27.endif 28 29# The 'g' modifier does not have any effect here since each of the words 30# contains the character 'b' a single time. 31.if ${:Ua b b c:C,b,,g} != "a c" 32.error 33.endif 34 35# The first :C modifier has the 'W' modifier, which makes the whole 36# expression a single word. The 'g' modifier then replaces all occurrences 37# of "1 2" with "___". The 'W' modifier only applies to this single :C 38# modifier. This is demonstrated by the :C modifier that follows. If the 39# 'W' modifier would be preserved, only a single underscore would have been 40# replaced with an 'x'. 41.if ${:U1 2 3 1 2 3:C,1 2,___,Wg:C,_,x,} != "x__ 3 x__ 3" 42.error 43.endif 44 45# The regular expression does not match in the first word. 46# It matches once in the second word, and the \0\0 doubles that word. 47# In the third word, the regular expression matches as early as possible, 48# and since the matches must not overlap, the next possible match would 49# start at the 6, but at that point, there is only one character left, 50# and that cannot match the regular expression "..". Therefore only the 51# "45" is doubled in the result. 52.if ${:U1 23 456:C,..,\0\0,} != "1 2323 45456" 53.error 54.endif 55 56# The modifier '1' applies the replacement at most once, across the whole 57# variable value, no matter whether it is a single big word or many small 58# words. 59# 60# Up to 2020-08-28, the manual page said that the modifiers '1' and 'g' 61# were orthogonal, which was wrong. 62.if ${:U12345 12345:C,.,\0\0,1} != "112345 12345" 63.error 64.endif 65 66# Multiple asterisks form an invalid regular expression. This produces an 67# error message and (as of 2020-08-28) stops parsing in the middle of the 68# variable expression. The unparsed part of the expression is then copied 69# verbatim to the output, which is unexpected and can lead to strange shell 70# commands being run. 71mod-regex-compile-error: 72 @echo $@: ${:Uword1 word2:C,****,____,g:C,word,____,:Q}. 73 74# These tests generate error messages but as of 2020-08-28 just continue 75# parsing and execution as if nothing bad had happened. 76mod-regex-limits: 77 @echo $@:11-missing:${:U1 23 456:C,..,\1\1,:Q} 78 @echo $@:11-ok:${:U1 23 456:C,(.).,\1\1,:Q} 79 @echo $@:22-missing:${:U1 23 456:C,..,\2\2,:Q} 80 @echo $@:22-missing:${:U1 23 456:C,(.).,\2\2,:Q} 81 @echo $@:22-ok:${:U1 23 456:C,(.)(.),\2\2,:Q} 82 # The :C modifier only handles single-digit capturing groups, 83 # which is more than enough for daily use. 84 @echo $@:capture:${:UabcdefghijABCDEFGHIJrest:C,(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.),\9\8\7\6\5\4\3\2\1\0\10\11\12,} 85 86mod-regex-errors: 87 @echo $@: ${UNDEF:Uvalue:C,[,,} 88