# HG changeset patch # User Karl Heuer # Date 934773265 0 # Node ID 0d9fd0e4f7a391933a84b8e343df7ab2a07d9dde # Parent 7c4983be66e4f44b4b85f40268566cb21bb1674d (mail-unquote-printable): Make it autoload. Optimize by calling concat just once. Handle =\n sequence. (mail-unquote-printable-region): New command. (mail-quote-printable): Make it autoload. diff -r 7c4983be66e4 -r 0d9fd0e4f7a3 lisp/mail/mail-utils.el --- a/lisp/mail/mail-utils.el Sun Aug 15 22:29:45 1999 +0000 +++ b/lisp/mail/mail-utils.el Mon Aug 16 03:14:25 1999 +0000 @@ -59,6 +59,7 @@ (concat (substring string 0 start) (substring string end nil)))) +;;;###autoload (defun mail-quote-printable (string &optional wrapper) "Convert a string to the \"quoted printable\" Q encoding. If the optional argument WRAPPER is non-nil, @@ -82,6 +83,7 @@ (+ (- char ?A) 10) (- char ?0))) +;;;###autoload (defun mail-unquote-printable (string &optional wrapper) "Undo the \"quoted printable\" encoding. If the optional argument WRAPPER is non-nil, @@ -90,17 +92,46 @@ (and wrapper (string-match "\\`=\\?ISO-8859-1\\?Q\\?\\([^?]*\\)\\?" string) (setq string (match-string 1 string))) - (let ((i 0) (result "")) - (while (string-match "=\\(..\\)" string i) - (setq result - (concat result (substring string i (match-beginning 0)) - (make-string 1 + (let ((i 0) strings) + (while (string-match "=\\(..\\|\n\\)" string i) + (setq strings (cons (substring string i (match-beginning 0)) strings)) + (unless (= (aref string (match-beginning 1)) ?\n) + (setq strings + (cons (make-string 1 (+ (* 16 (mail-unquote-printable-hexdigit (aref string (match-beginning 1)))) (mail-unquote-printable-hexdigit - (aref string (1+ (match-beginning 1)))))))) + (aref string (1+ (match-beginning 1)))))) + strings))) (setq i (match-end 0))) - (concat result (substring string i))))) + (apply 'concat (nreverse (cons (substring string i) strings)))))) + +;;;###autoload +(defun mail-unquote-printable-region (beg end &optional wrapper) + "Undo the \"quoted printable\" encoding in buffer from BEG to END. +If the optional argument WRAPPER is non-nil, +we expect to find and remove the wrapper characters =?ISO-8859-1?Q?....?=." + (interactive "r\nP") + (save-match-data + (save-excursion + (save-restriction + (narrow-to-region beg end) + (goto-char (point-min)) + (when (and wrapper + (looking-at "\\`=\\?ISO-8859-1\\?Q\\?\\([^?]*\\)\\?")) + (delete-region (match-end 1) end) + (delete-region (point) (match-beginning 1))) + (while (re-search-forward "=\\(..\\|\n\\)" nil t) + (goto-char (match-end 0)) + (replace-match + (if (= (char-after (match-beginning 1)) ?\n) + "" + (make-string 1 + (+ (* 16 (mail-unquote-printable-hexdigit + (char-after (match-beginning 1)))) + (mail-unquote-printable-hexdigit + (char-after (1+ (match-beginning 1))))))) + t t)))))) (defun mail-strip-quoted-names (address) "Delete comments and quoted strings in an address list ADDRESS.