patch 8.2.2885: searching for \%'> does not match linewise end of line
Problem: searching for \%'> does not match linewise end of line. (Tim Chase)
Solution: Match end of line if column is MAXCOL. (closes #8238)
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c
index a519b85..2ed1868 100644
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -6806,22 +6806,30 @@
{
pos_T *pos = getmark_buf(rex.reg_buf, t->state->val, FALSE);
- // Compare the mark position to the match position.
- result = (pos != NULL // mark doesn't exist
- && pos->lnum > 0 // mark isn't set in reg_buf
- && (pos->lnum == rex.lnum + rex.reg_firstlnum
- ? (pos->col == (colnr_T)(rex.input - rex.line)
+ // Compare the mark position to the match position, if the mark
+ // exists and mark is set in reg_buf.
+ if (pos != NULL && pos->lnum > 0)
+ {
+ colnr_T pos_col = pos->lnum == rex.lnum + rex.reg_firstlnum
+ && pos->col == MAXCOL
+ ? (colnr_T)STRLEN(reg_getline(
+ pos->lnum - rex.reg_firstlnum))
+ : pos->col;
+
+ result = (pos->lnum == rex.lnum + rex.reg_firstlnum
+ ? (pos_col == (colnr_T)(rex.input - rex.line)
? t->state->c == NFA_MARK
- : (pos->col < (colnr_T)(rex.input - rex.line)
+ : (pos_col < (colnr_T)(rex.input - rex.line)
? t->state->c == NFA_MARK_GT
: t->state->c == NFA_MARK_LT))
: (pos->lnum < rex.lnum + rex.reg_firstlnum
? t->state->c == NFA_MARK_GT
- : t->state->c == NFA_MARK_LT)));
- if (result)
- {
- add_here = TRUE;
- add_state = t->state->out;
+ : t->state->c == NFA_MARK_LT));
+ if (result)
+ {
+ add_here = TRUE;
+ add_state = t->state->out;
+ }
}
break;
}