Patch by Ed L. Cashin to make gnus-move-split-methods move to
[gnus] / lisp / base64.el
index c874b22..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,25 +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)))))
 
-(defun base64-insert-char (char &optional count ignored buffer)
-  (condition-case nil
-      (progn
-       (insert-char char count ignored buffer)
-       (fset 'base64-insert-char 'insert-char))
-    (wrong-number-of-arguments
-     (fset 'base64-insert-char 'base64-xemacs-insert-char)
-     (base64-insert-char char count ignored buffer))))
-
-(defun base64-xemacs-insert-char (char &optional count ignored buffer)
-  (if (or (null buffer) (eq buffer (current-buffer)))
-      (insert-char char count)
-    (save-excursion
-      (set-buffer buffer)
-      (insert-char char count))))
+(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))))
+  (setq base64-binary-coding-system 'no-conversion))
 
 (defun base64-decode-region (start end)
   (interactive "r")
@@ -130,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,7 +141,7 @@ base64-encoder-program.")
               ((> (skip-chars-forward base64-alphabet end) 0)
                (setq lim (point))
                (while (< inputpos lim)
-                 (setq bits (+ bits 
+                 (setq bits (+ bits
                                (aref base64-alphabet-decoding-vector
                                      (char-int (char-after inputpos)))))
                  (setq counter (1+ counter)
@@ -151,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))
-              ((= (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"))
@@ -249,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
@@ -272,8 +270,9 @@ base64-encoder-program.")
     (delete-region (point-max) (point))
     (prog1
        (buffer-string)
-      (kill-buffer (current-buffer)))))  
+      (kill-buffer (current-buffer)))))
 
-(fset 'base64-decode-string 'base64-decode)
+(defalias 'base64-decode-string 'base64-decode)
+(defalias 'base64-encode-string 'base64-encode)
 
 (provide 'base64)