]> git.lyx.org Git - lyx.git/blobdiff - src/Compare.cpp
Fix for bug #7360. Patch from Nemah, posted to bug report.
[lyx.git] / src / Compare.cpp
index 06730e1b59be6d127b36052a0b4d1ea67961859e..f5d1d5476110fd8fe2594b30a793e50528907a88 100644 (file)
@@ -14,6 +14,7 @@
 
 #include "BufferParams.h"
 #include "Changes.h"
+#include "Font.h"
 
 #include "insets/InsetText.h"
 
@@ -22,8 +23,6 @@
 
 #include <boost/next_prior.hpp>
 
-#include <cmath>
-
 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; 
@@ -684,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<Buffer &>(*dest_buf));