1
0
forked from aniani/vim

updated for version 7.3.1087

Problem:    A leading star is not seen as a normal char when \{} follows.
Solution:   Save and restore the parse state properly.
This commit is contained in:
Bram Moolenaar
2013-06-01 14:42:56 +02:00
parent 75d7a06920
commit 3737fc1c30
5 changed files with 79 additions and 17 deletions

View File

@@ -665,10 +665,25 @@ static int nextchr; /* used for ungetchr() */
#define REG_ZPAREN 2 /* \z(\) */
#define REG_NPAREN 3 /* \%(\) */
typedef struct
{
char_u *regparse;
int prevchr_len;
int curchr;
int prevchr;
int prevprevchr;
int nextchr;
int at_start;
int prev_at_start;
int regnpar;
} parse_state_T;
/*
* Forward declarations for vim_regcomp()'s friends.
*/
static void initchr __ARGS((char_u *));
static void save_parse_state __ARGS((parse_state_T *ps));
static void restore_parse_state __ARGS((parse_state_T *ps));
static int getchr __ARGS((void));
static void skipchr_keepstart __ARGS((void));
static int peekchr __ARGS((void));
@@ -2950,6 +2965,44 @@ initchr(str)
prev_at_start = FALSE;
}
/*
* Save the current parse state, so that it can be restored and parsing
* starts in the same state again.
*/
static void
save_parse_state(ps)
parse_state_T *ps;
{
ps->regparse = regparse;
ps->prevchr_len = prevchr_len;
ps->curchr = curchr;
ps->prevchr = prevchr;
ps->prevprevchr = prevprevchr;
ps->nextchr = nextchr;
ps->at_start = at_start;
ps->prev_at_start = prev_at_start;
ps->regnpar = regnpar;
}
/*
* Restore a previously saved parse state.
*/
static void
restore_parse_state(ps)
parse_state_T *ps;
{
regparse = ps->regparse;
prevchr_len = ps->prevchr_len;
curchr = ps->curchr;
prevchr = ps->prevchr;
prevprevchr = ps->prevprevchr;
nextchr = ps->nextchr;
at_start = ps->at_start;
prev_at_start = ps->prev_at_start;
regnpar = ps->regnpar;
}
/*
* Get the next character without advancing.
*/