aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndreas Schwab2012-06-10 10:39:19 +0200
committerAndreas Schwab2012-06-10 10:39:19 +0200
commit95988fcfa86170a61e488e5de3863468f50b6414 (patch)
tree86b2c2c7ff7402ec16340677c484774222224b67 /src
parent642b6d30c61ec63bdd5d891dd6bb85260c88211a (diff)
downloademacs-95988fcfa86170a61e488e5de3863468f50b6414.tar.gz
emacs-95988fcfa86170a61e488e5de3863468f50b6414.zip
* regex.c (at_begline_loc_p): Also recognize `(?N:' and correctly
account for preceding backslashes. (Bug#11663)
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog5
-rw-r--r--src/regex.c41
2 files changed, 35 insertions, 11 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index fb8b2a7b956..919dcc10098 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
12012-06-10 Andreas Schwab <schwab@linux-m68k.org>
2
3 * regex.c (at_begline_loc_p): Also recognize `(?N:' and correctly
4 account for preceding backslashes. (Bug#11663)
5
12012-06-09 Chong Yidong <cyd@gnu.org> 62012-06-09 Chong Yidong <cyd@gnu.org>
2 7
3 * term.c: Support italics in capable terminals (Bug#9652). 8 * term.c: Support italics in capable terminals (Bug#9652).
diff --git a/src/regex.c b/src/regex.c
index f9a12a3c2dc..0dd3a187898 100644
--- a/src/regex.c
+++ b/src/regex.c
@@ -3824,18 +3824,37 @@ static boolean
3824at_begline_loc_p (const re_char *pattern, const re_char *p, reg_syntax_t syntax) 3824at_begline_loc_p (const re_char *pattern, const re_char *p, reg_syntax_t syntax)
3825{ 3825{
3826 re_char *prev = p - 2; 3826 re_char *prev = p - 2;
3827 boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\'; 3827 boolean odd_backslashes;
3828 3828
3829 return 3829 /* After a subexpression? */
3830 /* After a subexpression? */ 3830 if (*prev == '(')
3831 (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) 3831 odd_backslashes = (syntax & RE_NO_BK_PARENS) == 0;
3832 /* After an alternative? */ 3832
3833 || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash)) 3833 /* After an alternative? */
3834 /* After a shy subexpression? */ 3834 else if (*prev == '|')
3835 || ((syntax & RE_SHY_GROUPS) && prev - 2 >= pattern 3835 odd_backslashes = (syntax & RE_NO_BK_VBAR) == 0;
3836 && prev[-1] == '?' && prev[-2] == '(' 3836
3837 && (syntax & RE_NO_BK_PARENS 3837 /* After a shy subexpression? */
3838 || (prev - 3 >= pattern && prev[-3] == '\\'))); 3838 else if (*prev == ':' && (syntax & RE_SHY_GROUPS))
3839 {
3840 /* Skip over optional regnum. */
3841 while (prev - 1 >= pattern && prev[-1] >= '0' && prev[-1] <= '9')
3842 --prev;
3843
3844 if (!(prev - 2 >= pattern
3845 && prev[-1] == '?' && prev[-2] == '('))
3846 return false;
3847 prev -= 2;
3848 odd_backslashes = (syntax & RE_NO_BK_PARENS) == 0;
3849 }
3850 else
3851 return false;
3852
3853 /* Count the number of preceding backslashes. */
3854 p = prev;
3855 while (prev - 1 >= pattern && prev[-1] == '\\')
3856 --prev;
3857 return (p - prev) & odd_backslashes;
3839} 3858}
3840 3859
3841 3860