X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Fuudecode.el;h=c1e3439a5dedfa66fbd62ad4bb899ac15e49af56;hb=851278bf56a0156a4dd5896e9959f63e33d07ee2;hp=8e2fd6661bea561510cf4ba7ccc3047667133093;hpb=ef1aaf66b5d7e69120c6d9ed2b9ae0c91153d9b4;p=gnus diff --git a/lisp/uudecode.el b/lisp/uudecode.el index 8e2fd6661..c1e3439a5 100644 --- a/lisp/uudecode.el +++ b/lisp/uudecode.el @@ -1,16 +1,16 @@ ;;; uudecode.el -- elisp native uudecode -;; Copyright (c) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. +;; Copyright (C) 1998-2015 Free Software Foundation, Inc. ;; Author: Shenghuo Zhu ;; Keywords: uudecode news -;; This file is a part of GNU Emacs. +;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -18,16 +18,12 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: ;;; Code: -(autoload 'executable-find "executable") - (eval-when-compile (require 'cl)) (eval-and-compile @@ -36,22 +32,28 @@ 'char-int 'identity))) +(defgroup uudecode nil + "Decoding of uuencoded data." + :group 'mail + :group 'news) + (defcustom uudecode-decoder-program "uudecode" - "*Non-nil value should be a string that names a uu decoder. + "Non-nil value should be a string that names a uu decoder. The program should expect to read uu data on its standard input and write the converted data to its standard output." :type 'string - :group 'gnus-extract) + :group 'uudecode) (defcustom uudecode-decoder-switches nil - "*List of command line flags passed to `uudecode-decoder-program'." - :group 'gnus-extract + "List of command line flags passed to `uudecode-decoder-program'." + :group 'uudecode :type '(repeat string)) -(defcustom uudecode-use-external +(defcustom uudecode-use-external (executable-find uudecode-decoder-program) - "*Use external uudecode program." - :group 'gnus-extract + "Use external uudecode program." + :version "22.1" + :group 'uudecode :type 'boolean) (defconst uudecode-alphabet "\040-\140") @@ -98,7 +100,11 @@ used is specified by `uudecode-decoder-program'." (make-temp-name "uu") uudecode-temporary-file-directory)))) (let ((cdir default-directory) - default-process-coding-system) + (default-process-coding-system + (if (featurep 'xemacs) + ;; In XEmacs, nil is not a valid coding system. + '(binary . binary) + nil))) (unwind-protect (with-temp-buffer (insert "begin 600 " (file-name-nondirectory tempfile) "\n") @@ -122,6 +128,20 @@ used is specified by `uudecode-decoder-program'." (message "Can not uudecode"))) (ignore-errors (or file-name (delete-file tempfile)))))) +(eval-and-compile + (defalias 'uudecode-string-to-multibyte + (cond + ((featurep 'xemacs) + 'identity) + ((fboundp 'string-to-multibyte) + 'string-to-multibyte) + (t + (lambda (string) + "Return a multibyte string with the same individual chars as string." + (mapconcat + (lambda (ch) (string-as-multibyte (char-to-string ch))) + string "")))))) + ;;;###autoload (defun uudecode-decode-region-internal (start end &optional file-name) "Uudecode region between START and END without using an external program. @@ -166,8 +186,8 @@ If FILE-NAME is non-nil, save the result to FILE-NAME." (setq counter (1+ counter) inputpos (1+ inputpos)) (cond ((= counter 4) - (setq result (cons - (concat + (setq result (cons + (concat (char-to-string (lsh bits -16)) (char-to-string (logand (lsh bits -8) 255)) (char-to-string (logand bits 255))) @@ -177,36 +197,39 @@ If FILE-NAME is non-nil, save the result to FILE-NAME." (cond (done) ((> 0 remain) - (error "uucode line ends unexpectly") + (error "uucode line ends unexpectedly") (setq done t)) ((and (= (point) end) (not done)) - ;;(error "uucode ends unexpectly") + ;;(error "uucode ends unexpectedly") (setq done t)) ((= counter 3) - (setq result (cons - (concat + (setq result (cons + (concat (char-to-string (logand (lsh bits -16) 255)) (char-to-string (logand (lsh bits -8) 255))) result))) ((= counter 2) - (setq result (cons + (setq result (cons (char-to-string (logand (lsh bits -10) 255)) result)))) (skip-chars-forward non-data-chars end)) (if file-name - (let (default-enable-multibyte-characters) - (with-temp-file file-name - (insert (apply 'concat (nreverse result))))) + (with-temp-file file-name + (unless (featurep 'xemacs) (set-buffer-multibyte nil)) + (insert (apply 'concat (nreverse result)))) (or (markerp end) (setq end (set-marker (make-marker) end))) (goto-char start) - (insert (apply 'concat (nreverse result))) + (if enable-multibyte-characters + (dolist (x (nreverse result)) + (insert (uudecode-string-to-multibyte x))) + (insert (apply 'concat (nreverse result)))) (delete-region (point) end)))))) ;;;###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 + (if uudecode-use-external (uudecode-decode-region-external start end file-name) (uudecode-decode-region-internal start end file-name)))