Initial Commit
[packages] / xemacs-packages / dired / dired-uu.el
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;;
3 ;; File:          dired-uu.el
4 ;; Dired Version: 7.17
5 ;; RCS:
6 ;; Description:   Commands for uuencoding/uudecoding marked files.
7 ;; Author:        Sandy Rutherford <sandy@math.ubc.ca>
8 ;;
9 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10
11 ;;; Requirements and provisions
12 (provide 'dired-uu)
13 (require 'dired)
14
15 (defvar dired-uu-files-to-decode nil)
16 ;; Fluid var to pass data inside dired-create-files.
17
18 (defun dired-uucode-file (file ok-flag)
19   ;; uuencode or uudecode FILE.
20   ;; Don't really support the ok-flag, but needed for compatibility
21   (let ((handler (find-file-name-handler file 'dired-uucode-file)))
22     (cond (handler
23            (funcall handler 'dired-uucode-file file ok-flag))
24           ((or (file-symlink-p file) (file-directory-p file))
25            nil)
26           (t
27            (if (assoc file dired-uu-files-to-decode)
28                (let ((default-directory (file-name-directory file)))
29                  (if (dired-check-process
30                       (concat "Uudecoding " file) shell-file-name shell-command-switch
31                       (format "uudecode %s" file))
32                     (signal 'file-error (list "Error uudecoding" file))))
33              (let ((nfile (concat file ".uu")))
34                (if (dired-check-process
35                    (concat "Uuencoding " file) shell-file-name shell-command-switch
36                    (format "uuencode %s %s > %s"
37                            file (file-name-nondirectory file) nfile))
38                    (signal 'file-error (list "Error uuencoding" file)))))))))
39
40 (defun dired-uucode-out-file (file)
41   ;; Returns the name of the output file for the uuencoded FILE.
42   (let ((buff (get-buffer-create " *dired-check-process output*"))
43         (case-fold-search t))
44     (save-excursion
45       (set-buffer buff)
46       (erase-buffer)
47       (if (string-equal "18." (substring emacs-version 0 3))
48           (call-process "head" file buff nil "-n" "1")
49         (insert-file-contents file nil 0 80))
50       (goto-char (point-min))
51       (if (looking-at "begin [0-9]+ \\([^\n]*\\)\n")
52           (expand-file-name
53            (buffer-substring (match-beginning 1) (match-end 1))
54            (file-name-directory file))
55         nil))))
56
57 ;;;###autoload
58 (defun dired-do-uucode (&optional arg files to-decode)
59   "Uuencode or uudecode marked (or next ARG) files."
60   (interactive
61    (let* ((dir (dired-current-directory))
62           (files (dired-get-marked-files nil current-prefix-arg))
63           (arg (prefix-numeric-value current-prefix-arg))
64           (total (length files))
65           rfiles decoders ofile decode encode hint-p)
66      (mapcar
67       (function
68        (lambda (fn)
69          (if (setq ofile (dired-uucode-out-file fn))
70              (setq decoders (cons (cons fn ofile) decoders)))))
71       files)
72      (setq decode (length decoders)
73            encode (- total decode)
74            hint-p (not (or (zerop decode) (zerop encode))))
75      (setq rfiles
76            (mapcar
77             (function
78              (lambda (fn)
79                (if hint-p
80                    (concat
81                     (if (assoc fn decoders) " [de] " " [en] ")
82                     (dired-make-relative fn dir t))
83                  (dired-make-relative fn dir t))))
84             files))
85      (or (memq 'uuencode dired-no-confirm)
86          (dired-mark-pop-up nil 'uuencode rfiles 'y-or-n-p
87                             (cond
88                              ((null decoders)
89                               (if (= encode 1)
90                                   (format "Uuencode %s? " (car rfiles))
91                                 (format "Uuencode %d file%s? "
92                                         encode (dired-plural-s encode))))
93                              ((zerop encode)
94                               (if (= decode 1)
95                                   (format "Uudecode %s? " (car rfiles))
96                                 (format "Uudecode %d file%s? "
97                                         decode (dired-plural-s decode))))
98                              (t
99                               (format "Uudecode %d and uuencode %d file%s? "
100                                       decode encode (dired-plural-s encode)))))
101          (setq arg 0))
102      (list arg files decoders)))
103   (let ((dired-uu-files-to-decode to-decode)
104         out-file)
105     (if (not (zerop arg))  
106         (dired-create-files
107          'dired-uucode-file
108          "Uuencode or Uudecode"
109          files
110          (function
111           (lambda (fn)
112             (if (setq out-file (assoc fn dired-uu-files-to-decode))
113                 (cdr out-file)
114               (concat fn ".uu"))))
115          dired-keep-marker-uucode nil t))))
116
117 ;;; end of dired-uu.el