$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r86664 - trunk/tools/quickbook/src
From: dnljms_at_[hidden]
Date: 2013-11-12 15:33:59
Author: danieljames
Date: 2013-11-12 15:33:59 EST (Tue, 12 Nov 2013)
New Revision: 86664
URL: http://svn.boost.org/trac/boost/changeset/86664
Log:
Stack tagged source modes.
For when one tagged element is inside another.
Text files modified: 
   trunk/tools/quickbook/src/actions.cpp      |     2 +-                                      
   trunk/tools/quickbook/src/main_grammar.cpp |    15 ++++++---------                         
   trunk/tools/quickbook/src/state.cpp        |    21 +++++++++++++++++++++                   
   trunk/tools/quickbook/src/state.hpp        |     5 +++++                                   
   4 files changed, 33 insertions(+), 10 deletions(-)
Modified: trunk/tools/quickbook/src/actions.cpp
==============================================================================
--- trunk/tools/quickbook/src/actions.cpp	Tue Nov 12 15:33:36 2013	(r86663)
+++ trunk/tools/quickbook/src/actions.cpp	2013-11-12 15:33:59 EST (Tue, 12 Nov 2013)	(r86664)
@@ -710,7 +710,7 @@
         bool block = code_tag != code_tags::inline_code;
 
         source_mode_type source_mode = state.source_mode_next ?
-            state.source_mode_next : state.source_mode.source_mode;
+            state.source_mode_next : state.current_source_mode().source_mode;
         state.source_mode_next = 0;
 
         if (inline_code) {
Modified: trunk/tools/quickbook/src/main_grammar.cpp
==============================================================================
--- trunk/tools/quickbook/src/main_grammar.cpp	Tue Nov 12 15:33:36 2013	(r86663)
+++ trunk/tools/quickbook/src/main_grammar.cpp	2013-11-12 15:33:59 EST (Tue, 12 Nov 2013)	(r86664)
@@ -152,8 +152,7 @@
 
     struct process_element_impl : scoped_action_base {
         process_element_impl(main_grammar_local& l) :
-            l(l), changed_source_mode_(false), saved_source_mode_(),
-            element_context_error_(false) {}
+            l(l), pushed_source_mode_(false), element_context_error_(false) {}
 
         bool start()
         {
@@ -186,9 +185,8 @@
             if (l.state_.source_mode_next &&
                 info_.type != element_info::maybe_block)
             {
-                saved_source_mode_ = l.state_.source_mode;
-                l.state_.change_source_mode(l.state_.source_mode_next);
-                changed_source_mode_ = true;
+                l.state_.push_tagged_source_mode(l.state_.source_mode_next);
+                pushed_source_mode_ = true;
                 l.state_.source_mode_next = 0;
             }
 
@@ -225,14 +223,13 @@
         void failure() { l.element_type = element_info::nothing; }
 
         void cleanup() {
-            if (changed_source_mode_)
-                boost::swap(l.state_.source_mode, saved_source_mode_);
+            if (pushed_source_mode_)
+                l.state_.pop_tagged_source_mode();
         }
 
         main_grammar_local& l;
         element_info info_;
-        bool changed_source_mode_;
-        source_mode_info saved_source_mode_;
+        bool pushed_source_mode_;
         bool element_context_error_;
     };
 
Modified: trunk/tools/quickbook/src/state.cpp
==============================================================================
--- trunk/tools/quickbook/src/state.cpp	Tue Nov 12 15:33:36 2013	(r86663)
+++ trunk/tools/quickbook/src/state.cpp	2013-11-12 15:33:59 EST (Tue, 12 Nov 2013)	(r86664)
@@ -15,6 +15,7 @@
 #include "native_text.hpp"
 #include "utils.hpp"
 #include "phrase_tags.hpp"
+#include <boost/foreach.hpp>
 
 #if (defined(BOOST_MSVC) && (BOOST_MSVC <= 1310))
 #pragma warning(disable:4355)
@@ -102,10 +103,30 @@
         in_list_save.pop();
     }
 
+    source_mode_info state::current_source_mode() const {
+        source_mode_info result = source_mode;
+
+        BOOST_FOREACH(source_mode_info const& s, tagged_source_mode_stack) {
+            result.update(s);
+        }
+
+        return result;
+    }
+
     void state::change_source_mode(source_mode_type s) {
         source_mode = source_mode_info(s, get_new_order_pos());
     }
 
+    void state::push_tagged_source_mode(source_mode_type s) {
+        tagged_source_mode_stack.push_back(
+            source_mode_info(s, get_new_order_pos()));
+    }
+
+    void state::pop_tagged_source_mode() {
+        assert(!tagged_source_mode_stack.empty());
+        tagged_source_mode_stack.pop_back();
+    }
+
     state_save::state_save(quickbook::state& state, scope_flags scope)
         : state(state)
         , scope(scope)
Modified: trunk/tools/quickbook/src/state.hpp
==============================================================================
--- trunk/tools/quickbook/src/state.hpp	Tue Nov 12 15:33:36 2013	(r86663)
+++ trunk/tools/quickbook/src/state.hpp	2013-11-12 15:33:59 EST (Tue, 12 Nov 2013)	(r86664)
@@ -62,6 +62,8 @@
         source_mode_info        source_mode;
         source_mode_type        source_mode_next;
         value                   source_mode_next_pos;
+        std::vector<source_mode_info>
+                                tagged_source_mode_stack;
         file_ptr                current_file;
 
         // A machine independent representation of the current file's
@@ -104,7 +106,10 @@
         std::string add_callout(value);
         std::string end_callouts();
 
+        source_mode_info current_source_mode() const;
         void change_source_mode(source_mode_type);
+        void push_tagged_source_mode(source_mode_type);
+        void pop_tagged_source_mode();
     };
 
     extern unsigned qbk_version_n; // qbk_major_version * 100 + qbk_minor_version