2001-12-13 20:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
authorShengHuo ZHU <zsh@cs.rochester.edu>
Fri, 14 Dec 2001 02:07:01 +0000 (02:07 +0000)
committerShengHuo ZHU <zsh@cs.rochester.edu>
Fri, 14 Dec 2001 02:07:01 +0000 (02:07 +0000)
* uudecode.el (uudecode-use-external): New.
(uudecode-decode-region): Automatically detect external program.

* binhex.el (binhex-use-external): New.
(binhex-decode-region-internal): New.
(binhex-decode-region): Automatically detect external program.

* mm-uu.el (mm-uu-decode-function):
(mm-uu-binhex-decode-function): Use them.

lisp/ChangeLog
lisp/binhex.el
lisp/mm-uu.el
lisp/uudecode.el

index fa537f9..49b0884 100644 (file)
@@ -1,3 +1,15 @@
+2001-12-13 20:00:00  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * uudecode.el (uudecode-use-external): New.
+       (uudecode-decode-region): Automatically detect external program.
+
+       * binhex.el (binhex-use-external): New.
+       (binhex-decode-region-internal): New.
+       (binhex-decode-region): Automatically detect external program.
+       
+       * mm-uu.el (mm-uu-decode-function): 
+       (mm-uu-binhex-decode-function): Use them.
+
 2001-12-12  Simon Josefsson  <jas@extundo.com>
 
        * nnvirtual.el (nnvirtual-always-rescan) 
index 6d8d434..120821f 100644 (file)
@@ -1,5 +1,5 @@
 ;;; binhex.el --- elisp native binhex decode
-;; Copyright (c) 1998, 1999, 2000 Free Software Foundation, Inc.
+;; Copyright (c) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
 
 ;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
 ;; Keywords: binhex news
@@ -25,6 +25,8 @@
 
 ;;; Code:
 
