diff options
Diffstat (limited to 'src/regexp.c')
-rw-r--r-- | src/regexp.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/src/regexp.c b/src/regexp.c index 74a73c440..7304bd349 100644 --- a/src/regexp.c +++ b/src/regexp.c @@ -1294,6 +1294,34 @@ skip_regexp( return p; } +/* + * Return TRUE if the back reference is legal. We must have seen the close + * brace. + * TODO: Should also check that we don't refer to something that is repeated + * (+*=): what instance of the repetition should we match? + */ + static int +seen_endbrace(int refnum) +{ + if (!had_endbrace[refnum]) + { + char_u *p; + + /* Trick: check if "@<=" or "@<!" follows, in which case + * the \1 can appear before the referenced match. */ + for (p = regparse; *p != NUL; ++p) + if (p[0] == '@' && p[1] == '<' && (p[2] == '!' || p[2] == '=')) + break; + if (*p == NUL) + { + EMSG(_("E65: Illegal back reference")); + rc_did_emsg = TRUE; + return FALSE; + } + } + return TRUE; +} + static regprog_T *bt_regcomp(char_u *expr, int re_flags); static void bt_regfree(regprog_T *prog); @@ -2099,24 +2127,8 @@ regatom(int *flagp) int refnum; refnum = c - Magic('0'); - /* - * Check if the back reference is legal. We must have seen the - * close brace. - * TODO: Should also check that we don't refer to something - * that is repeated (+*=): what instance of the repetition - * should we match? - */ - if (!had_endbrace[refnum]) - { - /* Trick: check if "@<=" or "@<!" follows, in which case - * the \1 can appear before the referenced match. */ - for (p = regparse; *p != NUL; ++p) - if (p[0] == '@' && p[1] == '<' - && (p[2] == '!' || p[2] == '=')) - break; - if (*p == NUL) - EMSG_RET_NULL(_("E65: Illegal back reference")); - } + if (!seen_endbrace(refnum)) + return NULL; ret = regnode(BACKREF + refnum); } break; |