1 1.19 rillig # $NetBSD: varmod-range.mk,v 1.19 2025/06/28 22:39:29 rillig Exp $ 2 1.1 rillig # 3 1.2 rillig # Tests for the :range variable modifier, which generates sequences 4 1.2 rillig # of integers from the given range. 5 1.6 rillig # 6 1.6 rillig # See also: 7 1.6 rillig # modword.mk 8 1.1 rillig 9 1.4 rillig # The :range modifier generates a sequence of integers, one number per 10 1.9 rillig # word of the expression's value. 11 1.4 rillig .if ${a b c:L:range} != "1 2 3" 12 1.4 rillig . error 13 1.4 rillig .endif 14 1.4 rillig 15 1.4 rillig # To preserve spaces in a word, they can be enclosed in quotes, just like 16 1.4 rillig # everywhere else. 17 1.4 rillig .if ${:U first "the second word" third 4 :range} != "1 2 3 4" 18 1.4 rillig . error 19 1.4 rillig .endif 20 1.4 rillig 21 1.4 rillig # The :range modifier takes the number of words from the value of the 22 1.9 rillig # expression. If that expression is undefined, the range is 23 1.4 rillig # undefined as well. This should not come as a surprise. 24 1.4 rillig .if "${:range}" != "" 25 1.4 rillig . error 26 1.4 rillig .endif 27 1.4 rillig 28 1.10 rillig # An empty expression results in a sequence of a single number, even though 29 1.10 rillig # the expression contains 0 words. 30 1.10 rillig .if ${:U:range} != "1" 31 1.10 rillig . error 32 1.10 rillig .endif 33 1.10 rillig 34 1.4 rillig # The :range modifier can be given a parameter, which makes the generated 35 1.9 rillig # range independent from the value or the name of the expression. 36 1.4 rillig .if "${:range=5}" != "" 37 1.4 rillig . error 38 1.4 rillig .endif 39 1.10 rillig # XXX: As of 2023-12-17, the ':range=n' modifier does not turn the undefined 40 1.10 rillig # expression into a defined one, even though it does not depend on the value 41 1.10 rillig # of the expression. This looks like an oversight. 42 1.18 rillig # expect+1: Variable "" is undefined 43 1.10 rillig .if ${:range=5} != "" 44 1.10 rillig . error 45 1.10 rillig .else 46 1.10 rillig . error 47 1.10 rillig .endif 48 1.4 rillig 49 1.5 rillig # Negative ranges don't make sense. 50 1.5 rillig # As of 2020-11-01, they are accepted though, using up all available memory. 51 1.5 rillig #.if "${:range=-1}" 52 1.5 rillig #. error 53 1.5 rillig #.else 54 1.5 rillig #. error 55 1.5 rillig #.endif 56 1.5 rillig 57 1.5 rillig # The :range modifier requires a number as parameter. 58 1.7 rillig # 59 1.7 rillig # Until 2020-11-01, the parser tried to read the 'x' as a number, failed and 60 1.7 rillig # stopped there. It then tried to parse the next modifier at that point, 61 1.7 rillig # which failed with the message "Unknown modifier". 62 1.7 rillig # 63 1.7 rillig # Since 2020-11-01, the parser issues a more precise "Invalid number" error 64 1.7 rillig # instead. 65 1.19 rillig # expect+1: Invalid number "x}Rest" != "Rest"" for modifier ":range" 66 1.5 rillig .if "${:U:range=x}Rest" != "Rest" 67 1.5 rillig . error 68 1.5 rillig .else 69 1.5 rillig . error 70 1.5 rillig .endif 71 1.5 rillig 72 1.5 rillig # The upper limit of the range must always be given in decimal. 73 1.5 rillig # This parse error stops at the 'x', trying to parse it as a variable 74 1.5 rillig # modifier. 75 1.17 rillig # expect+1: Unknown modifier ":x0" 76 1.5 rillig .if "${:U:range=0x0}Rest" != "Rest" 77 1.5 rillig . error 78 1.5 rillig .else 79 1.5 rillig . error 80 1.5 rillig .endif 81 1.5 rillig 82 1.5 rillig # As of 2020-11-01, numeric overflow is not detected. 83 1.5 rillig # Since strtoul returns ULONG_MAX in such a case, it is interpreted as a 84 1.5 rillig # very large number, consuming all available memory. 85 1.5 rillig #.if "${:U:range=18446744073709551619}Rest" != "Rest" 86 1.5 rillig #. error 87 1.5 rillig #.else 88 1.5 rillig #. error 89 1.5 rillig #.endif 90 1.5 rillig 91 1.5 rillig # modifier name too short 92 1.17 rillig # expect+1: Unknown modifier ":rang" 93 1.5 rillig .if "${a b c:L:rang}Rest" != "Rest" 94 1.5 rillig . error 95 1.5 rillig .else 96 1.5 rillig . error 97 1.5 rillig .endif 98 1.5 rillig 99 1.5 rillig # misspelled modifier name 100 1.17 rillig # expect+1: Unknown modifier ":rango" 101 1.5 rillig .if "${a b c:L:rango}Rest" != "Rest" 102 1.5 rillig . error 103 1.5 rillig .else 104 1.5 rillig . error 105 1.5 rillig .endif 106 1.5 rillig 107 1.5 rillig # modifier name too long 108 1.17 rillig # expect+1: Unknown modifier ":ranger" 109 1.5 rillig .if "${a b c:L:ranger}Rest" != "Rest" 110 1.5 rillig . error 111 1.5 rillig .else 112 1.5 rillig . error 113 1.5 rillig .endif 114 1.5 rillig 115 1.1 rillig all: 116