* encrypt.el (encrypt-xor-process-buffer): Replace `string-to-int'
[gnus] / lisp / qp.el
index 3470a9b..a4a9a4a 100644 (file)
@@ -1,6 +1,7 @@
 ;;; qp.el --- Quoted-Printable functions
 
-;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005
+;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: mail, extensions
 (require 'mm-util)
 (eval-when-compile (defvar mm-use-ultra-safe-encoding))
 
+;;;###autoload
 (defun quoted-printable-decode-region (from to &optional coding-system)
   "Decode quoted-printable in the region between FROM and TO, per RFC 2045.
 If CODING-SYSTEM is non-nil, decode bytes into characters with that
-coding-system."
-  (interactive "r")
+coding-system.
+
+Interactively, you can supply the CODING-SYSTEM argument
+with \\[universal-coding-system-argument].
+
+The CODING-SYSTEM argument is a historical hangover and is deprecated.
+QP encodes raw bytes and should be decoded into raw bytes.  Decoding
+them into characters should be done separately."
+  (interactive
+   ;; Let the user determine the coding system with "C-x RET c".
+   (list (region-beginning) (region-end) coding-system-for-read))
   (unless (mm-coding-system-p coding-system) ; e.g. `ascii' from Gnus
     (setq coding-system nil))
   (save-excursion
@@ -53,28 +64,28 @@ coding-system."
        (if coding-system
            (mm-encode-coding-region (point-min) (point-max) coding-system))
        (goto-char (point-min))
-       (while (and (skip-chars-forward "^=" to)
+       (while (and (skip-chars-forward "^=")
                    (not (eobp)))
          (cond ((eq (char-after (1+ (point))) ?\n)
                 (delete-char 2))
                ((looking-at "=[0-9A-F][0-9A-F]")
-                (let ((byte (string-to-int (buffer-substring (1+ (point))
+                (let ((byte (string-to-number (buffer-substring (1+ (point))
                                                              (+ 3 (point)))
                                            16)))
-                  (insert byte)
-                  (delete-char 3)
-                  (unless (eq byte ?=)
-                    (backward-char))))
+                  (mm-insert-byte byte 1)
+                  (delete-char 3)))
                (t
-                (error "Malformed quoted-printable text")
+                (message "Malformed quoted-printable text")
                 (forward-char)))))
       (if coding-system
          (mm-decode-coding-region (point-min) (point-max) coding-system)))))
 
 (defun quoted-printable-decode-string (string &optional coding-system)
   "Decode the quoted-printable encoded STRING and return the result.
-If CODING-SYSTEM is non-nil, decode the region with coding-system."
-  (with-temp-buffer
+If CODING-SYSTEM is non-nil, decode the region with coding-system.
+Use of CODING-SYSTEM is deprecated; this function should deal with
+raw bytes, and coding conversion should be done separately."
+  (mm-with-unibyte-buffer
     (insert string)
     (quoted-printable-decode-region (point-min) (point-max) coding-system)
     (buffer-string)))
@@ -83,8 +94,9 @@ If CODING-SYSTEM is non-nil, decode the region with coding-system."
   "Quoted-printable encode the region between FROM and TO per RFC 2045.
 
 If FOLD, fold long lines at 76 characters (as required by the RFC).
-If CLASS is non-nil, translate the characters matched by that class in
-the form expected by `skip-chars-forward'.
+If CLASS is non-nil, translate the characters not matched by that
+regexp class, which is in the form expected by `skip-chars-forward'.
+You should probably avoid non-ASCII characters in this arg.
 
 If `mm-use-ultra-safe-encoding' is set, fold lines unconditionally and
 encode lines starting with \"From\"."
@@ -93,70 +105,64 @@ encode lines starting with \"From\"."
     ;; Avoid using 8bit characters. = is \075.
     ;; Equivalent to "^\000-\007\013\015-\037\200-\377="
     (setq class "\010-\012\014\040-\074\076-\177"))
-  (if (fboundp 'string-as-multibyte)
-      (setq class (string-as-multibyte class)))
   (save-excursion
+    (goto-char from)
+    (if (re-search-forward (mm-string-to-multibyte "[^\x0-\x7f\x80-\xff]")
+                          to t)
+       (error "Multibyte character in QP encoding region"))
     (save-restriction
       (narrow-to-region from to)
-      (mm-with-unibyte-current-buffer-mule4
-       (if (and (not (featurep 'xemacs)) ;; Don't check XEmacs Mule.
-                (fboundp 'find-charset-region))
-           (if (delq 'unknown          ; Emacs 20 unibyte
-                     (delq 'eight-bit-graphic ; Emacs 21
-                           (delq 'eight-bit-control
-                                 (delq 'ascii 
-                                       (find-charset-region from to)))))
-               (error "Multibyte character in QP encoding region")))
-       ;; Encode all the non-ascii and control characters.
-       (goto-char (point-min))
-       (while (and (skip-chars-forward class)
-                   (not (eobp)))
+      ;; Encode all the non-ascii and control characters.
+      (goto-char (point-min))
+      (while (and (skip-chars-forward class)
+                 (not (eobp)))
+       (insert
+        (prog1
+            ;; To unibyte in case of Emacs 22 eight-bit.
+            (format "=%02X" (mm-multibyte-char-to-unibyte (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
               (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
-                (format "=%02X" (char-after))
-              (delete-char 1)))))
-       (let ((mm-use-ultra-safe-encoding
-              (and (boundp 'mm-use-ultra-safe-encoding)
-                   mm-use-ultra-safe-encoding)))
-         (when (or fold mm-use-ultra-safe-encoding)
-           ;; Fold long lines.
-           (let ((tab-width 1))                ; HTAB is one character.
-             (goto-char (point-min))
-             (while (not (eobp))
-               ;; In ultra-safe mode, encode "From " at the beginning
-               ;; of a line.
-               (when mm-use-ultra-safe-encoding
-                 (beginning-of-line)
-                 (if (looking-at "From ")
-                     (replace-match "From=20" nil t)
-                   (if (looking-at "-")
-                       (replace-match "=2D" nil t))))
-               (end-of-line)
+            (delete-char 1)))))
+      (let ((mm-use-ultra-safe-encoding
+            (and (boundp 'mm-use-ultra-safe-encoding)
+                 mm-use-ultra-safe-encoding)))
+       (when (or fold mm-use-ultra-safe-encoding)
+         (let ((tab-width 1))          ; HTAB is one character.
+           (goto-char (point-min))
+           (while (not (eobp))
+             ;; In ultra-safe mode, encode "From " at the beginning
+             ;; of a line.
+             (when mm-use-ultra-safe-encoding
+               (if (looking-at "From ")
+                   (replace-match "From=20" nil t)
+                 (if (looking-at "-")
+                     (replace-match "=2D" nil t))))
+             (end-of-line)
+             ;; Fold long lines.
              (while (> (current-column) 76) ; tab-width must be 1.
                (beginning-of-line)
                (forward-char 75)       ; 75 chars plus an "="
                (search-backward "=" (- (point) 2) t)
                (insert "=\n")
                (end-of-line))
-             (unless (eobp)
-               (forward-line))))))))))
+             (forward-line))))))))
 
 (defun quoted-printable-encode-string (string)
   "Encode the STRING as quoted-printable and return the result."
-  (with-temp-buffer
-    (insert string)
-    (quoted-printable-encode-region (point-min) (point-max))
-    (buffer-string)))
+  (let ((default-enable-multibyte-characters (mm-multibyte-string-p string)))
+    (with-temp-buffer
+      (insert string)
+      (quoted-printable-encode-region (point-min) (point-max))
+      (buffer-string))))
 
 (provide 'qp)
 
+;;; arch-tag: db89e52a-e4a1-4b69-926f-f434f04216ba
 ;;; qp.el ends here