Mercurial > vim
diff src/regexp.c @ 4679:4d92b873acef v7.3.1087
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.
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Sat, 01 Jun 2013 14:42:56 +0200 |
parents | 7a2be4a39423 |
children | 2f51ee8825db |
line wrap: on
line diff
--- a/src/regexp.c +++ b/src/regexp.c @@ -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)); @@ -2951,6 +2966,44 @@ initchr(str) } /* + * 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. */ static int