$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r66167 - trunk/boost/spirit/home/qi/directive
From: hartmut.kaiser_at_[hidden]
Date: 2010-10-24 18:25:38
Author: hkaiser
Date: 2010-10-24 18:25:37 EDT (Sun, 24 Oct 2010)
New Revision: 66167
URL: http://svn.boost.org/trac/boost/changeset/66167
Log:
Spirit: fixing a problem in repeat, which caused the iterator not to be reset on certain parsing failures
Text files modified: 
   trunk/boost/spirit/home/qi/directive/repeat.hpp |    24 ++++++++++++++----------                
   1 files changed, 14 insertions(+), 10 deletions(-)
Modified: trunk/boost/spirit/home/qi/directive/repeat.hpp
==============================================================================
--- trunk/boost/spirit/home/qi/directive/repeat.hpp	(original)
+++ trunk/boost/spirit/home/qi/directive/repeat.hpp	2010-10-24 18:25:37 EDT (Sun, 24 Oct 2010)
@@ -217,23 +217,27 @@
             typename LoopIter::type i = iter.start();
 
             // parse the minimum required
+            Iterator save = first;
             if (!iter.got_min(i) &&
-                !parse_minimal(first, last, context, skipper, attr, val, i))
+                !parse_minimal(save, last, context, skipper, attr, val, i))
             {
                 return false;
             }
 
             // parse some more up to the maximum specified
-            Iterator save = first;
-            for (; !iter.got_max(i); ++i)
-            {
-                if (!subject.parse(save, last, context, skipper, val) ||
-                    !traits::push_back(attr, val))
-                {
-                    break;
-                }
+            if (!iter.got_max(i)) {
+                do {
+                    if (!subject.parse(save, last, context, skipper, val) ||
+                        !traits::push_back(attr, val))
+                    {
+                        break;
+                    }
+                    first = save;
+                    traits::clear(val);
+                } while (!iter.got_max(++i));
+            }
+            else {
                 first = save;
-                traits::clear(val);
             }
             return true;
         }