From mboxrd@z Thu Jan 1 00:00:00 1970 Path: main.gmane.org!not-for-mail From: Alan Mackenzie Newsgroups: gmane.emacs.bugs Subject: (regexp-opt-depth "[\\(]") => 1 :-( Date: Sun, 20 Apr 2003 22:30:03 +0000 (GMT) Sender: bug-gnu-emacs-bounces+gnu-bug-gnu-emacs=m.gmane.org@gnu.org Message-ID: NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Trace: main.gmane.org 1050877778 16152 80.91.224.249 (20 Apr 2003 22:29:38 GMT) X-Complaints-To: usenet@main.gmane.org NNTP-Posting-Date: Sun, 20 Apr 2003 22:29:38 +0000 (UTC) Original-X-From: bug-gnu-emacs-bounces+gnu-bug-gnu-emacs=m.gmane.org@gnu.org Mon Apr 21 00:29:35 2003 Return-path: Original-Received: from monty-python.gnu.org ([199.232.76.173]) by main.gmane.org with esmtp (Exim 3.35 #1 (Debian)) id 197NJX-0004CB-00 for ; Mon, 21 Apr 2003 00:29:35 +0200 Original-Received: from localhost ([127.0.0.1] helo=monty-python.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.10.13) id 197NK7-0003go-04 for gnu-bug-gnu-emacs@m.gmane.org; Sun, 20 Apr 2003 18:30:11 -0400 Original-Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10.13) id 197NJy-0003cY-00 for bug-gnu-emacs@gnu.org; Sun, 20 Apr 2003 18:30:02 -0400 Original-Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10.13) id 197NJw-0003aD-00 for bug-gnu-emacs@gnu.org; Sun, 20 Apr 2003 18:30:01 -0400 Original-Received: from acm.muc.de ([193.149.49.134] helo=acm.acm) by monty-python.gnu.org with esmtp (Exim 4.10.13) id 197NJv-0001Me-00 for bug-gnu-emacs@gnu.org; Sun, 20 Apr 2003 18:29:59 -0400 Original-Received: from localhost (root@localhost) by acm.acm (8.8.8/8.8.8) with SMTP id WAA00626 for ; Sun, 20 Apr 2003 22:30:04 GMT X-Sender: root@acm.acm Original-To: bug-gnu-emacs@gnu.org X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.1b5 Precedence: list List-Id: Bug reports for GNU Emacs, the Swiss army knife of text editors List-Help: List-Post: List-Subscribe: , List-Archive: List-Unsubscribe: , Errors-To: bug-gnu-emacs-bounces+gnu-bug-gnu-emacs=m.gmane.org@gnu.org Xref: main.gmane.org gmane.emacs.bugs:4846 X-Report-Spam: http://spam.gmane.org/gmane.emacs.bugs:4846 There Is No Alternative: regexp-opt-depth MUST analyse its argument properly. The following rewrite of regexp-opt-depth does just that. [Well, OK, it would be as well for somebody else to check the formulation of regexp-opt-not-groupie*-re. ;-] The patch below passes the following test cases: (regexp-opt-depth "(asdf)") => 0 (regexp-opt-depth "\\(asdf\\)") => 1 (regexp-opt-depth "\\(\\(asdf\\)\\)") => 2 (regexp-opt-depth "\\(?:asdf\\)") => 0 (regexp-opt-depth "[\\(]") => 0 (regexp-opt-depth "[a]\\(]asd\\)") => 1 (regexp-opt-depth "[^a]\\(]asd\\)") => 1 (regexp-opt-depth "[]\\(]asd)") => 0 (regexp-opt-depth "[^]\\(]asd)") => 0 (regexp-opt-depth "\\(? \\)") signals "invalid regexp". ************************************************************************* *** regexp-opt.1.24.el Fri Apr 18 18:34:34 2003 --- regexp-opt.acm.1.24.el Sun Apr 20 22:05:33 2003 *************** *** 110,115 **** --- 110,124 ---- (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 "\\[^?]?[^]]*]") + (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,130 **** (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))) count))) ;;; Workhorse functions. --- 129,141 ---- (string-match regexp "") ;; Count the number of open parentheses in REGEXP. (let ((count 0) start) ! (while ! (progn ! (string-match regexp-opt-not-groupie*-re regexp start) ! (setq start (match-end 0)) ! (< start (1- (length regexp)))) ! (setq count (1+ count) ! start (+ start 2))) ; step START over "\\(" count))) ;;; Workhorse functions. ************************************************************************* -- Alan Mackenzie (Munich, Germany)