From 7dad528a116991316f2e72720c435e4be23dea1a Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Sat, 1 Jul 1995 00:33:52 +0000 Subject: [PATCH] (sendmail-send-it): If mail-from-style is parens, don't escape all parentheses; escape only the nonmatching ones. --- lisp/mail/sendmail.el | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/lisp/mail/sendmail.el b/lisp/mail/sendmail.el index f30581cbb2a..f54b52cb4b5 100644 --- a/lisp/mail/sendmail.el +++ b/lisp/mail/sendmail.el @@ -537,12 +537,24 @@ the user from the mailer." (insert "\"")))) (insert " <" login ">\n")) ((eq mail-from-style 'parens) - (insert "From: " login " (" fullname) - (let ((fullname-end (point-marker))) - (backward-char (length fullname)) - ;; RFC 822 says ()\ must be escaped in comments. - (while (re-search-forward "[()\\]" fullname-end 1) - (replace-match "\\\\\\&" t))) + (insert "From: " login " (") + (let ((fullname-start (point))) + (insert fullname) + (let ((fullname-end (point-marker))) + (goto-char fullname-start) + ;; RFC 822 says \ and nonmatching parentheses + ;; must be escaped in comments. + ;; Escape every instance of ()\ ... + (while (re-search-forward "[()\\]" fullname-end 1) + (replace-match "\\\\\\&" t)) + ;; ... then undo escaping of matching parentheses, + ;; including matching nested parentheses. + (goto-char fullname-start) + (while (re-search-forward + "\\(\\=\\|[^\\]\\(\\\\\\\\\\)*\\)\\\\(\\(\\([^\\]\\|\\\\\\\\\\)*\\)\\\\)" + fullname-end 1) + (replace-match "\\1(\\3)" t) + (goto-char fullname-start)))) (insert ")\n")) ((null mail-from-style) (insert "From: " login "\n"))))) -- 2.39.2