changeset 20399:04ce86b23ffa

(rmail-decode-quoted-printable): New function mostly copied from gnus-art.el. (rmail-hex-string-to-integer): New fn, copied from hexl.el. (rmail-hex-char-to-integer): Likewise. (rmail-convert-to-babyl-format): Use rmail-decode-quoted-printable.
author Karl Heuer <kwzh@gnu.org>
date Thu, 04 Dec 1997 04:32:03 +0000
parents 47f326ffb7ba
children fd74979309d3
files lisp/mail/rmail.el
diffstat 1 files changed, 41 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/mail/rmail.el	Thu Dec 04 04:30:59 1997 +0000
+++ b/lisp/mail/rmail.el	Thu Dec 04 04:32:03 1997 +0000
@@ -1478,10 +1478,7 @@
 		 (setq count (1+ count))
 		 (if quoted-printable-header-field-end
 		     (save-excursion
-		       (save-restriction
-			 (narrow-to-region header-end (point))
-			 (require 'gnus-art)
-			 (article-mime-decode-quoted-printable-buffer))
+		       (rmail-decode-quoted-printable header-end (point))
 		       ;; Change "quoted-printable" to "8bit",
 		       ;; to reflect the decoding we just did.
 		       (goto-char quoted-printable-header-field-end)
@@ -1508,6 +1505,46 @@
 	      (t (error "Cannot convert to babyl format")))))
     count))
 
+(defun rmail-hex-char-to-integer (character)
+  "Return CHARACTER's value interpreted as a hex digit."
+  (if (and (>= character ?0) (<= character ?9))
+      (- character ?0)
+    (let ((ch (logior character 32)))
+      (if (and (>= ch ?a) (<= ch ?f))
+	  (- ch (- ?a 10))
+	(error "Invalid hex digit `%c'" ch)))))
+
+(defun rmail-hex-string-to-integer (hex-string)
+  "Return decimal integer for HEX-STRING."
+  (let ((hex-num 0)
+	(index 0))
+    (while (< index (length hex-string))
+      (setq hex-num (+ (* hex-num 16)
+		       (rmail-hex-char-to-integer (aref hex-string index))))
+      (setq index (1+ index)))
+    hex-num))
+
+(defun rmail-decode-quoted-printable (from to)
+  "Decode Quoted-Printable in the region between FROM and TO."
+  (interactive "r")
+  (goto-char from)
+  (or (markerp to)
+      (setq to (copy-marker to)))
+  (while (search-forward "=" to t)
+    (cond ((eq (following-char) ?\n)
+	   (delete-char -1)
+	   (delete-char 1))
+	  ((looking-at "[0-9A-F][0-9A-F]")
+	   (subst-char-in-region
+	    (1- (point)) (point) ?=
+	    (rmail-hex-string-to-integer
+	     (buffer-substring (point) (+ 2 (point)))))
+	   (delete-char 2))
+	  ((looking-at "=")
+	   (delete-char 1))
+	  (t
+	   (message "Malformed MIME quoted-printable message")))))
+
 ;; Delete the "From ..." line, creating various other headers with
 ;; information from it if they don't already exist.  Now puts the
 ;; original line into a mail-from: header line for debugging and for