emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/emacs-24 r108546: * regex.c (at_begline_loc


From: Andreas Schwab
Subject: [Emacs-diffs] /srv/bzr/emacs/emacs-24 r108546: * regex.c (at_begline_loc_p): Also recognize `(?N:' and correctly
Date: Fri, 02 Nov 2012 02:25:33 -0000
User-agent: Bazaar (2.5.0)

------------------------------------------------------------
revno: 108546
committer: Andreas Schwab <address@hidden>
branch nick: emacs
timestamp: Sun 2012-06-10 10:39:19 +0200
message:
  * regex.c (at_begline_loc_p): Also recognize `(?N:' and correctly
  account for preceding backslashes.  (Bug#11663)
modified:
  src/ChangeLog
  src/regex.c
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2012-06-09 16:44:44 +0000
+++ b/src/ChangeLog     2012-06-10 08:39:19 +0000
@@ -1,3 +1,8 @@
+2012-06-10  Andreas Schwab  <address@hidden>
+
+       * regex.c (at_begline_loc_p): Also recognize `(?N:' and correctly
+       account for preceding backslashes.  (Bug#11663)
+
 2012-06-09  Chong Yidong  <address@hidden>
 
        * term.c: Support italics in capable terminals (Bug#9652).

=== modified file 'src/regex.c'
--- a/src/regex.c       2012-05-21 15:36:54 +0000
+++ b/src/regex.c       2012-06-10 08:39:19 +0000
@@ -3824,18 +3824,37 @@
 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] == '\\';
-
-  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] == '\\')));
+  boolean odd_backslashes;
+
+  /* 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;
 }
 
 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]