X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCompare.cpp;h=32f404736c20e20a0ab92e0b2903acb4efe1aff0;hb=c0f4aa8c4b786dcfb3699b175dff63f109abba98;hp=53ccc5b6d104f35daa55597def4726159f78a631;hpb=d378b5d8ee962a66c28eb4a9f0c4d1be2d4f08f4;p=lyx.git diff --git a/src/Compare.cpp b/src/Compare.cpp index 53ccc5b6d1..32f404736c 100644 --- a/src/Compare.cpp +++ b/src/Compare.cpp @@ -22,8 +22,6 @@ #include -#include - using namespace std; using namespace lyx::support; @@ -446,6 +444,13 @@ static bool equal(Inset const * i_o, Inset const * i_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()); @@ -520,6 +525,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) { @@ -541,8 +547,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 @@ -625,9 +631,10 @@ int Compare::Impl::findMiddleSnake(DocRangePair const & rp, ors.reset(DocIterator()); nrs.reset(DocIterator()); + // In the formula below, the "+ 1" ensures we round like ceil() + int const D_max = (M_ + N_ + 1)/2; // D is the number of horizontal and vertical steps, i.e. // different characters in the old and new chunk. - int const D_max = ceil(((double)M_ + N_)/2); for (int D = 0; D <= D_max; ++D) { // to be used in the status messages D_ = D; @@ -651,6 +658,8 @@ int Compare::Impl::findMiddleSnake(DocRangePair const & rp, return 2 * D - odd_offset_; } } + if (abort_) + return 0; } } } @@ -682,7 +691,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)); @@ -695,6 +706,9 @@ bool Compare::Impl::diff(Buffer const * new_buf, Buffer const * old_buf, void Compare::Impl::diff_i(DocRangePair const & rp) { + if (abort_) + return; + // The middle snake DocPair middle_snake;