]> code.delx.au - gnu-emacs/commitdiff
* regex.c (at_begline_loc_p): Also recognize `(?N:' and correctly
authorAndreas Schwab <schwab@linux-m68k.org>
Sun, 10 Jun 2012 08:39:19 +0000 (10:39 +0200)
committerAndreas Schwab <schwab@linux-m68k.org>
Sun, 10 Jun 2012 08:39:19 +0000 (10:39 +0200)
account for preceding backslashes.  (Bug#11663)

src/ChangeLog
src/regex.c

index fb8b2a7b9568386fd877bf36bd559bbb1957ac7c..919dcc1009807773d22e514fec608ae4ade804ea 100644 (file)
@@ -1,3 +1,8 @@
+2012-06-10  Andreas Schwab  <schwab@linux-m68k.org>
+
+       * regex.c (at_begline_loc_p): Also recognize `(?N:' and correctly
+       account for preceding backslashes.  (Bug#11663)
+
 2012-06-09  Chong Yidong  <cyd@gnu.org>
 
        * term.c: Support italics in capable terminals (Bug#9652).
index f9a12a3c2dc11e246750398390ba14ac94ef03e0..0dd3a187898ad65b14251ada303fc10eca958bce 100644 (file)
@@ -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;
 }