forked from aniani/vim
updated for version 7.4.037
Problem: Using "\ze" in a sub-pattern does not result in the end of the match to be set. (Axel Bender) Solution: Copy the end of match position when a recursive match was successful.
This commit is contained in:
@@ -3822,6 +3822,7 @@ static void copy_pim __ARGS((nfa_pim_T *to, nfa_pim_T *from));
|
|||||||
static void clear_sub __ARGS((regsub_T *sub));
|
static void clear_sub __ARGS((regsub_T *sub));
|
||||||
static void copy_sub __ARGS((regsub_T *to, regsub_T *from));
|
static void copy_sub __ARGS((regsub_T *to, regsub_T *from));
|
||||||
static void copy_sub_off __ARGS((regsub_T *to, regsub_T *from));
|
static void copy_sub_off __ARGS((regsub_T *to, regsub_T *from));
|
||||||
|
static void copy_ze_off __ARGS((regsub_T *to, regsub_T *from));
|
||||||
static int sub_equal __ARGS((regsub_T *sub1, regsub_T *sub2));
|
static int sub_equal __ARGS((regsub_T *sub1, regsub_T *sub2));
|
||||||
static int match_backref __ARGS((regsub_T *sub, int subidx, int *bytelen));
|
static int match_backref __ARGS((regsub_T *sub, int subidx, int *bytelen));
|
||||||
static int has_state_with_pos __ARGS((nfa_list_T *l, nfa_state_T *state, regsubs_T *subs, nfa_pim_T *pim));
|
static int has_state_with_pos __ARGS((nfa_list_T *l, nfa_state_T *state, regsubs_T *subs, nfa_pim_T *pim));
|
||||||
@@ -3908,6 +3909,29 @@ copy_sub_off(to, from)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Like copy_sub() but only do the end of the main match if \ze is present.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
copy_ze_off(to, from)
|
||||||
|
regsub_T *to;
|
||||||
|
regsub_T *from;
|
||||||
|
{
|
||||||
|
if (nfa_has_zend)
|
||||||
|
{
|
||||||
|
if (REG_MULTI)
|
||||||
|
{
|
||||||
|
if (from->list.multi[0].end.lnum >= 0)
|
||||||
|
to->list.multi[0].end = from->list.multi[0].end;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (from->list.line[0].end != NULL)
|
||||||
|
to->list.line[0].end = from->list.line[0].end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return TRUE if "sub1" and "sub2" have the same start positions.
|
* Return TRUE if "sub1" and "sub2" have the same start positions.
|
||||||
*/
|
*/
|
||||||
@@ -5308,6 +5332,7 @@ find_match_text(startcol, regstart, match_text)
|
|||||||
* When "nfa_endp" is not NULL it is a required end-of-match position.
|
* When "nfa_endp" is not NULL it is a required end-of-match position.
|
||||||
*
|
*
|
||||||
* Return TRUE if there is a match, FALSE otherwise.
|
* Return TRUE if there is a match, FALSE otherwise.
|
||||||
|
* When there is a match "submatch" contains the positions.
|
||||||
* Note: Caller must ensure that: start != NULL.
|
* Note: Caller must ensure that: start != NULL.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
@@ -5633,6 +5658,9 @@ nfa_regmatch(prog, start, submatch, m)
|
|||||||
if (nfa_has_zsubexpr)
|
if (nfa_has_zsubexpr)
|
||||||
copy_sub_off(&t->subs.synt, &m->synt);
|
copy_sub_off(&t->subs.synt, &m->synt);
|
||||||
#endif
|
#endif
|
||||||
|
/* If the pattern has \ze and it matched in the
|
||||||
|
* sub pattern, use it. */
|
||||||
|
copy_ze_off(&t->subs.norm, &m->norm);
|
||||||
|
|
||||||
/* t->state->out1 is the corresponding
|
/* t->state->out1 is the corresponding
|
||||||
* END_INVISIBLE node; Add its out to the current
|
* END_INVISIBLE node; Add its out to the current
|
||||||
|
@@ -425,6 +425,7 @@ STARTTEST
|
|||||||
:"
|
:"
|
||||||
:" complicated look-behind match
|
:" complicated look-behind match
|
||||||
:call add(tl, [2, '\(r\@<=\|\w\@<!\)\/', 'x = /word/;', '/'])
|
:call add(tl, [2, '\(r\@<=\|\w\@<!\)\/', 'x = /word/;', '/'])
|
||||||
|
:call add(tl, [2, '^[a-z]\+\ze \&\(asdf\)\@<!', 'foo bar', 'foo'])
|
||||||
:"
|
:"
|
||||||
:""""" \@>
|
:""""" \@>
|
||||||
:call add(tl, [2, '\(a*\)\@>a', 'aaaa'])
|
:call add(tl, [2, '\(a*\)\@>a', 'aaaa'])
|
||||||
|
@@ -983,6 +983,9 @@ OK 2 - \(foo\)\@<=.*
|
|||||||
OK 0 - \(r\@<=\|\w\@<!\)\/
|
OK 0 - \(r\@<=\|\w\@<!\)\/
|
||||||
OK 1 - \(r\@<=\|\w\@<!\)\/
|
OK 1 - \(r\@<=\|\w\@<!\)\/
|
||||||
OK 2 - \(r\@<=\|\w\@<!\)\/
|
OK 2 - \(r\@<=\|\w\@<!\)\/
|
||||||
|
OK 0 - ^[a-z]\+\ze \&\(asdf\)\@<!
|
||||||
|
OK 1 - ^[a-z]\+\ze \&\(asdf\)\@<!
|
||||||
|
OK 2 - ^[a-z]\+\ze \&\(asdf\)\@<!
|
||||||
OK 0 - \(a*\)\@>a
|
OK 0 - \(a*\)\@>a
|
||||||
OK 1 - \(a*\)\@>a
|
OK 1 - \(a*\)\@>a
|
||||||
OK 2 - \(a*\)\@>a
|
OK 2 - \(a*\)\@>a
|
||||||
|
@@ -738,6 +738,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
37,
|
||||||
/**/
|
/**/
|
||||||
36,
|
36,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user