From: Andreas Schwab Date: Sun, 10 Jun 2012 08:39:19 +0000 (+0200) Subject: * regex.c (at_begline_loc_p): Also recognize `(?N:' and correctly X-Git-Tag: emacs-24.2.90~1199^2~474^2~67 X-Git-Url: https://code.delx.au/gnu-emacs/commitdiff_plain/95988fcfa86170a61e488e5de3863468f50b6414 * regex.c (at_begline_loc_p): Also recognize `(?N:' and correctly account for preceding backslashes. (Bug#11663) --- diff --git a/src/ChangeLog b/src/ChangeLog index fb8b2a7b95..919dcc1009 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2012-06-10 Andreas Schwab + + * regex.c (at_begline_loc_p): Also recognize `(?N:' and correctly + account for preceding backslashes. (Bug#11663) + 2012-06-09 Chong Yidong * term.c: Support italics in capable terminals (Bug#9652). diff --git a/src/regex.c b/src/regex.c index f9a12a3c2d..0dd3a18789 100644 --- a/src/regex.c +++ b/src/regex.c @@ -3824,18 +3824,37 @@ static boolean at_begline_loc_p (const re_char *pattern, const re_char *p, reg_syntax_t syntax) { re_char *prev = p - 2; - boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\'; + boolean odd_backslashes; - return - /* After a subexpression? */ - (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) - /* After an alternative? */ - || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash)) - /* After a shy subexpression? */ - || ((syntax & RE_SHY_GROUPS) && prev - 2 >= pattern - && prev[-1] == '?' && prev[-2] == '(' - && (syntax & RE_NO_BK_PARENS - || (prev - 3 >= pattern && prev[-3] == '\\'))); + /* After a subexpression? */ + if (*prev == '(') + odd_backslashes = (syntax & RE_NO_BK_PARENS) == 0; + + /* After an alternative? */ + else if (*prev == '|') + odd_backslashes = (syntax & RE_NO_BK_VBAR) == 0; + + /* After a shy subexpression? */ + else if (*prev == ':' && (syntax & RE_SHY_GROUPS)) + { + /* Skip over optional regnum. */ + while (prev - 1 >= pattern && prev[-1] >= '0' && prev[-1] <= '9') + --prev; + + if (!(prev - 2 >= pattern + && prev[-1] == '?' && prev[-2] == '(')) + return false; + prev -= 2; + odd_backslashes = (syntax & RE_NO_BK_PARENS) == 0; + } + else + return false; + + /* Count the number of preceding backslashes. */ + p = prev; + while (prev - 1 >= pattern && prev[-1] == '\\') + --prev; + return (p - prev) & odd_backslashes; }