X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCompare.cpp;h=f5d1d5476110fd8fe2594b30a793e50528907a88;hb=0fd75fefc4aa1816f8d5a72ed0e30f8accdd0bfc;hp=53ccc5b6d104f35daa55597def4726159f78a631;hpb=d378b5d8ee962a66c28eb4a9f0c4d1be2d4f08f4;p=lyx.git diff --git a/src/Compare.cpp b/src/Compare.cpp index 53ccc5b6d1..f5d1d54761 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" @@ -22,8 +23,6 @@ #include -#include - using namespace std; using namespace lyx::support; @@ -446,6 +445,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 +526,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 +548,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 +632,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 +659,8 @@ int Compare::Impl::findMiddleSnake(DocRangePair const & rp, return 2 * D - odd_offset_; } } + if (abort_) + return 0; } } } @@ -682,7 +692,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 +707,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;