Fix my last change.
[gnus] / lisp / base64.el
index 6cf78e0..572a5d3 100644 (file)
 ;;; Boston, MA 02111-1307, USA.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+(eval-when-compile (require 'cl))
+
 ;; For non-MULE
 (if (not (fboundp 'char-int))
-    (fset 'char-int 'identity))
+    (defalias 'char-int 'identity))
 
 (defvar base64-alphabet
   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
@@ -63,7 +65,7 @@ base64-encoder-program.")
     ( ?w . 48) ( ?x . 49) ( ?y . 50) ( ?z . 51) ( ?0 . 52) ( ?1 . 53)
     ( ?2 . 54) ( ?3 . 55) ( ?4 . 56) ( ?5 . 57) ( ?6 . 58) ( ?7 . 59)
     ( ?8 . 60) ( ?9 . 61) ( ?+ . 62) ( ?/ . 63)
-   ))
+    ))
 
 (defvar base64-alphabet-decoding-vector
   (let ((v (make-vector 123 nil))
@@ -73,9 +75,13 @@ base64-encoder-program.")
       (setq p (cdr p)))
     v))
 
+(defvar base64-binary-coding-system 'binary)
+
 (defun base64-run-command-on-region (start end output-buffer command
                                           &rest arg-list)
-  (let ((tempfile nil) status errstring default-process-coding-system)
+  (let ((tempfile nil) status errstring default-process-coding-system 
+       (coding-system-for-write base64-binary-coding-system)
+       (coding-system-for-read base64-binary-coding-system))
     (unwind-protect
        (progn
          (setq tempfile (make-temp-name "base64"))
@@ -94,17 +100,17 @@ base64-encoder-program.")
                     (setq errstring (buffer-string))
                     (kill-buffer nil)
                     (cons status errstring)))))
-      (condition-case ()
-         (delete-file tempfile)
-       (error nil)))))
+      (ignore-errors
+       (delete-file tempfile)))))
 
-(if (string-match "XEmacs" emacs-version)
+(if (featurep 'xemacs)
     (defalias 'base64-insert-char 'insert-char)
   (defun base64-insert-char (char &optional count ignored buffer)
     (if (or (null buffer) (eq buffer (current-buffer)))
        (insert-char char count)
       (with-current-buffer buffer
-       (insert-char char count)))))
+       (insert-char char count))))
+  (setq base64-binary-coding-system 'no-conversion))
 
 (defun base64-decode-region (start end)
   (interactive "r")
@@ -122,9 +128,9 @@ base64-encoder-program.")
          (if base64-decoder-program
              (let* ((binary-process-output t) ; any text already has CRLFs
                     (status (apply 'base64-run-command-on-region
-                                  start end work-buffer
-                                  base64-decoder-program
-                                  base64-decoder-switches)))
+                                   start end work-buffer
+                                   base64-decoder-program
+                                   base64-decoder-switches)))
                (if (not (eq status t))
                    (error "%s" (cdr status))))
            (goto-char start)
@@ -143,18 +149,18 @@ base64-encoder-program.")
                  (cond ((= counter 4)
                         (base64-insert-char (lsh bits -16) 1 nil work-buffer)
                         (base64-insert-char (logand (lsh bits -8) 255) 1 nil
-                                        work-buffer)
+                                            work-buffer)
                         (base64-insert-char (logand bits 255) 1 nil
                                             work-buffer)
                         (setq bits 0 counter 0))
                        (t (setq bits (lsh bits 6)))))))
              (cond
-              ((= (point) end)
-               (if (not (zerop counter))
-                   (error "at least %d bits missing at end of base64 encoding"
-                          (* (- 4 counter) 6)))
-               (setq done t))
-              ((eq (char-after (point)) ?=)
+              ((or (= (point) end)
+                   (eq (char-after (point)) ?=))
+               (if (and (= (point) end) (> counter 1))
+                   (message 
+                    "at least %d bits missing at end of base64 encoding"
+                    (* (- 4 counter) 6)))
                (setq done t)
                (cond ((= counter 1)
                       (error "at least 2 bits missing at end of base64 encoding"))
@@ -241,12 +247,12 @@ base64-encoder-program.")
       (and work-buffer (kill-buffer work-buffer))))
   (message "Encoding base64... done"))
 
-(defun base64-encode (string)
+(defun base64-encode (string &optional no-line-break)
   (save-excursion
     (set-buffer (get-buffer-create " *base64-encode*"))
     (erase-buffer)
     (insert string)
-    (base64-encode-region (point-min) (point-max))
+    (base64-encode-region (point-min) (point-max) no-line-break)
     (skip-chars-backward " \t\r\n")
     (delete-region (point-max) (point))
     (prog1
@@ -266,6 +272,7 @@ base64-encoder-program.")
        (buffer-string)
       (kill-buffer (current-buffer)))))
 
-(fset 'base64-decode-string 'base64-decode)
+(defalias 'base64-decode-string 'base64-decode)
+(defalias 'base64-encode-string 'base64-encode)
 
 (provide 'base64)