aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/RESearch.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/RESearch.cxx')
-rw-r--r--src/RESearch.cxx29
1 files changed, 20 insertions, 9 deletions
diff --git a/src/RESearch.cxx b/src/RESearch.cxx
index de4dc08a9..7b2701aba 100644
--- a/src/RESearch.cxx
+++ b/src/RESearch.cxx
@@ -253,7 +253,8 @@ RESearch::RESearch(CharClassify *charClassTable) {
failure = 0;
charClass = charClassTable;
sta = NOP; /* status of lastpat */
- bol = 0;
+ lineStartPos = 0;
+ lineEndPos = 0;
nfa[0] = END;
Clear();
}
@@ -740,7 +741,6 @@ int RESearch::Execute(const CharacterIndexer &ci, Sci::Position lp, Sci::Positio
Sci::Position ep = NOTFOUND;
const char * const ap = nfa;
- bol = lp;
failure = 0;
Clear();
@@ -751,7 +751,7 @@ int RESearch::Execute(const CharacterIndexer &ci, Sci::Position lp, Sci::Positio
ep = PMatch(ci, lp, endp, ap);
break;
case EOL: /* just searching for end of line normal path doesn't work */
- if (ap[1] == END) {
+ if (endp == lineEndPos && ap[1] == END) {
lp = endp;
ep = lp;
break;
@@ -777,8 +777,19 @@ int RESearch::Execute(const CharacterIndexer &ci, Sci::Position lp, Sci::Positio
case END: /* munged automaton. fail always */
return 0;
}
- if (ep == NOTFOUND)
- return 0;
+ if (ep == NOTFOUND) {
+ /* similar to EOL, match EOW at line end */
+ if (endp == lineEndPos && *ap == EOW) {
+ if ((ap[1] == END || ((ap[1] == EOL && ap[2] == END))) && iswordc(ci.CharAt(lp - 1))) {
+ lp = endp;
+ ep = lp;
+ } else {
+ return 0;
+ }
+ } else {
+ return 0;
+ }
+ }
bopat[0] = lp;
eopat[0] = ep;
@@ -846,11 +857,11 @@ Sci::Position RESearch::PMatch(const CharacterIndexer &ci, Sci::Position lp, Sci
ap += BITBLK;
break;
case BOL:
- if (lp != bol)
+ if (lp != lineStartPos)
return NOTFOUND;
break;
case EOL:
- if (lp < endp)
+ if (lp < lineEndPos)
return NOTFOUND;
break;
case BOT:
@@ -860,11 +871,11 @@ Sci::Position RESearch::PMatch(const CharacterIndexer &ci, Sci::Position lp, Sci
eopat[static_cast<unsigned char>(*ap++)] = lp;
break;
case BOW:
- if ((lp!=bol && iswordc(ci.CharAt(lp-1))) || !iswordc(ci.CharAt(lp)))
+ if ((lp!=lineStartPos && iswordc(ci.CharAt(lp-1))) || !iswordc(ci.CharAt(lp)))
return NOTFOUND;
break;
case EOW:
- if (lp==bol || !iswordc(ci.CharAt(lp-1)) || iswordc(ci.CharAt(lp)))
+ if (lp==lineStartPos || !iswordc(ci.CharAt(lp-1)) || iswordc(ci.CharAt(lp)))
return NOTFOUND;
break;
case REF: {