Module Name: src Committed By: rillig Date: Thu Sep 2 07:02:08 UTC 2021
Modified Files: src/usr.bin/make: for.c src/usr.bin/make/unit-tests: directive-for-escape.exp directive-for-escape.mk Log Message: make: rename for_var_len to ExprLen The text ${VAR} is not a variable, it's a variable expression. No functional change. To generate a diff of this commit: cvs rdiff -u -r1.146 -r1.147 src/usr.bin/make/for.c cvs rdiff -u -r1.11 -r1.12 \ src/usr.bin/make/unit-tests/directive-for-escape.exp cvs rdiff -u -r1.10 -r1.11 \ src/usr.bin/make/unit-tests/directive-for-escape.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/for.c diff -u src/usr.bin/make/for.c:1.146 src/usr.bin/make/for.c:1.147 --- src/usr.bin/make/for.c:1.146 Thu Sep 2 06:29:56 2021 +++ src/usr.bin/make/for.c Thu Sep 2 07:02:07 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: for.c,v 1.146 2021/09/02 06:29:56 rillig Exp $ */ +/* $NetBSD: for.c,v 1.147 2021/09/02 07:02:07 rillig Exp $ */ /* * Copyright (c) 1992, The Regents of the University of California. @@ -58,7 +58,7 @@ #include "make.h" /* "@(#)for.c 8.1 (Berkeley) 6/6/93" */ -MAKE_RCSID("$NetBSD: for.c,v 1.146 2021/09/02 06:29:56 rillig Exp $"); +MAKE_RCSID("$NetBSD: for.c,v 1.147 2021/09/02 07:02:07 rillig Exp $"); /* One of the variables to the left of the "in" in a .for loop. */ @@ -278,33 +278,33 @@ For_Accum(const char *line) static size_t -for_var_len(const char *var) +ExprLen(const char *expr) { - char ch, var_start, var_end; + char ch, expr_open, expr_close; int depth; size_t len; - var_start = *var; - if (var_start == '\0') + expr_open = expr[0]; + if (expr_open == '\0') /* just escape the $ */ return 0; - if (var_start == '(') - var_end = ')'; - else if (var_start == '{') - var_end = '}'; + if (expr_open == '(') + expr_close = ')'; + else if (expr_open == '{') + expr_close = '}'; else return 1; /* Single char variable */ depth = 1; - for (len = 1; (ch = var[len++]) != '\0';) { - if (ch == var_start) + for (len = 1; (ch = expr[len++]) != '\0';) { + if (ch == expr_open) depth++; - else if (ch == var_end && --depth == 0) + else if (ch == expr_close && --depth == 0) return len; } - /* Variable end not found, escape the $ */ + /* Expression end not found, escape the $ */ return 0; } @@ -345,8 +345,12 @@ Buf_AddEscaped(Buffer *cmds, const char * :U processing, see ApplyModifier_Defined. */ while ((ch = *item++) != '\0') { if (ch == '$') { - size_t len = for_var_len(item); + size_t len = ExprLen(item); if (len != 0) { + /* + * XXX: Should a '\' be added here? + * See directive-for-escape.mk, ExprLen. + */ Buf_AddBytes(cmds, item - 1, len + 1); item += len; continue; @@ -427,8 +431,10 @@ ForLoop_SubstVarShort(ForLoop *f, const return; found: + Buf_AddBytesBetween(&f->curBody, *inout_mark, p); + *inout_mark = p + 1; + /* Replace $<ch> with ${:U<value>} */ - Buf_AddBytesBetween(&f->curBody, *inout_mark, p), *inout_mark = p + 1; Buf_AddStr(&f->curBody, "{:U"); Buf_AddEscaped(&f->curBody, f->items.words[f->sub_next + i], '}'); Buf_AddByte(&f->curBody, '}'); @@ -444,8 +450,8 @@ found: * defined, see unit-tests/varname-empty.mk for more details. * * The detection of substitutions of the loop control variables is naive. - * Many of the modifiers use '\' to escape '$' (not '$'), so it is possible - * to contrive a makefile where an unwanted substitution happens. + * Many of the modifiers use '\$' instead of '$$' to escape '$', so it is + * possible to contrive a makefile where an unwanted substitution happens. */ static void ForLoop_SubstBody(ForLoop *f) Index: src/usr.bin/make/unit-tests/directive-for-escape.exp diff -u src/usr.bin/make/unit-tests/directive-for-escape.exp:1.11 src/usr.bin/make/unit-tests/directive-for-escape.exp:1.12 --- src/usr.bin/make/unit-tests/directive-for-escape.exp:1.11 Fri Jun 25 16:10:07 2021 +++ src/usr.bin/make/unit-tests/directive-for-escape.exp Thu Sep 2 07:02:08 2021 @@ -11,45 +11,45 @@ make: "directive-for-escape.mk" line 29: For: end for 1 For: loop body: . info ${:U\$} -make: "directive-for-escape.mk" line 41: $ +make: "directive-for-escape.mk" line 43: $ For: loop body: . info ${:U${V}} -make: "directive-for-escape.mk" line 41: value +make: "directive-for-escape.mk" line 43: value For: loop body: . info ${:U${V:=-with-modifier}} -make: "directive-for-escape.mk" line 41: value-with-modifier +make: "directive-for-escape.mk" line 43: value-with-modifier For: loop body: . info ${:U$(V)} -make: "directive-for-escape.mk" line 41: value +make: "directive-for-escape.mk" line 43: value For: loop body: . info ${:U$(V:=-with-modifier)} -make: "directive-for-escape.mk" line 41: value-with-modifier +make: "directive-for-escape.mk" line 43: value-with-modifier For: end for 1 For: loop body: . info ${:U\${UNDEF\:U\\$\\$} -make: "directive-for-escape.mk" line 55: ${UNDEF:U\$ +make: "directive-for-escape.mk" line 57: ${UNDEF:U\$ For: loop body: . info ${:U{{\}\}} -make: "directive-for-escape.mk" line 55: {{}} +make: "directive-for-escape.mk" line 57: {{}} For: loop body: . info ${:Uend\}} -make: "directive-for-escape.mk" line 55: end} +make: "directive-for-escape.mk" line 57: end} For: end for 1 For: loop body: . info ${:Ubegin<${UNDEF:Ufallback:N{{{}}}}>end} -make: "directive-for-escape.mk" line 67: begin<fallback>end +make: "directive-for-escape.mk" line 69: begin<fallback>end For: end for 1 For: loop body: . info ${:U\$} -make: "directive-for-escape.mk" line 75: $ +make: "directive-for-escape.mk" line 77: $ For: end for 1 For: loop body: . info ${NUMBERS} ${:Ureplaced} -make: "directive-for-escape.mk" line 83: one two three replaced +make: "directive-for-escape.mk" line 85: one two three replaced For: end for 1 For: loop body: . info ${:Ureplaced} -make: "directive-for-escape.mk" line 93: replaced +make: "directive-for-escape.mk" line 95: replaced For: end for 1 For: loop body: . info . $$i: ${:Uinner} @@ -62,31 +62,31 @@ For: loop body: . info . $${i2}: ${i2} . info . $${i,}: ${i,} . info . adjacent: ${:Uinner}${:Uinner}${:Uinner:M*}${:Uinner} -make: "directive-for-escape.mk" line 101: . $i: inner -make: "directive-for-escape.mk" line 102: . ${i}: inner -make: "directive-for-escape.mk" line 103: . ${i:M*}: inner -make: "directive-for-escape.mk" line 104: . $(i): inner -make: "directive-for-escape.mk" line 105: . $(i:M*): inner -make: "directive-for-escape.mk" line 106: . ${i${:U}}: outer -make: "directive-for-escape.mk" line 107: . ${i\}}: inner} -make: "directive-for-escape.mk" line 108: . ${i2}: two -make: "directive-for-escape.mk" line 109: . ${i,}: comma -make: "directive-for-escape.mk" line 110: . adjacent: innerinnerinnerinner +make: "directive-for-escape.mk" line 103: . $i: inner +make: "directive-for-escape.mk" line 104: . ${i}: inner +make: "directive-for-escape.mk" line 105: . ${i:M*}: inner +make: "directive-for-escape.mk" line 106: . $(i): inner +make: "directive-for-escape.mk" line 107: . $(i:M*): inner +make: "directive-for-escape.mk" line 108: . ${i${:U}}: outer +make: "directive-for-escape.mk" line 109: . ${i\}}: inner} +make: "directive-for-escape.mk" line 110: . ${i2}: two +make: "directive-for-escape.mk" line 111: . ${i,}: comma +make: "directive-for-escape.mk" line 112: . adjacent: innerinnerinnerinner For: end for 1 For: loop body: . info eight $$$$$$$$ and no cents. . info eight ${:Udollar}${:Udollar}${:Udollar}${:Udollar} and no cents. -make: "directive-for-escape.mk" line 118: eight $$$$ and no cents. -make: "directive-for-escape.mk" line 119: eight dollardollardollardollar and no cents. -make: "directive-for-escape.mk" line 128: eight and no cents. +make: "directive-for-escape.mk" line 120: eight $$$$ and no cents. +make: "directive-for-escape.mk" line 121: eight dollardollardollardollar and no cents. +make: "directive-for-escape.mk" line 130: eight and no cents. For: end for 1 -make: "directive-for-escape.mk" line 135: newline in .for value -make: "directive-for-escape.mk" line 135: newline in .for value +make: "directive-for-escape.mk" line 137: newline in .for value +make: "directive-for-escape.mk" line 137: newline in .for value For: loop body: . info short: ${:U" "} . info long: ${:U" "} -make: "directive-for-escape.mk" line 136: short: " " -make: "directive-for-escape.mk" line 137: long: " " +make: "directive-for-escape.mk" line 138: short: " " +make: "directive-for-escape.mk" line 139: long: " " make: Fatal errors encountered -- cannot continue make: stopped in unit-tests exit status 1 Index: src/usr.bin/make/unit-tests/directive-for-escape.mk diff -u src/usr.bin/make/unit-tests/directive-for-escape.mk:1.10 src/usr.bin/make/unit-tests/directive-for-escape.mk:1.11 --- src/usr.bin/make/unit-tests/directive-for-escape.mk:1.10 Fri Jun 25 16:10:07 2021 +++ src/usr.bin/make/unit-tests/directive-for-escape.mk Thu Sep 2 07:02:08 2021 @@ -1,4 +1,4 @@ -# $NetBSD: directive-for-escape.mk,v 1.10 2021/06/25 16:10:07 rillig Exp $ +# $NetBSD: directive-for-escape.mk,v 1.11 2021/09/02 07:02:08 rillig Exp $ # # Test escaping of special characters in the iteration values of a .for loop. # These values get expanded later using the :U variable modifier, and this @@ -29,19 +29,21 @@ ASCII.2020-12-31= !"\\\#$$%&'()*+,-./0-9 . info ${chars} .endfor -# Cover the code in for_var_len. +# Cover the code in ExprLen. # # XXX: It is unexpected that the variable V gets expanded in the loop body. -# The double '$$' should prevent exactly this. Probably nobody was -# adventurous enough to use literal dollar signs in the values of a .for +# The double '$$' should intuitively prevent exactly this. Probably nobody +# was adventurous enough to use literal dollar signs in the values of a .for # loop. +# +# See for.c, function ExprLen. V= value VALUES= $$ $${V} $${V:=-with-modifier} $$(V) $$(V:=-with-modifier) .for i in ${VALUES} . info $i .endfor -# Try to cover the code for nested '{}' in for_var_len, without success. +# Try to cover the code for nested '{}' in ExprLen, without success. # # The value of the variable VALUES is not meant to be a variable expression. # Instead, it is meant to represent literal text, the only escaping mechanism @@ -55,9 +57,9 @@ VALUES= $${UNDEF:U\$$\$$ {{}} end} . info $i .endfor -# Second try to cover the code for nested '{}' in for_var_len. +# Second try to cover the code for nested '{}' in ExprLen. # -# XXX: It is wrong that for_var_len requires the braces to be balanced. +# XXX: It is wrong that ExprLen requires the braces to be balanced. # Each variable modifier has its own inconsistent way of parsing nested # variable expressions, braces and parentheses. (Compare ':M', ':S', and # ':D' for details.) The only sensible thing to do is therefore to let