diff options
| author | Andreas Schwab | 2012-06-10 10:39:19 +0200 |
|---|---|---|
| committer | Andreas Schwab | 2012-06-10 10:39:19 +0200 |
| commit | 95988fcfa86170a61e488e5de3863468f50b6414 (patch) | |
| tree | 86b2c2c7ff7402ec16340677c484774222224b67 /src | |
| parent | 642b6d30c61ec63bdd5d891dd6bb85260c88211a (diff) | |
| download | emacs-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/ChangeLog | 5 | ||||
| -rw-r--r-- | src/regex.c | 41 |
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 @@ | |||
| 1 | 2012-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 | |||
| 1 | 2012-06-09 Chong Yidong <cyd@gnu.org> | 6 | 2012-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 | |||
| 3824 | at_begline_loc_p (const re_char *pattern, const re_char *p, reg_syntax_t syntax) | 3824 | at_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 | ||