# HG changeset patch # User Stefan Monnier # Date 1294955314 18000 # Node ID 966cc18ff8051b5932ef36a54c800ed101e21c49 # Parent 7e39a17684f8f204f404e5904657675287d50b87 * lisp/mail/mail-utils.el (mail-strip-quoted-names): Make the regexp code work for nested comments. diff -r 7e39a17684f8 -r 966cc18ff805 lisp/ChangeLog --- a/lisp/ChangeLog Thu Jan 13 15:53:06 2011 -0500 +++ b/lisp/ChangeLog Thu Jan 13 16:48:34 2011 -0500 @@ -1,5 +1,8 @@ 2011-01-13 Stefan Monnier + * mail/mail-utils.el (mail-strip-quoted-names): Make the regexp code + work for nested comments. + * progmodes/prolog.el: Use syntax-propertize. Further code cleanup. (prolog-use-prolog-tokenizer-flag): Change default when syntax-propertize can be used. diff -r 7e39a17684f8 -r 966cc18ff805 lisp/mail/mail-utils.el --- a/lisp/mail/mail-utils.el Thu Jan 13 15:53:06 2011 -0500 +++ b/lisp/mail/mail-utils.el Thu Jan 13 16:48:34 2011 -0500 @@ -182,56 +182,37 @@ (mapconcat 'identity (rfc822-addresses address) ", ")) (let (pos) - ;; Detect nested comments. - (if (string-match "[ \t]*(\\([^)\\]\\|\\\\.\\|\\\\\n\\)*(" address) - ;; Strip nested comments. - (with-temp-buffer - (insert address) - (set-syntax-table lisp-mode-syntax-table) - (goto-char 1) - (while (search-forward "(" nil t) - (forward-char -1) - (skip-chars-backward " \t") - (delete-region (point) - (save-excursion - (condition-case () - (forward-sexp 1) - (error (goto-char (point-max)))) - (point)))) - (setq address (buffer-string))) - ;; Strip non-nested comments an easier way. - (while (setq pos (string-match - ;; This doesn't hack rfc822 nested comments - ;; `(xyzzy (foo) whinge)' properly. Big deal. - "[ \t]*(\\([^)\\]\\|\\\\.\\|\\\\\n\\)*)" - address)) - (setq address (replace-match "" nil nil address 0)))) + ;; Strip comments. + (while (setq pos (string-match + "[ \t]*(\\([^()\\]\\|\\\\.\\|\\\\\n\\)*)" + address)) + (setq address (replace-match "" nil nil address 0))) - ;; strip surrounding whitespace - (string-match "\\`[ \t\n]*" address) - (setq address (substring address - (match-end 0) - (string-match "[ \t\n]*\\'" address - (match-end 0)))) + ;; strip surrounding whitespace + (string-match "\\`[ \t\n]*" address) + (setq address (substring address + (match-end 0) + (string-match "[ \t\n]*\\'" address + (match-end 0)))) - ;; strip `quoted' names (This is supposed to hack `"Foo Bar" ') - (setq pos 0) - (while (setq pos (string-match + ;; strip `quoted' names (This is supposed to hack `"Foo Bar" ') + (setq pos 0) + (while (setq pos (string-match "\\([ \t]?\\)\\([ \t]*\"\\([^\"\\]\\|\\\\.\\|\\\\\n\\)*\"[ \t\n]*\\)" address pos)) - ;; If the next thing is "@", we have "foo bar"@host. Leave it. - (if (and (> (length address) (match-end 0)) - (= (aref address (match-end 0)) ?@)) - (setq pos (match-end 0)) - ;; Otherwise discard the "..." part. - (setq address (replace-match "" nil nil address 2)))) - ;; If this address contains <...>, replace it with just - ;; the part between the <...>. - (while (setq pos (string-match "\\(,\\s-*\\|\\`\\)\\([^,]*<\\([^>,:]*\\)>[^,]*\\)\\(\\s-*,\\|\\'\\)" - address)) - (setq address (replace-match (match-string 3 address) - nil 'literal address 2))) - address)))) + ;; If the next thing is "@", we have "foo bar"@host. Leave it. + (if (and (> (length address) (match-end 0)) + (= (aref address (match-end 0)) ?@)) + (setq pos (match-end 0)) + ;; Otherwise discard the "..." part. + (setq address (replace-match "" nil nil address 2)))) + ;; If this address contains <...>, replace it with just + ;; the part between the <...>. + (while (setq pos (string-match "\\(,\\s-*\\|\\`\\)\\([^,]*<\\([^>,:]*\\)>[^,]*\\)\\(\\s-*,\\|\\'\\)" + address)) + (setq address (replace-match (match-string 3 address) + nil 'literal address 2))) + address)))) ;; The following piece of ugliness is legacy code. The name was an ;; unfortunate choice --- a flagrant violation of the Emacs Lisp