forked from aniani/vim
updated for version 7.4a.032
Problem: New regexp engine: Does not match shorter alternative. (Ingo Karkat) Solution: Do not drop a new state when the PIM info is different.
This commit is contained in:
@@ -3535,7 +3535,8 @@ 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 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));
|
static int has_state_with_pos __ARGS((nfa_list_T *l, nfa_state_T *state, regsubs_T *subs, nfa_pim_T *pim));
|
||||||
|
static int pim_equal __ARGS((nfa_pim_T *one, nfa_pim_T *two));
|
||||||
static int state_in_list __ARGS((nfa_list_T *l, nfa_state_T *state, regsubs_T *subs));
|
static int state_in_list __ARGS((nfa_list_T *l, nfa_state_T *state, regsubs_T *subs));
|
||||||
static regsubs_T *addstate __ARGS((nfa_list_T *l, nfa_state_T *state, regsubs_T *subs_arg, nfa_pim_T *pim, int off));
|
static regsubs_T *addstate __ARGS((nfa_list_T *l, nfa_state_T *state, regsubs_T *subs_arg, nfa_pim_T *pim, int off));
|
||||||
static void addstate_here __ARGS((nfa_list_T *l, nfa_state_T *state, regsubs_T *subs, nfa_pim_T *pim, int *ip));
|
static void addstate_here __ARGS((nfa_list_T *l, nfa_state_T *state, regsubs_T *subs, nfa_pim_T *pim, int *ip));
|
||||||
@@ -3701,10 +3702,11 @@ report_state(char *action,
|
|||||||
* positions as "subs".
|
* positions as "subs".
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
has_state_with_pos(l, state, subs)
|
has_state_with_pos(l, state, subs, pim)
|
||||||
nfa_list_T *l; /* runtime state list */
|
nfa_list_T *l; /* runtime state list */
|
||||||
nfa_state_T *state; /* state to update */
|
nfa_state_T *state; /* state to update */
|
||||||
regsubs_T *subs; /* pointers to subexpressions */
|
regsubs_T *subs; /* pointers to subexpressions */
|
||||||
|
nfa_pim_T *pim; /* postponed match or NULL */
|
||||||
{
|
{
|
||||||
nfa_thread_T *thread;
|
nfa_thread_T *thread;
|
||||||
int i;
|
int i;
|
||||||
@@ -3718,12 +3720,37 @@ has_state_with_pos(l, state, subs)
|
|||||||
&& (!nfa_has_zsubexpr
|
&& (!nfa_has_zsubexpr
|
||||||
|| sub_equal(&thread->subs.synt, &subs->synt))
|
|| sub_equal(&thread->subs.synt, &subs->synt))
|
||||||
#endif
|
#endif
|
||||||
)
|
&& pim_equal(&thread->pim, pim))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return TRUE if "one" and "two" are equal. That includes when both are not
|
||||||
|
* set.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
pim_equal(one, two)
|
||||||
|
nfa_pim_T *one;
|
||||||
|
nfa_pim_T *two;
|
||||||
|
{
|
||||||
|
int one_unused = (one == NULL || one->result == NFA_PIM_UNUSED);
|
||||||
|
int two_unused = (two == NULL || two->result == NFA_PIM_UNUSED);
|
||||||
|
|
||||||
|
if (one_unused)
|
||||||
|
/* one is unused: equal when two is also unused */
|
||||||
|
return two_unused;
|
||||||
|
if (two_unused)
|
||||||
|
/* one is used and two is not: not equal */
|
||||||
|
return FALSE;
|
||||||
|
/* compare the position */
|
||||||
|
if (REG_MULTI)
|
||||||
|
return one->end.pos.lnum == two->end.pos.lnum
|
||||||
|
&& one->end.pos.col == two->end.pos.col;
|
||||||
|
return one->end.ptr == two->end.ptr;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return TRUE if "state" leads to a NFA_MATCH without advancing the input.
|
* Return TRUE if "state" leads to a NFA_MATCH without advancing the input.
|
||||||
*/
|
*/
|
||||||
@@ -3825,7 +3852,7 @@ state_in_list(l, state, subs)
|
|||||||
{
|
{
|
||||||
if (state->lastlist[nfa_ll_index] == l->id)
|
if (state->lastlist[nfa_ll_index] == l->id)
|
||||||
{
|
{
|
||||||
if (!nfa_has_backref || has_state_with_pos(l, state, subs))
|
if (!nfa_has_backref || has_state_with_pos(l, state, subs, NULL))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -3952,7 +3979,7 @@ skip_add:
|
|||||||
|
|
||||||
/* Do not add the state again when it exists with the same
|
/* Do not add the state again when it exists with the same
|
||||||
* positions. */
|
* positions. */
|
||||||
if (has_state_with_pos(l, state, subs))
|
if (has_state_with_pos(l, state, subs, pim))
|
||||||
goto skip_add;
|
goto skip_add;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -727,6 +727,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 */
|
||||||
|
/**/
|
||||||
|
32,
|
||||||
/**/
|
/**/
|
||||||
31,
|
31,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user