]> git.eshelyaron.com Git - emacs.git/commitdiff
(regexp-opt-depth): Don't count a "//(" which appears inside a character set.
authorJuanma Barranquero <lekktu@gmail.com>
Sat, 26 Apr 2003 23:29:45 +0000 (23:29 +0000)
committerJuanma Barranquero <lekktu@gmail.com>
Sat, 26 Apr 2003 23:29:45 +0000 (23:29 +0000)
(regexp-opt-not-groupie*-re): New constant.

lisp/ChangeLog
lisp/emacs-lisp/regexp-opt.el

index e04771d2188686c0ef78c4be80a2dc602f2b7b6e..f69e562a898cce62c15e556cf2948bb180f33678 100644 (file)
@@ -1,3 +1,9 @@
+2003-04-27  Alan Mackenzie  <acm@muc.de>
+
+       * emacs-lisp/regexp-opt.el (regexp-opt-depth): Don't count a "//("
+       which appears inside a character set.
+       (regexp-opt-not-groupie*-re): New constant.
+
 2003-04-26  John Paul Wallington  <jpw@gnu.org>
 
        * ibuffer.el (ibuffer-name-map, ibuffer-mode-name-map)
index 486cf006e4b1d12a77d7aa640805bf1fb4ced1cb..11a66aa2a147b7de13bbb3762605e4673e4fccf3 100644 (file)
@@ -110,6 +110,24 @@ by \\=\\< and \\>."
           (re (regexp-opt-group sorted-strings open)))
       (if words (concat "\\<" re "\\>") re))))
 
+(defconst regexp-opt-not-groupie*-re
+  (let* ((harmless-ch "[^\\\\[]")
+         (esc-pair-not-lp "\\\\[^(]")
+         (class-harmless-ch "[^][]")
+         (class-lb-harmless "[^]:]")
+         (class-lb-colon-maybe-charclass ":\\([a-z]+:]\\)?")
+         (class-lb (concat "\\[\\(" class-lb-harmless
+                           "\\|" class-lb-colon-maybe-charclass "\\)"))
+         (class
+          (concat "\\[^?]?"
+                  "\\(" class-harmless-ch
+                  "\\|" class-lb "\\)*"
+                  "\\[?]"))         ; special handling for bare [ at end of re
+         (shy-lp "\\\\(\\?:"))
+    (concat "\\(" harmless-ch "\\|" esc-pair-not-lp
+            "\\|" class "\\|" shy-lp "\\)*"))
+  "Matches any part of a regular expression EXCEPT for non-shy \"\\\\(\"s")
+
 ;;;###autoload
 (defun regexp-opt-depth (regexp)
   "Return the depth of REGEXP.
@@ -120,11 +138,12 @@ in REGEXP."
     (string-match regexp "")
     ;; Count the number of open parentheses in REGEXP.
     (let ((count 0) start)
-      (while (string-match "\\(\\`\\|[^\\]\\)\\\\\\(\\\\\\\\\\)*([^?]"
-                          regexp start)
-       (setq count (1+ count)
-             ;; Go back 2 chars (one for [^?] and one for [^\\]).
-             start (- (match-end 0) 2)))
+      (while
+          (progn
+            (string-match regexp-opt-not-groupie*-re regexp start)
+            (setq start ( + (match-end 0) 2))  ; +2 for "\\(" after match-end.
+            (<= start (length regexp)))
+        (setq count (1+ count)))
       count)))
 \f
 ;;; Workhorse functions.