-;;; qp.el --- Quoted-printable functions
-;; Copyright (C) 1998 Free Software Foundation, Inc.
+;;; qp.el --- Quoted-Printable functions
+;; Copyright (C) 1998,99 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; This file is part of GNU Emacs.
;;; Code:
(defvar quoted-printable-encoding-characters
- (mapcar 'identity "0123456789ABCDEF"))
+ (mapcar 'identity "0123456789ABCDEFabcdef"))
(defun quoted-printable-decode-region (from to)
"Decode quoted-printable in the region between FROM and TO."
(save-excursion
(goto-char from)
(while (search-forward "=" to t)
- (cond ((eq (following-char) ?\n)
- (delete-char -1)
- (delete-char 1))
- ((and
- (memq (following-char) quoted-printable-encoding-characters)
- (memq (char-after (1+ (point)))
- quoted-printable-encoding-characters))
- (subst-char-in-region
- (1- (point)) (point) ?=
- (string-to-number
- (buffer-substring (point) (+ 2 (point)))
- 16))
- (delete-char 2))
- ((looking-at "=")
- (delete-char 1))
- ((message "Malformed MIME quoted-printable message"))))))
+ (cond
+ ;; End of the line.
+ ((eq (char-after) ?\n)
+ (delete-char -1)
+ (delete-char 1))
+ ;; Encoded character.
+ ((and
+ (memq (char-after) quoted-printable-encoding-characters)
+ (memq (char-after (1+ (point)))
+ quoted-printable-encoding-characters))
+ (subst-char-in-region
+ (1- (point)) (point) ?=
+ (string-to-number
+ (buffer-substring (point) (+ 2 (point)))
+ 16))
+ (delete-char 2))
+ ;; Quoted equal sign.
+ ((eq (char-after) ?=)
+ (delete-char 1))
+ ;; End of buffer.
+ ((eobp)
+ (delete-char -1))
+ ;; Invalid.
+ (t
+ (message "Malformed MIME quoted-printable message"))))))
(defun quoted-printable-decode-string (string)
"Decode the quoted-printable-encoded STRING and return the results."
(save-excursion
(save-restriction
(narrow-to-region from to)
+;; (mm-encode-body)
+ ;; Encode all the non-ascii and control characters.
(goto-char (point-min))
(while (and (skip-chars-forward
(or class "^\000-\007\013\015-\037\200-\377="))
(not (eobp)))
(insert
(prog1
- (upcase (format "=%x" (char-after (point))))
+ (upcase (format "=%02x" (char-after)))
(delete-char 1))))
+ ;; Encode white space at the end of lines.
+ (goto-char (point-min))
+ (while (re-search-forward "[ \t]+$" nil t)
+ (goto-char (match-beginning 0))
+ (while (not (eolp))
+ (insert
+ (prog1
+ (upcase (format "=%02x" (char-after)))
+ (delete-char 1)))))
(when fold
;; Fold long lines.
(goto-char (point-min))
- (end-of-line)
- (while (> (current-column) 72)
- (beginning-of-line)
- (forward-char 72)
- (search-backward "=" (- (point) 2) t)
- (insert "=\n")
- (end-of-line))))))
+ (while (not (eobp))
+ (end-of-line)
+ (while (> (current-column) 72)
+ (beginning-of-line)
+ (forward-char 71) ;; 71 char plus an "="
+ (search-backward "=" (- (point) 2) t)
+ (insert "=\n")
+ (end-of-line))
+ (unless (eobp)
+ (forward-line)))))))
(defun quoted-printable-encode-string (string)
"QP-encode STRING and return the results."
- (with-temp-buffer
+ (mm-with-unibyte-buffer
(insert string)
(quoted-printable-encode-region (point-min) (point-max))
(buffer-string)))