From 7d292e2ab53dfc2cf6595f30bcdb6efa4bf260a3 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Mon, 23 Jan 2017 12:12:02 +0300 Subject: Add support for shared here-documents --- build2/test/script/script | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'build2/test/script/script') diff --git a/build2/test/script/script b/build2/test/script/script index fbf3dd5..90b71bf 100644 --- a/build2/test/script/script +++ b/build2/test/script/script @@ -71,10 +71,11 @@ namespace build2 null, merge, here_str_literal, - here_doc_literal, here_str_regex, + here_doc_literal, here_doc_regex, - file + here_doc_ref, // Reference to here_doc literal or regex. + file, }; // Pre-parsed (but not instantiated) regex lines. The idea here is that @@ -154,9 +155,10 @@ namespace build2 union { int fd; // Merge-to descriptor. - string str; // Note: includes trailing newline, if requested. - regex_lines regex; // Note: includes trailing blank, if requested. + string str; // Note: with trailing newline, if requested. + regex_lines regex; // Note: with trailing blank, if requested. file_type file; + reference_wrapper ref; // Note: no chains. }; string modifiers; // Redirect modifiers. @@ -164,15 +166,34 @@ namespace build2 uint64_t end_line; // Here-document end marker location. uint64_t end_column; + // Create redirect of a type other than reference. + // explicit redirect (redirect_type = redirect_type::none); + // Create redirect of the reference type. + // + redirect (redirect_type t, const redirect& r) + : type (redirect_type::here_doc_ref), ref (r) + { + // There is no support (and need) for reference chains. + // + assert (t == redirect_type::here_doc_ref && + r.type != redirect_type::here_doc_ref); + } + // Move constuctible/assignable-only type. // redirect (redirect&&); redirect& operator= (redirect&&); ~redirect (); + + const redirect& + effective () const noexcept + { + return type == redirect_type::here_doc_ref ? ref.get () : *this; + } }; // cleanup -- cgit v1.1