changeset 47951:9cd6016af581

Revert decoding changes temporarily.
author Dave Love <fx@gnu.org>
date Fri, 18 Oct 2002 14:15:44 +0000
parents 6b2496e2e77b
children cfa90c933b82
files lisp/gnus/rfc2047.el
diffstat 1 files changed, 58 insertions(+), 60 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/gnus/rfc2047.el	Fri Oct 18 11:05:28 2002 +0000
+++ b/lisp/gnus/rfc2047.el	Fri Oct 18 14:15:44 2002 +0000
@@ -473,51 +473,51 @@
 	    (goto-char (min (point-max) (+ 56 bol)))
 	    (search-backward "=" (- (point) 2) t)
 	    (unless (or (bobp) (eobp))
-	      (insert ?\n)
+	      (insert "\n")
 	      (setq bol (point)))))))))
 
 ;;;
 ;;; Functions for decoding RFC2047 messages
 ;;;
 
-(eval-and-compile
-  (defvar rfc2047-encoded-word-regexp
-    "=\\?\\([^][\000-\040()<>@,\;:\\\"/?.=]+\\)\\?\\(B\\|Q\\)\\?\
-\\([!->@-~ +]+\\)\\?="))
+(defvar rfc2047-encoded-word-regexp
+  "=\\?\\([^][\000-\040()<>@,\;:\\\"/?.=]+\\)\\?\\(B\\|Q\\)\\?\\([!->@-~ +]+\\)\\?=")
 
 (defun rfc2047-decode-region (start end)
   "Decode MIME-encoded words in region between START and END."
   (interactive "r")
   (let ((case-fold-search t)
-	(undoing (not (eq t buffer-undo-list)))
 	b e)
-    (unwind-protect
-	(save-excursion
-	  (save-restriction
-	    (buffer-enable-undo)
-	    (narrow-to-region start end)
-	    (goto-char (point-min))
-	    ;; Remove whitespace between encoded words.
-	    (while (re-search-forward
-		    (eval-when-compile
-		      (concat "\\(" rfc2047-encoded-word-regexp "\\)"
-			      "\\(\n?[ \t]\\)+"
-			      "\\(" rfc2047-encoded-word-regexp "\\)"))
-		    nil t)
-	      (delete-region (goto-char (match-end 1)) (match-beginning 6)))
-	    ;; Decode the encoded words.
-	    (setq b (goto-char (point-min)))
-	    (while (re-search-forward rfc2047-encoded-word-regexp nil t)
-	      (setq e (match-beginning 0))
-	      (rfc2047-parse-and-decode (match-beginning 0) (match-end 0)))
-	    (when (and (mm-multibyte-p)
-		       mail-parse-charset
-		       (not (eq mail-parse-charset 'us-ascii))
-		       (not (eq mail-parse-charset 'gnus-decoded)))
-	      (mm-decode-coding-region b (point-max) mail-parse-charset))
-	    (rfc2047-unfold-region (point-min) (point-max))))
-      (unless undoing
-	(buffer-disable-undo)))))
+    (save-excursion
+      (save-restriction
+	(narrow-to-region start end)
+	(goto-char (point-min))
+	;; Remove whitespace between encoded words.
+	(while (re-search-forward
+		(concat "\\(" rfc2047-encoded-word-regexp "\\)"
+			"\\(\n?[ \t]\\)+"
+			"\\(" rfc2047-encoded-word-regexp "\\)")
+		nil t)
+	  (delete-region (goto-char (match-end 1)) (match-beginning 6)))
+	;; Decode the encoded words.
+	(setq b (goto-char (point-min)))
+	(while (re-search-forward rfc2047-encoded-word-regexp nil t)
+	  (setq e (match-beginning 0))
+	  (insert (rfc2047-parse-and-decode
+		   (prog1
+		       (match-string 0)
+		     (delete-region (match-beginning 0) (match-end 0)))))
+	  (when (and (mm-multibyte-p)
+		     mail-parse-charset
+		     (not (eq mail-parse-charset 'gnus-decoded)))
+	    (mm-decode-coding-region b e mail-parse-charset))
+	  (setq b (point)))
+	(when (and (mm-multibyte-p)
+		   mail-parse-charset
+		   (not (eq mail-parse-charset 'us-ascii))
+		   (not (eq mail-parse-charset 'gnus-decoded)))
+	  (mm-decode-coding-region b (point-max) mail-parse-charset))
+	(rfc2047-unfold-region (point-min) (point-max))))))
 
 (defun rfc2047-decode-string (string)
   "Decode the quoted-printable-encoded STRING and return the results."
@@ -530,26 +530,22 @@
 	(rfc2047-decode-region (point-min) (point-max)))
       (buffer-string))))
 
-(defun rfc2047-parse-and-decode (b e)
+(defun rfc2047-parse-and-decode (word)
   "Decode WORD and return it if it is an encoded word.
 Return WORD if not."
-  (save-restriction
-    (narrow-to-region b e)
-    (goto-char b)
-    (when (looking-at (eval-when-compile
-			(concat "\\`" rfc2047-encoded-word-regexp "\\'")))
-      (condition-case nil
-	  (let ((charset (match-string 1))
-		(encoding (upcase (match-string 2))))
-	    (undo-boundary)
-	    (delete-region (match-beginning 0) (1+ (match-end 2)))
-	    (delete-region (- (point-max) 2) (point-max))
-	    (rfc2047-decode charset encoding (point-min) (point-max)))
-	;; If we get an error, undo the change
-	(error (undo))))))
+  (if (not (string-match rfc2047-encoded-word-regexp word))
+      word
+    (or
+     (condition-case nil
+	 (rfc2047-decode
+	  (match-string 1 word)
+	  (upcase (match-string 2 word))
+	  (match-string 3 word))
+       (error word))
+     word)))
 
-(defun rfc2047-decode (charset encoding b e)
-  "Decode from the given MIME CHARSET in the given ENCODING in region B to E.
+(defun rfc2047-decode (charset encoding string)
+  "Decode STRING from the given MIME CHARSET in the given ENCODING.
 Valid ENCODINGs are \"B\" and \"Q\".
 If your Emacs implementation can't decode CHARSET, return nil."
   (if (stringp charset)
@@ -568,16 +564,18 @@
       (when (and (eq cs 'ascii)
 		 mail-parse-charset)
 	(setq cs mail-parse-charset))
-      (save-restriction
-	(narrow-to-region b e)
-	(cond
-	 ((equal "B" encoding)
-	  (base64-decode-region b e))
-	 ((equal "Q" encoding)
-	  (subst-char-in-region b e ?_ ?  t)
-	  (quoted-printable-decode-region b e))
-	 (t (error "Invalid encoding: %s" encoding)))
-	(mm-decode-coding-region (point-min) (point-max) cs)))))
+      ;; Ensure unibyte result in Emacs 20.
+      (let (default-enable-multibyte-characters)
+	(with-temp-buffer
+	  (mm-decode-coding-string
+	   (cond
+	    ((equal "B" encoding)
+	     (base64-decode-string string))
+	    ((equal "Q" encoding)
+	     (quoted-printable-decode-string
+	      (mm-replace-chars-in-string string ?_ ? )))
+	    (t (error "Invalid encoding: %s" encoding)))
+	   cs))))))
 
 (provide 'rfc2047)