From 67977ae5974e54d34034aa7990cf22dd162c179b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mattias=20Engdeg=C3=A5rd?= Date: Thu, 5 Oct 2023 14:06:24 +0200 Subject: [PATCH] Eliminate some nested repetitions in regexps Nested repetitions such as (A*)* potentially take exponential time but can usually be rewritten in a faster and more readable way without much trouble. These were all found by Relint. * lisp/obsolete/terminal.el (te-parse-program-and-args): * lisp/org/org.el (org-make-tags-matcher): Apply the transform (A+B*)+ -> A(A|B)* * lisp/textmodes/fill.el (adaptive-fill-regexp): Apply the transform A*(B+A*)* -> (A|B)* * lisp/progmodes/idlw-shell.el (idlwave-shell-filter): Find the last newline or CR in a more direct way. * lisp/progmodes/vhdl-mode.el (vhdl-port-copy, vhdl-subprog-copy): Trim trailing whitespace from a string in a more direct way. All-whitespace strings are left unchanged as before. --- lisp/obsolete/terminal.el | 2 +- lisp/org/org.el | 2 +- lisp/progmodes/idlw-shell.el | 4 +--- lisp/progmodes/vhdl-mode.el | 17 +++++++++-------- lisp/textmodes/fill.el | 2 +- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/lisp/obsolete/terminal.el b/lisp/obsolete/terminal.el index 4e23fc3c710..31c1ebead14 100644 --- a/lisp/obsolete/terminal.el +++ b/lisp/obsolete/terminal.el @@ -1154,7 +1154,7 @@ subprocess started." (defun te-parse-program-and-args (s) - (cond ((string-match "\\`\\([-a-zA-Z0-9+=_.@/:]+[ \t]*\\)+\\'" s) + (cond ((string-match "\\`[-a-zA-Z0-9+=_.@/:][-a-zA-Z0-9+=_.@/: \t]*\\'" s) (let ((l ()) (p 0)) (while p (setq l (cons (if (string-match diff --git a/lisp/org/org.el b/lisp/org/org.el index 8b02721a859..49f62d0f43b 100644 --- a/lisp/org/org.el +++ b/lisp/org/org.el @@ -11346,7 +11346,7 @@ See also `org-scan-tags'." (let ((match0 match) (re (concat "^&?\\([-+:]\\)?\\({[^}]+}\\|LEVEL\\([<=>]\\{1,2\\}\\)" - "\\([0-9]+\\)\\|\\(\\(?:[[:alnum:]_]+\\(?:\\\\-\\)*\\)+\\)" + "\\([0-9]+\\)\\|\\([[:alnum:]_]\\(?:[[:alnum:]_]\\|\\\\-\\)*\\)" "\\([<>=]\\{1,2\\}\\)" "\\({[^}]+}\\|\"[^\"]*\"\\|-?[.0-9]+\\(?:[eE][-+]?[0-9]+\\)?\\)" "\\|" org-tag-re "\\)")) diff --git a/lisp/progmodes/idlw-shell.el b/lisp/progmodes/idlw-shell.el index e50e1226b43..37c501ae4e2 100644 --- a/lisp/progmodes/idlw-shell.el +++ b/lisp/progmodes/idlw-shell.el @@ -1454,9 +1454,7 @@ and then calls `idlwave-shell-send-command' for any pending commands." (concat idlwave-shell-accumulation string))) (setq idlwave-shell-accumulation (substring string - (progn (string-match "\\(.*[\n\r]+\\)*" - string) - (match-end 0))))) + (string-match "[^\n\r]*\\'" string)))) (setq idlwave-shell-accumulation (concat idlwave-shell-accumulation string))) diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el index 8d0a10c0918..b55fae3374a 100644 --- a/lisp/progmodes/vhdl-mode.el +++ b/lisp/progmodes/vhdl-mode.el @@ -11769,8 +11769,8 @@ reflected in a subsequent paste operation." (setq comment (substring type (match-beginning 2))) (setq type (substring type 0 (match-beginning 1)))) ;; strip of trailing group-comment - (string-match "\\(\\(\\s-*\\S-+\\)+\\)\\s-*" type) - (setq type (substring type 0 (match-end 1))) + (when (string-match "\\S-\\s-*\\'" type) + (setq type (substring type 0 (1+ (match-beginning 0))))) ;; parse initialization expression (setq init nil) (when (vhdl-parse-string ":=[ \t\n\r\f]*" t) @@ -11844,8 +11844,8 @@ reflected in a subsequent paste operation." (setq comment (substring type (match-beginning 2))) (setq type (substring type 0 (match-beginning 1)))) ;; strip of trailing group-comment - (string-match "\\(\\(\\s-*\\S-+\\)+\\)\\s-*" type) - (setq type (substring type 0 (match-end 1))) + (when (string-match "\\S-\\s-*\\'" type) + (setq type (substring type 0 (1+ (match-beginning 0))))) (vhdl-forward-syntactic-ws) (setq end-of-list (vhdl-parse-string ")" t)) (vhdl-parse-string "\\s-*;\\s-*") @@ -12580,8 +12580,8 @@ reflected in a subsequent paste operation." (setq comment (substring type (match-beginning 2))) (setq type (substring type 0 (match-beginning 1)))) ;; strip off trailing group-comment - (string-match "\\(\\(\\s-*\\S-+\\)+\\)\\s-*" type) - (setq type (substring type 0 (match-end 1))) + (when (string-match "\\S-\\s-*\\'" type) + (setq type (substring type 0 (1+ (match-beginning 0))))) ;; parse initialization expression (setq init nil) (when (vhdl-parse-string ":=[ \t\n\r\f]*" t) @@ -12621,8 +12621,9 @@ reflected in a subsequent paste operation." (setq return-comment (substring return-type (match-beginning 2))) (setq return-type (substring return-type 0 (match-beginning 1)))) ;; strip of trailing group-comment - (string-match "\\(\\(\\s-*\\S-+\\)+\\)\\s-*" return-type) - (setq return-type (substring return-type 0 (match-end 1))) + (when (string-match "\\S-\\s-*\\'" return-type) + (setq return-type + (substring return-type 0 (1+ (match-beginning 0))))) ;; parse return comment (unless return-comment (setq return-comment (and (vhdl-parse-string "--\\s-*\\([^\n]*\\)" t) diff --git a/lisp/textmodes/fill.el b/lisp/textmodes/fill.el index 2fde2ff6c4d..4d6c73bfdd6 100644 --- a/lisp/textmodes/fill.el +++ b/lisp/textmodes/fill.el @@ -103,7 +103,7 @@ reinserts the fill prefix in each resulting line." ;; Added `%' for TeX comments. ;; RMS: deleted the code to match `1.' and `(1)'. ;; Update mail-mode's paragraph-separate if you change this. - (purecopy "[ \t]*\\([-–!|#%;>*·•‣⁃◦]+[ \t]*\\)*") + (purecopy "[-–!|#%;>*·•‣⁃◦ \t]*") "Regexp to match text at start of line that constitutes indentation. If Adaptive Fill mode is enabled, a prefix matching this pattern on the first and second lines of a paragraph is used as the -- 2.39.2