+(autoload 'executable-find "executable")
+
 (eval-when-compile (require 'cl))
 
 (eval-and-compile
        'char-int
       'identity)))
 
-(defvar binhex-decoder-program "hexbin"
+(defcustom binhex-decoder-program "hexbin"
   "*Non-nil value should be a string that names a uu decoder.
 The program should expect to read binhex data on its standard
-input and write the converted data to its standard output.")
+input and write the converted data to its standard output."
+  :type 'string
+  :group 'gnus-extract)
+
+(defcustom binhex-decoder-switches '("-d")
+  "*List of command line flags passed to the command named by binhex-decoder-program."
+  :group 'gnus-extract
+  :type '(repeat string))
 
-(defvar binhex-decoder-switches '("-d")
-  "*List of command line flags passed to the command named by binhex-decoder-program.")
+(defcustom binhex-use-external 
+  (executable-find binhex-decoder-program)
+  "*Use external binhex program."
+  :group 'gnus-extract
+  :type 'boolean)
 
 (defconst binhex-alphabet-decoding-alist
   '(( ?\! . 0) ( ?\" . 1) ( ?\# . 2) ( ?\$ . 3) ( ?\% . 4) ( ?\& . 5)
@@ -184,8 +196,9 @@ input and write the converted data to its standard output.")
    (t
     (binhex-insert-char (setq binhex-last-char char) 1 ignored buffer))))
 
-(defun binhex-decode-region (start end &optional header-only)
-  "Binhex decode region between START and END.
+;;;###autoload
+(defun binhex-decode-region-internal (start end &optional header-only)
+  "Binhex decode region between START and END without using an external program.
 If HEADER-ONLY is non-nil only decode header and return filename."
   (interactive "r")
   (let ((work-buffer nil)
@@ -258,12 +271,14 @@ If HEADER-ONLY is non-nil only decode header and return filename."
       (and work-buffer (kill-buffer work-buffer)))
     (if header (aref header 1))))
 
+;;;###autoload
 (defun binhex-decode-region-external (start end)
   "Binhex decode region between START and END using external decoder."
   (interactive "r")
   (let ((cbuf (current-buffer)) firstline work-buffer status
        (file-name (expand-file-name
-                   (concat (binhex-decode-region start end t) ".data")
+                   (concat (binhex-decode-region-internal start end t) 
+                           ".data")
                    binhex-temporary-file-directory)))
     (save-excursion
       (goto-char start)
@@ -296,6 +311,14 @@ If HEADER-ONLY is non-nil only decode header and return filename."
       (ignore-errors
        (if file-name (delete-file file-name))))))
 
+;;;###autoload
+(defun binhex-decode-region (start end)
+  "Binhex decode region between START and END."
+  (interactive "r")
+  (if binhex-use-external 
+      (binhex-decode-region-external start end)
+    (binhex-decode-region-internal start end)))
+
 (provide 'binhex)
 
 ;;; binhex.el ends here
index da5507c..f36a5fd 100644 (file)
 (require 'mm-decode)
 (require 'mailcap)
 (require 'mml2015)
-(require 'uudecode)
-(require 'binhex)
 
-;; This is not the right place for this.  uudecode.el should decide
-;; whether or not to use a program with a single interface, but I
-;; guess it's too late now.  Also the default should depend on a test
-;; for the program.  -- fx
+(autoload 'uudecode-decode-region "uudecode")
+(autoload 'uudecode-decode-region-external "uudecode")
+(autoload 'uudecode-decode-region-internal "uudecode")
+
+(autoload 'binhex-decode-region "binhex")
+(autoload 'binhex-decode-region-external "binhex")
+(autoload 'binhex-decode-region-internal "binhex")
+
 (defcustom mm-uu-decode-function 'uudecode-decode-region
   "*Function to uudecode.
 Internal function is done in Lisp by default, therefore decoding may
 appear to be horribly slow.  You can make Gnus use an external
 decoder, such as uudecode."
   :type '(choice
-         (function-item :tag "Internal" uudecode-decode-region)
+         (function-item :tag "Auto detect" uudecode-decode-region)
+         (function-item :tag "Internal" uudecode-decode-region-internal)
          (function-item :tag "External" uudecode-decode-region-external))
   :group 'gnus-article-mime)
 
@@ -53,8 +56,9 @@ decoder, such as uudecode."
 Internal function is done in elisp by default, therefore decoding may
 appear to be horribly slow . You can make Gnus use the external Unix
 decoder, such as hexbin."
-  :type '(choice (item :tag "internal" binhex-decode-region)
-                (item :tag "external" binhex-decode-region-external))
+  :type '(choice (function-item :tag "Auto detect" binhex-decode-region)
+                (function-item :tag "Internal" binhex-decode-region-internal)
+                (function-item :tag "External" binhex-decode-region-external))
   :group 'gnus-article-mime)
 
 (defvar mm-uu-pgp-beginning-signature
index b7168c6..812aafd 100644 (file)
@@ -1,6 +1,6 @@
 ;;; uudecode.el -- elisp native uudecode
 
-;; Copyright (c) 1998, 1999, 2000 Free Software Foundation, Inc.
+;; Copyright (c) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
 
 ;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
 ;; Keywords: uudecode news
 
 ;;; Commentary:
 
-;;     Lots of codes are stolen from mm-decode.el, gnus-uu.el and
-;;     base64.el
-
 ;; This looks as though it could be made rather more efficient for
 ;; internal working.  Encoding could use a lookup table and decoding
 ;; should presumably use a vector or list buffer for partial results
 ;; rather than with-current-buffer.  -- fx
 
-;; Only `uudecode-decode-region' should be advertised, and whether or
-;; not that uses a program should be customizable, but I guess it's
-;; too late now.  -- fx
-
 ;;; Code:
 
+(autoload 'executable-find "executable")
+
 (eval-when-compile (require 'cl))
 
 (eval-and-compile
@@ -66,6 +61,12 @@ input and write the converted data to its standard output."
   :group 'gnus-extract
   :type '(repeat string))
 
+(defcustom uudecode-use-external 
+  (executable-find uudecode-decoder-program)
+  "*Use external uudecode program."
+  :group 'gnus-extract
+  :type 'boolean)
+
 (defconst uudecode-alphabet "\040-\140")
 
 (defconst uudecode-begin-line "^begin[ \t]+[0-7][0-7][0-7][ \t]+\\(.*\\)$")
@@ -135,7 +136,7 @@ used is specified by `uudecode-decoder-program'."
       (ignore-errors (or file-name (delete-file tempfile))))))
 
 ;;;###autoload
-(defun uudecode-decode-region (start end &optional file-name)
+(defun uudecode-decode-region-internal (start end &optional file-name)
   "Uudecode region between START and END without using an external program.
 If FILE-NAME is non-nil, save the result to FILE-NAME."
   (interactive "r\nP")
@@ -216,6 +217,14 @@ If FILE-NAME is non-nil, save the result to FILE-NAME."
              (delete-region (point) end))))
       (and work-buffer (kill-buffer work-buffer)))))
 
+;;;###autoload
+(defun uudecode-decode-region (start end &optional file-name)
+  "Uudecode region between START and END.
+If FILE-NAME is non-nil, save the result to FILE-NAME."
+  (if uudecode-use-external 
+      (uudecode-decode-region-external start end file-name)
+    (uudecode-decode-region-internal start end file-name)))
+
 (provide 'uudecode)
 
 ;;; uudecode.el ends here