> 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 ----- --