[LyX/master] FindAdv: Do not search in deleted text.
Kornel Benko
kornel at lyx.org
Fri Jan 22 16:03:09 UTC 2021
commit 469b43c791339b047112e39a078a3daf800c0699
Author: Kornel Benko <kornel at lyx.org>
Date: Fri Jan 22 17:03:54 2021 +0100
FindAdv: Do not search in deleted text.
---
src/lyxfind.cpp | 88 ++++++++++++++++++++++----------------------------
src/output_latex.cpp | 8 ++--
2 files changed, 43 insertions(+), 53 deletions(-)
diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp
index 053f19a..be529ca 100644
--- a/src/lyxfind.cpp
+++ b/src/lyxfind.cpp
@@ -3622,10 +3622,10 @@ int findForwardAdv(DocIterator & cur, MatchStringAdv & match)
else { // match_len > 0
// Try to find the begin of searched string
int increment;
- int firstInvalid = 100000;
+ int firstInvalid = cur.lastpos() - cur.pos();
{
int incrmatch = (mres.match_prefix + mres.pos - mres.leadsize + 1)*3/4;
- int incrcur = (cur.lastpos() - cur.pos() + 1 )*3/4;
+ int incrcur = (firstInvalid + 1 )*3/4;
if (incrcur < incrmatch)
increment = incrcur;
else
@@ -3636,54 +3636,44 @@ int findForwardAdv(DocIterator & cur, MatchStringAdv & match)
LYXERR(Debug::FIND, "Set increment to " << increment);
while (increment > 0) {
DocIterator old_cur = cur;
- size_t skipping = cur.depth();
- for (int i = 0; i < increment && cur; i++) {
- cur.forwardPos();
- while (cur && cur.depth() > skipping) {
- cur.pos() = cur.lastpos();
- cur.forwardPos();
- }
- }
- if (! cur || (cur.pit() > old_cur.pit())) {
- // Are we outside of the paragraph?
- // This can happen if moving past some UTF8-encoded chars
- cur = old_cur;
+ if (cur.pos() + increment >= cur.lastpos()) {
increment /= 2;
+ continue;
}
- else {
- MatchResult mres2 = match(cur, -1, false);
- displayMres(mres2, "findForwardAdv loop", cur)
- switch (interpretMatch(mres, mres2)) {
+ cur.pos() = cur.pos() + increment;
+ MatchResult mres2 = match(cur, -1, false);
+ displayMres(mres2, "findForwardAdv loop", cur)
+ switch (interpretMatch(mres, mres2)) {
case MatchResult::newIsTooFar:
- // behind the expected match
- firstInvalid = increment;
- cur = old_cur;
- increment /= 2;
- break;
+ // behind the expected match
+ firstInvalid = increment;
+ cur = old_cur;
+ increment /= 2;
+ break;
case MatchResult::newIsBetter:
- // not reached yet, but cur.pos()+increment is bettert
- mres = mres2;
- firstInvalid -= increment;
- if (increment > firstInvalid*3/4)
- increment = firstInvalid*3/4;
- if ((mres2.pos == mres2.leadsize) && (increment >= mres2.match_prefix)) {
- if (increment >= mres2.match_prefix)
- increment = (mres2.match_prefix+1)*3/4;
- }
- break;
+ // not reached yet, but cur.pos()+increment is bettert
+ mres = mres2;
+ firstInvalid -= increment;
+ if (increment > firstInvalid*3/4)
+ increment = firstInvalid*3/4;
+ if ((mres2.pos == mres2.leadsize) && (increment >= mres2.match_prefix)) {
+ if (increment >= mres2.match_prefix)
+ increment = (mres2.match_prefix+1)*3/4;
+ }
+ break;
default:
- // Todo@
- // Handle not like MatchResult::newIsTooFar
- LYXERR0( "Probably too far: Increment = " << increment << " match_prefix = " << mres.match_prefix);
- firstInvalid--;
- increment = increment*3/4;
- cur = old_cur;
- break;
- }
+ // Todo@
+ // Handle not like MatchResult::newIsTooFar
+ LYXERR0( "Probably too far: Increment = " << increment << " match_prefix = " << mres.match_prefix);
+ firstInvalid--;
+ increment = increment*3/4;
+ cur = old_cur;
+ break;
}
}
if (mres.match_len > 0) {
if (mres.match_prefix + mres.pos - mres.leadsize > 0) {
+ // The match seems to indicate some deeper level
repeat = true;
orig_cur = cur;
orig_mres = mres;
@@ -3692,7 +3682,7 @@ int findForwardAdv(DocIterator & cur, MatchStringAdv & match)
}
}
else if (repeat) {
- // seems to never be reached.
+ // should never be reached.
cur = orig_cur;
mres = orig_mres;
}
@@ -3700,15 +3690,15 @@ int findForwardAdv(DocIterator & cur, MatchStringAdv & match)
LYXERR(Debug::FIND, "Finalizing 1");
MatchResult found_match = findAdvFinalize(cur, match, mres);
if (found_match.match_len > 0) {
- LASSERT(found_match.pos_len > 0, /**/);
- match.FillResults(found_match);
- return found_match.pos_len;
+ LASSERT(found_match.pos_len > 0, /**/);
+ match.FillResults(found_match);
+ return found_match.pos_len;
}
else {
- // try next possible match
- cur.forwardPos();
- repeat = false;
- continue;
+ // try next possible match
+ cur.forwardPos();
+ repeat = false;
+ continue;
}
}
}
diff --git a/src/output_latex.cpp b/src/output_latex.cpp
index fe50442..2f5d964 100644
--- a/src/output_latex.cpp
+++ b/src/output_latex.cpp
@@ -444,7 +444,7 @@ void TeXEnvironment(Buffer const & buf, Text const & text,
if ((par->layout() != nextpar->layout()
|| par->params().depth() == nextpar->params().depth()
|| par->params().leftIndent() == nextpar->params().leftIndent())
- && !runparams.for_search && !cpar.empty()
+ && !cpar.empty()
&& cpar.isDeleted(0, cpar.size()) && !buf.params().output_changes) {
if (!buf.params().output_changes && !cpar.parEndChange().deleted())
os << '\n' << '\n';
@@ -759,7 +759,7 @@ void TeXOnePar(Buffer const & buf,
// Do not output empty commands if the whole paragraph has
// been deleted with ct and changes are not output.
- if (!runparams_in.for_search && style.latextype != LATEX_ENVIRONMENT
+ if (style.latextype != LATEX_ENVIRONMENT
&& !par.empty() && par.isDeleted(0, par.size()) && !bparams.output_changes)
return;
@@ -1665,7 +1665,7 @@ void latexParagraphs(Buffer const & buf,
if ((par->layout() != nextpar->layout()
|| par->params().depth() == nextpar->params().depth()
|| par->params().leftIndent() == nextpar->params().leftIndent())
- && !runparams.for_search && !cpar.empty()
+ && !cpar.empty()
&& cpar.isDeleted(0, cpar.size()) && !bparams.output_changes) {
if (!cpar.parEndChange().deleted())
os << '\n' << '\n';
@@ -1674,7 +1674,7 @@ void latexParagraphs(Buffer const & buf,
} else {
// This is the last par
Paragraph const & cpar = paragraphs.at(pit);
- if (!runparams.for_search && !cpar.empty()
+ if (!cpar.empty()
&& cpar.isDeleted(0, cpar.size()) && !bparams.output_changes) {
if (!cpar.parEndChange().deleted())
os << '\n' << '\n';
More information about the lyx-cvs
mailing list