mirror of
https://github.com/vim/vim.git
synced 2025-10-07 05:54:16 -04:00
updated for version 7.4b.004
Problem: Regexp crash on pattern "@\%[\w\-]*". (Axel Kielhorn) Solution: Add \%(\) around \%[] internally.
This commit is contained in:
@@ -1166,6 +1166,15 @@ nfa_regatom()
|
|||||||
reg_magic == MAGIC_ALL);
|
reg_magic == MAGIC_ALL);
|
||||||
EMIT(NFA_OPT_CHARS);
|
EMIT(NFA_OPT_CHARS);
|
||||||
EMIT(n);
|
EMIT(n);
|
||||||
|
|
||||||
|
/* Emit as "\%(\%[abc]\)" to be able to handle
|
||||||
|
* "\%[abc]*" which would cause the empty string to be
|
||||||
|
* matched an unlimited number of times. NFA_NOPEN is
|
||||||
|
* added only once at a position, while NFA_SPLIT is
|
||||||
|
* added multiple times. This is more efficient than
|
||||||
|
* not allowsing NFA_SPLIT multiple times, it is used
|
||||||
|
* a lot. */
|
||||||
|
EMIT(NFA_NOPEN);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1641,7 +1650,7 @@ nfa_regpiece()
|
|||||||
* engine interprets the plus as "try matching one more time", and
|
* engine interprets the plus as "try matching one more time", and
|
||||||
* a* matches a second time at the end of the input, the empty
|
* a* matches a second time at the end of the input, the empty
|
||||||
* string.
|
* string.
|
||||||
* The submatch will the empty string.
|
* The submatch will be the empty string.
|
||||||
*
|
*
|
||||||
* In order to be consistent with the old engine, we replace
|
* In order to be consistent with the old engine, we replace
|
||||||
* <atom>+ with <atom><atom>*
|
* <atom>+ with <atom><atom>*
|
||||||
@@ -2242,13 +2251,13 @@ nfa_postfix_dump(expr, retval)
|
|||||||
else if (retval == OK)
|
else if (retval == OK)
|
||||||
fprintf(f, ">>> NFA engine succeeded !\n");
|
fprintf(f, ">>> NFA engine succeeded !\n");
|
||||||
fprintf(f, "Regexp: \"%s\"\nPostfix notation (char): \"", expr);
|
fprintf(f, "Regexp: \"%s\"\nPostfix notation (char): \"", expr);
|
||||||
for (p = post_start; *p && p < post_end; p++)
|
for (p = post_start; *p && p < post_ptr; p++)
|
||||||
{
|
{
|
||||||
nfa_set_code(*p);
|
nfa_set_code(*p);
|
||||||
fprintf(f, "%s, ", code);
|
fprintf(f, "%s, ", code);
|
||||||
}
|
}
|
||||||
fprintf(f, "\"\nPostfix notation (int): ");
|
fprintf(f, "\"\nPostfix notation (int): ");
|
||||||
for (p = post_start; *p && p < post_end; p++)
|
for (p = post_start; *p && p < post_ptr; p++)
|
||||||
fprintf(f, "%d ", *p);
|
fprintf(f, "%d ", *p);
|
||||||
fprintf(f, "\n\n");
|
fprintf(f, "\n\n");
|
||||||
fclose(f);
|
fclose(f);
|
||||||
@@ -3005,7 +3014,18 @@ post2nfa(postfix, end, nfa_calc_size)
|
|||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
/* \%[abc] */
|
/* \%[abc] implemented as:
|
||||||
|
* NFA_SPLIT
|
||||||
|
* +-CHAR(a)
|
||||||
|
* | +-NFA_SPLIT
|
||||||
|
* | +-CHAR(b)
|
||||||
|
* | | +-NFA_SPLIT
|
||||||
|
* | | +-CHAR(c)
|
||||||
|
* | | | +-next
|
||||||
|
* | | +- next
|
||||||
|
* | +- next
|
||||||
|
* +- next
|
||||||
|
*/
|
||||||
n = *++p; /* get number of characters */
|
n = *++p; /* get number of characters */
|
||||||
if (nfa_calc_size == TRUE)
|
if (nfa_calc_size == TRUE)
|
||||||
{
|
{
|
||||||
|
@@ -373,6 +373,7 @@ STARTTEST
|
|||||||
:call add(tl, [2, '\%[bar]x', 'xxx', 'x'])
|
:call add(tl, [2, '\%[bar]x', 'xxx', 'x'])
|
||||||
:call add(tl, [2, 'b\%[[ao]r]', 'bar bor', 'bar'])
|
:call add(tl, [2, 'b\%[[ao]r]', 'bar bor', 'bar'])
|
||||||
:call add(tl, [2, 'b\%[[]]r]', 'b]r bor', 'b]r'])
|
:call add(tl, [2, 'b\%[[]]r]', 'b]r bor', 'b]r'])
|
||||||
|
:call add(tl, [2, '@\%[\w\-]*', '<http://john.net/pandoc/>[@pandoc]', '@pandoc'])
|
||||||
:"
|
:"
|
||||||
:"""" Alternatives, must use first longest match
|
:"""" Alternatives, must use first longest match
|
||||||
:call add(tl, [2, 'goo\|go', 'google', 'goo'])
|
:call add(tl, [2, 'goo\|go', 'google', 'goo'])
|
||||||
|
@@ -857,6 +857,9 @@ OK 2 - b\%[[ao]r]
|
|||||||
OK 0 - b\%[[]]r]
|
OK 0 - b\%[[]]r]
|
||||||
OK 1 - b\%[[]]r]
|
OK 1 - b\%[[]]r]
|
||||||
OK 2 - b\%[[]]r]
|
OK 2 - b\%[[]]r]
|
||||||
|
OK 0 - @\%[\w\-]*
|
||||||
|
OK 1 - @\%[\w\-]*
|
||||||
|
OK 2 - @\%[\w\-]*
|
||||||
OK 0 - goo\|go
|
OK 0 - goo\|go
|
||||||
OK 1 - goo\|go
|
OK 1 - goo\|go
|
||||||
OK 2 - goo\|go
|
OK 2 - goo\|go
|
||||||
|
@@ -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 */
|
||||||
|
/**/
|
||||||
|
4,
|
||||||
/**/
|
/**/
|
||||||
3,
|
3,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user