aboutsummaryrefslogtreecommitdiff
path: root/build2/test/script/script.cxx
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2016-12-17 23:28:30 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2017-01-05 15:30:41 +0300
commit3ecbf5d51b13e11a93ae5757408a27c21d804c9f (patch)
treebe46e3caa24574de106c2fbf1a05c43d32694e12 /build2/test/script/script.cxx
parenta63e1809afd9a837821d6e8376cb14a36e7fc26e (diff)
Add support for regex in runner
Diffstat (limited to 'build2/test/script/script.cxx')
-rw-r--r--build2/test/script/script.cxx42
1 files changed, 33 insertions, 9 deletions
diff --git a/build2/test/script/script.cxx b/build2/test/script/script.cxx
index 7941df6..c67e1b6 100644
--- a/build2/test/script/script.cxx
+++ b/build2/test/script/script.cxx
@@ -85,25 +85,36 @@ namespace build2
case redirect_type::merge: o << '&' << r.fd; break;
case redirect_type::here_str_literal:
+ case redirect_type::here_str_regex:
{
- const string& v (r.str);
+ bool re (r.type == redirect_type::here_str_regex);
+ const string& v (re ? r.regex.str : r.str);
bool nl (!v.empty () && v.back () == '\n');
if (!nl)
o << ':';
+ if (re)
+ o << '~';
+
to_stream_q (o, nl ? string (v, 0, v.size () - 1) : v);
break;
}
case redirect_type::here_doc_literal:
+ case redirect_type::here_doc_regex:
{
- const string& v (r.str);
+ bool re (r.type == redirect_type::here_doc_regex);
+ const string& v (re ? r.regex.str : r.str);
bool nl (!v.empty () && v.back () == '\n');
// Add another '>' or '<'. Note that here end marker never
// needs to be quoted.
//
o << d << (nl ? "" : ":");
+
+ if (re)
+ o << '~';
+
to_stream_q (o, r.end);
break;
}
@@ -115,16 +126,21 @@ namespace build2
print_path (r.file.path);
break;
}
- case redirect_type::here_str_regex: // @@ REGEX
- case redirect_type::here_doc_regex: assert (false); break;
}
};
auto print_doc = [&o] (const redirect& r)
{
- const string& v (r.str);
+ bool re (r.type == redirect_type::here_doc_regex);
+ const string& v (re ? r.regex.str : r.str);
bool nl (!v.empty () && v.back () == '\n');
- o << endl << v << (nl ? "" : "\n") << r.end;
+
+ // For the regex here-document the end marker contains introducer and
+ // flags characters, so need to remove them.
+ //
+ const string& e (r.end);
+ o << endl << v << (nl ? "" : "\n")
+ << (re ? string (e, 1, e.find (e[0], 1) - 1) : e);
};
if ((m & command_to_stream::header) == command_to_stream::header)
@@ -173,9 +189,17 @@ namespace build2
{
// Here-documents.
//
- if (c.in.type == redirect_type::here_doc_literal) print_doc (c.in);
- if (c.out.type == redirect_type::here_doc_literal) print_doc (c.out);
- if (c.err.type == redirect_type::here_doc_literal) print_doc (c.err);
+ if (c.in.type == redirect_type::here_doc_literal ||
+ c.in.type == redirect_type::here_doc_regex)
+ print_doc (c.in);
+
+ if (c.out.type == redirect_type::here_doc_literal ||
+ c.out.type == redirect_type::here_doc_regex)
+ print_doc (c.out);
+
+ if (c.err.type == redirect_type::here_doc_literal ||
+ c.err.type == redirect_type::here_doc_regex)
+ print_doc (c.err);
}
}