X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCompare.cpp;h=303a430b30b25f2decab9415ef1bf4f112c91766;hb=4db3e641ed6765e005343010cb90ee8af26f8f99;hp=aabbed7e3cd6228f61f94f3639fa6dab928befb4;hpb=acefad32e4d1c4e8f824007ea530b37ff7e70eca;p=lyx.git diff --git a/src/Compare.cpp b/src/Compare.cpp index aabbed7e3c..303a430b30 100644 --- a/src/Compare.cpp +++ b/src/Compare.cpp @@ -14,6 +14,7 @@ #include "BufferParams.h" #include "Changes.h" +#include "Font.h" #include "insets/InsetText.h" @@ -96,13 +97,15 @@ size_t DocRange::length() const class DocPair { public: - DocPair() {} + DocPair() + {} DocPair(DocIterator o_, DocIterator n_) : o(o_), n(n_) {} - bool operator!=(DocPair const & rhs) { + bool operator!=(DocPair const & rhs) + { // this might not be intuitive but correct for our purpose return o != rhs.o && n != rhs.n; } @@ -145,10 +148,16 @@ public: {} /// Returns the from pair - DocPair from() const { return DocPair(o.from, n.from); } + DocPair from() const + { + return DocPair(o.from, n.from); + } /// Returns the to pair - DocPair to() const { return DocPair(o.to, n.to); } + DocPair to() const + { + return DocPair(o.to, n.to); + } DocRange o; DocRange n; @@ -180,7 +189,8 @@ static DocRangePair stepIntoInset(DocPair const & inset_location) template class compl_vector { public: - compl_vector() {} + compl_vector() + {} void reset(T const & def) { @@ -222,7 +232,8 @@ public: {} /// - ~Impl() {} + ~Impl() + {} // Algorithm to find the shortest edit string. This algorithm // only needs a linear amount of memory (linear with the sum @@ -234,7 +245,8 @@ public: bool abort_; /// - QString status() { + QString status() + { QString status; status += toqstr("recursion level:") + " " + QString::number(recursion_level_) + " " + toqstr("differences:") + " " + QString::number(D_); @@ -257,7 +269,7 @@ private: SnakeResult retrieveMiddleSnake(int k, int D, Direction direction, DocPair & middle_snake); - /// Find the the furthest reaching D-path (number of horizontal + /// Find the furthest reaching D-path (number of horizontal /// and vertical steps; differences between the old and new /// document) in the k-diagonal (vertical minus horizontal steps). void furthestDpathKdiagonal(int D, int k, @@ -271,7 +283,7 @@ private: /// around the middle snake. void diff_i(DocRangePair const & rp); - /// Processes the splitted chunks. It either adds them as deleted, + /// Processes the split chunks. It either adds them as deleted, /// as added, or call diff_i for further processing. void diffPart(DocRangePair const & rp); @@ -443,7 +455,15 @@ static bool equal(Inset const * i_o, Inset const * i_n) } -static bool equal(DocIterator & o, DocIterator & n) { +static bool equal(DocIterator & o, DocIterator & n) +{ + // Explicitly check for this, so we won't call + // Paragraph::getChar for the last pos. + bool const o_lastpos = o.pos() == o.lastpos(); + bool const n_lastpos = n.pos() == n.lastpos(); + if (o_lastpos || n_lastpos) + return o_lastpos && n_lastpos; + Paragraph const & old_par = o.text()->getPar(o.pit()); Paragraph const & new_par = n.text()->getPar(n.pit()); @@ -518,6 +538,7 @@ void Compare::Impl::furthestDpathKdiagonal(int D, int k, // Where do we take the step from ? int const kk = vertical_step ? k + 1 : k - 1; DocPair p(op[kk], np[kk]); + DocPair const s(os[kk], ns[kk]); // If D==0 we simulate a vertical step from (0,-1) by doing nothing. if (D != 0) { @@ -539,8 +560,8 @@ void Compare::Impl::furthestDpathKdiagonal(int D, int k, ns[k] = p.n; } else { // Copy last snake from the previous step - os[k] = os[kk]; - ns[k] = ns[kk]; + os[k] = s.o; + ns[k] = s.n; } //Record new position @@ -581,7 +602,7 @@ Compare::Impl::SnakeResult Compare::Impl::retrieveMiddleSnake( if (os[k].empty() && os_r[kk].empty()) { // No, there is no snake at all, in which case // the length of the shortest edit script is M+N. - LASSERT(2 * D - odd_offset_ == M_ + N_, /**/); + LATTEST(2 * D - odd_offset_ == M_ + N_); return NoSnake; } @@ -683,7 +704,9 @@ bool Compare::Impl::diff(Buffer const * new_buf, Buffer const * old_buf, processSnake(snake); // Start the recursive algorithm - diff_i(rp); + DocRangePair rp_new(from, rp.to()); + if (!rp_new.o.empty() || !rp_new.n.empty()) + diff_i(rp_new); for (pit_type p = 0; p < (pit_type)dest_pars_->size(); ++p) { (*dest_pars_)[p].setBuffer(const_cast(*dest_buf)); @@ -799,7 +822,7 @@ void Compare::Impl::processSnake(DocRangePair const & rp) pit_type const pit = it.o.pit() - rp.o.from.pit(); pos_type const pos = pit ? it.o.pos() : it.o.pos() - rp.o.from.pos(); inset = pars[pit].getInset(pos); - LASSERT(inset, /**/); + LASSERT(inset, continue); diffInset(inset, it); } }