aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2022-12-19 11:13:11 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2022-12-19 11:13:11 +0200
commit0cbd2d1d03ff96eb668fc6a14311d96ed0f9f8b5 (patch)
tree74fed02118a8ea7b78e8e069981301a6c511f633
parent86bd93d16bfb2d44c6d894db43b7ccd29374fccb (diff)
Restore newline escaping (line continuations) in double-quoted strings
Also make effective escaping in buildspec and command line variable overrides consistent with double-quoted strings.
-rw-r--r--libbuild2/context.cxx7
-rw-r--r--libbuild2/lexer.cxx6
-rw-r--r--libbuild2/parser.cxx7
3 files changed, 11 insertions, 9 deletions
diff --git a/libbuild2/context.cxx b/libbuild2/context.cxx
index c9f4340..08c4e7e 100644
--- a/libbuild2/context.cxx
+++ b/libbuild2/context.cxx
@@ -378,12 +378,13 @@ namespace build2
istringstream is (s);
is.exceptions (istringstream::failbit | istringstream::badbit);
- // Similar to buildspec we do "effective escaping" and only for ['"\$(]
- // (basically what's necessary inside a double-quoted literal plus the
+ // Similar to buildspec we do "effective escaping" of the special
+ // `'"\$(` characters, line continuations, plus `)` for symmetry
+ // (basically what's escapable inside a double-quoted literal plus the
// single quote).
//
path_name in ("<cmdline>");
- lexer l (is, in, 1 /* line */, "\'\"\\$(");
+ lexer l (is, in, 1 /* line */, "\'\"\\$()\n");
// At the buildfile level the scope-specific variable should be
// separated from the directory with a whitespace, for example:
diff --git a/libbuild2/lexer.cxx b/libbuild2/lexer.cxx
index d82c135..04c15be 100644
--- a/libbuild2/lexer.cxx
+++ b/libbuild2/lexer.cxx
@@ -923,10 +923,10 @@ namespace build2
auto quoted_mode = [this] (lexer_mode m)
{
// In the double-quoted mode we only do effective escaping of the
- // special `$("\` characters plus `)` for symmetry. Nothing can be
- // escaped in single-quoted.
+ // special `$("\` characters, line continuations, plus `)` for
+ // symmetry. Nothing can be escaped in single-quoted.
//
- const char* esc (m == lexer_mode::double_quoted ? "$()\"\\" : "");
+ const char* esc (m == lexer_mode::double_quoted ? "$()\"\\\n" : "");
state_.push (state {
m, 0, nullopt, false, false, '\0', false, true, true,
diff --git a/libbuild2/parser.cxx b/libbuild2/parser.cxx
index 5128979..4350c88 100644
--- a/libbuild2/parser.cxx
+++ b/libbuild2/parser.cxx
@@ -8163,11 +8163,12 @@ namespace build2
buildspec parser::
parse_buildspec (istream& is, const path_name& in)
{
- // We do "effective escaping" and only for ['"\$(] (basically what's
- // necessary inside a double-quoted literal plus the single quote).
+ // We do "effective escaping" of the special `'"\$(` characters, line
+ // continuations, plus `)` for symmetry (basically what's escapable inside
+ // a double-quoted literal plus the single quote).
//
path_ = &in;
- lexer l (is, *path_, 1 /* line */, "\'\"\\$(");
+ lexer l (is, *path_, 1 /* line */, "\'\"\\$()\n");
lexer_ = &l;
root_ = &ctx->global_scope.rw ();