> I upped the severity on this. If you have the time Andre, it
> would be nice if you could have a look at this one.

I attach some kind of patch. Although it does not fix the problem it
fixes the crash.

I am not sure the patch can be applied by 'patch'. THis is no 'cvs diff'
but something 'hand crafted'

Andre'


--ADZbWkCsHQ7r3kzd
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="1.diff"

--- cursor.C    2005-02-11 12:43:16.000000000 +0100
+++ ../../lyx-devel-fix-1/src/cursor.C  2005-02-12 13:53:52.000000000 +0100
@@ -199,6 +199,7 @@
        if (empty())
                return;
 
+       fixIfBroken();
        FuncRequest cmd = cmd0;
        LCursor safe = *this;
 
@@ -1139,3 +1143,39 @@
 
        return font;
 }
+
+
+void LCursor::fixIfBroken()
+{
+       // find out last good level
+       LCursor copy = *this;
+       size_t newdepth = depth();
+       while (!copy.empty()) {
+               if (copy.idx() > copy.lastidx()) {
+                       lyxerr << "wrong idx " << copy.idx() << ", max is " << 
copy.lastidx()
+                               << " at level " << copy.depth()
+                               << ". Trying to correct this."  << endl;
+                       newdepth = copy.depth() - 1;
+               }
+               else if (copy.pit() > copy.lastpit()) {
+                       lyxerr << "wrong pit " << copy.pit() << ", max is " << 
copy.lastpit()
+                               << " at level " << copy.depth()
+                               << ". Trying to correct this."  << endl;
+                       newdepth = copy.depth() - 1;
+               }
+               else if (copy.pos() > copy.lastpos()) {
+                       lyxerr << "wrong pos " << copy.pos() << ", max is " << 
copy.lastpos()
+                               << " at level " << copy.depth()
+                               << ". Trying to correct this."  << endl;
+                       newdepth = copy.depth() - 1;
+               }
+               copy.pop();     
+       }
+       // shrink cursor to a size where everything is valid, possibly
+       // leaving insets
+       while (depth() > newdepth) {
+               pop();
+               lyxerr << "correcting cursor to level " << depth() << endl;
+       }
+}
+
--- cursor.h    2005-01-29 08:21:43.000000000 +0100
+++ ../../lyx-devel-fix-1/src/cursor.h  2005-02-12 13:26:56.000000000 +0100
@@ -152,6 +152,8 @@
        void needsUpdate();
        /// don't call update() when done
        void noUpdate();
+       /// fix cursor in circumstances that should never happen
+       void fixIfBroken();
 
        /// output
        friend std::ostream & operator<<(std::ostream & os, LCursor const & 
cur);
--- lyxfunc.C   2005-02-11 12:43:23.000000000 +0100
+++ ../../lyx-devel-fix-1/src/lyxfunc.C 2005-02-12 12:55:39.000000000 +0100
@@ -145,6 +145,9 @@
 bool getStatus(LCursor cursor,
               FuncRequest const & cmd, FuncStatus & status)
 {
+       // Try to fix cursor in case it is broken.
+       cursor.fixIfBroken();
+
        // This is, of course, a mess. Better create a new doc iterator and use
        // this in Inset::getStatus. This might require an additional
        // BufferView * arg, though (which should be avoided)
@@ -154,30 +157,15 @@
                //lyxerr << "\nLCursor::getStatus: cmd: " << cmd << endl << 
*this << endl;
                DocIterator::idx_type & idx = cursor.idx();
                DocIterator::idx_type const lastidx = cursor.lastidx();
-
-               if (idx > lastidx) {
-                       lyxerr << "wrong idx " << idx << ", max is " << lastidx
-                               << ". Trying to correct this."  << endl;
-                       idx = lastidx;
-               }
+               BOOST_ASSERT(idx <= lastidx);
 
                DocIterator::pit_type & pit = cursor.pit();
                DocIterator::pit_type const lastpit = cursor.lastpit();
-
-               if (pit > lastpit) {
-                       lyxerr << "wrong par " << pit << ", max is " << lastpit
-                               << ". Trying to correct this."  << endl;
-                       pit = lastpit;
-               }
+               BOOST_ASSERT(pit <= lastpit);
 
                DocIterator::pos_type & pos = cursor.pos();
                DocIterator::pos_type const lastpos = cursor.lastpos();
-
-               if (pos > lastpos) {
-                       lyxerr << "wrong pos " << pos << ", max is " << lastpos
-                               << ". Trying to correct this."  << endl;
-                       pos = lastpos;
-               }
+               BOOST_ASSERT(pos <= lastpos);
 
                // The inset's getStatus() will return 'true' if it made
                // a definitive decision on whether it want to handle the

--ADZbWkCsHQ7r3kzd--



----- End forwarded message -----

-- 

Reply via email to