#define displayMres(s,i)
#endif
-/** Finalize an advanced find operation, advancing the cursor to the innermost
- ** position that matches, plus computing the length of the matching text to
- ** be selected
- **/
-int findAdvFinalize(DocIterator & cur, MatchStringAdv const & match, int expected_len)
+static bool findAdvForwardInnermost(DocIterator & cur)
{
- // Search the foremost position that matches (avoids find of entire math
- // inset when match at start of it)
size_t d;
DocIterator old_cur(cur.buffer());
- MatchResult mres;
+ int forwardCount = 0;
do {
- LYXERR(Debug::FIND, "Forwarding one step (searching for innermost match)");
d = cur.depth();
old_cur = cur;
cur.forwardPos();
- if (!cur)
+ if (!cur) {
break;
- if (cur.depth() > d)
+ }
+ if (cur.depth() > d) {
+ forwardCount++;
continue;
+ }
if (cur.depth() == d)
break;
+ } while(1);
+ cur = old_cur;
+ if (forwardCount > 0) {
+ LYXERR(Debug::FIND, "Forwarded " << forwardCount << " step(s) (searching for innermost match)");
+ return true;;
+ }
+ else
+ return false;
+}
+
+/** Finalize an advanced find operation, advancing the cursor to the innermost
+ ** position that matches, plus computing the length of the matching text to
+ ** be selected
+ **/
+int findAdvFinalize(DocIterator & cur, MatchStringAdv const & match, int expected_len)
+{
+ // Search the foremost position that matches (avoids find of entire math
+ // inset when match at start of it)
+ DocIterator old_cur(cur.buffer());
+ MatchResult mres;
+ int max_match;
+ if (findAdvForwardInnermost(cur)) {
mres = match(cur);
- displayMres(mres, 1);
+ displayMres(mres, 0);
if (expected_len > 0) {
if (mres.match_len < expected_len)
- break;
+ return 0;
}
else {
if (mres.match_len <= 0)
- break;
+ return 0;
}
- } while (1);
- cur = old_cur;
- mres = match(cur); /* match valid only if not searching whole words */
- int max_match = mres.match_len;
+ max_match = mres.match_len;
+ }
+ else if (expected_len < 0) {
+ mres = match(cur); /* match valid only if not searching whole words */
+ displayMres(mres, 0);
+ max_match = mres.match_len;
+ }
+ else {
+ max_match = expected_len;
+ }
if (max_match <= 0) return 0;
LYXERR(Debug::FIND, "Ok");
int maxl = cur.lastpos() - cur.pos();
// Greedy behaviour while matching regexps
while (maxl > minl) {
- int actual_match = match(cur, len).match_len;
+ MatchResult mres2;
+ mres2 = match(cur, len);
+ displayMres(mres2, len);
+ int actual_match = mres2.match_len;
if (actual_match >= max_match) {
// actual_match > max_match _can_ happen,
// if the search area splits
if (!cur)
return 0;
while (!theApp()->longOperationCancelled() && cur) {
- {
- // forward to
- size_t d;
- DocIterator old_cur(cur.buffer());
- do {
- d = cur.depth();
- old_cur = cur;
- cur.forwardPos();
- if (!cur)
- break;
- if (cur.depth() > d)
- continue;
- if (cur.depth() == d)
- break;
- } while (1);
- cur = old_cur;
- }
-
+ (void) findAdvForwardInnermost(cur);
LYXERR(Debug::FIND, "findForwardAdv() cur: " << cur);
MatchResult mres = match(cur, -1, false);
displayMres(mres,-1)
match_len = findForwardAdv(cur, matchAdv);
else
match_len = findBackwardsAdv(cur, matchAdv);
- } catch (...) {
- // This may only be raised by lyx::regex()
- bv->message(_("Invalid regular expression!"));
+ } catch (exception & ex) {
+ bv->message(from_ascii(ex.what()));
return false;
}