]> code.delx.au - gnu-emacs/blobdiff - lisp/tar-mode.el
Implement stub emulation of `readlink' for MS-DOS.
[gnu-emacs] / lisp / tar-mode.el
index f892570633729ac4376ce6423193b2a9c0b32ab3..44908a87b8cfffbfea16498dceb340cc4a919439 100644 (file)
@@ -1,8 +1,6 @@
 ;;; tar-mode.el --- simple editing of tar files from GNU emacs
 
-;; Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-;;   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-;;   Free Software Foundation, Inc.
+;; Copyright (C) 1990-1991, 1993-2011  Free Software Foundation, Inc.
 
 ;; Author: Jamie Zawinski <jwz@lucid.com>
 ;; Maintainer: FSF
@@ -137,7 +135,6 @@ This information is useful, but it takes screen space away from file names."
 (defvar tar-parse-info nil)
 (defvar tar-superior-buffer nil)
 (defvar tar-superior-descriptor nil)
-(defvar tar-subfile-mode nil)
 (defvar tar-file-name-coding-system nil)
 
 (put 'tar-superior-buffer 'permanent-local t)
@@ -223,7 +220,7 @@ Preserve the modified states of the buffers and set `buffer-swapped-with'."
 (defun tar-roundup-512 (s)
   "Round S up to the next multiple of 512."
   (ash (ash (+ s 511) -9) 9))
+
 (defun tar-header-block-tokenize (pos coding)
   "Return a `tar-header' structure.
 This is a list of name, mode, uid, gid, size,
@@ -286,7 +283,8 @@ write-date, checksum, link-type, and link-name."
             (let* ((size (tar-parse-octal-integer
                           string tar-size-offset tar-time-offset))
                    ;; -1 so as to strip the terminating 0 byte.
-                   (name (buffer-substring pos (+ pos size -1)))
+                  (name (decode-coding-string
+                         (buffer-substring pos (+ pos size -1)) coding))
                    (descriptor (tar-header-block-tokenize
                                 (+ pos (tar-roundup-512 size))
                                coding)))
@@ -300,7 +298,7 @@ write-date, checksum, link-type, and link-name."
               (setf (tar-header-header-start descriptor)
                     (copy-marker (- pos 512) t))
               descriptor)
-        
+
           (make-tar-header
            (copy-marker pos nil)
            name
@@ -503,7 +501,7 @@ MODE should be an integer which is a file mode value."
         ;;(tar-header-block-check-checksum
         ;;  hblock (tar-header-block-checksum hblock)
         ;;  (tar-header-name descriptor))
-        
+
         (push descriptor result)
         (setq pos (tar-header-data-end descriptor))
         (progress-reporter-update progress-reporter pos)))
@@ -534,13 +532,11 @@ MODE should be an integer which is a file mode value."
     (define-key map "\C-m" 'tar-extract)
     (define-key map [mouse-2] 'tar-mouse-extract)
     (define-key map "g" 'revert-buffer)
-    (define-key map "h" 'describe-mode)
     (define-key map "n" 'tar-next-line)
     (define-key map "\^N" 'tar-next-line)
     (define-key map [down] 'tar-next-line)
     (define-key map "o" 'tar-extract-other-window)
     (define-key map "p" 'tar-previous-line)
-    (define-key map "q" 'quit-window)
     (define-key map "\^P" 'tar-previous-line)
     (define-key map [up] 'tar-previous-line)
     (define-key map "R" 'tar-rename-entry)
@@ -616,7 +612,7 @@ MODE should be an integer which is a file mode value."
   (if (buffer-live-p tar-data-buffer) (kill-buffer tar-data-buffer)))
 
 ;;;###autoload
-(define-derived-mode tar-mode nil "Tar"
+(define-derived-mode tar-mode special-mode "Tar"
   "Major mode for viewing a tar file as a dired-like listing of its contents.
 You can move around using the usual cursor motion commands.
 Letters no longer insert themselves.
@@ -672,29 +668,21 @@ See also: variables `tar-update-datestamp' and `tar-anal-blocksize'.
      (signal (car err) (cdr err)))))
 
 
-(defun tar-subfile-mode (p)
+(define-minor-mode tar-subfile-mode
   "Minor mode for editing an element of a tar-file.
 This mode arranges for \"saving\" this buffer to write the data
 into the tar-file buffer that it came from.  The changes will actually
 appear on disk when you save the tar-file's buffer."
-  (interactive "P")
+  ;; Don't do this, because it is redundant and wastes mode line space.
+  ;; :lighter " TarFile"
+  nil nil nil
   (or (and (boundp 'tar-superior-buffer) tar-superior-buffer)
       (error "This buffer is not an element of a tar file"))
-  ;; Don't do this, because it is redundant and wastes mode line space.
-  ;;  (or (assq 'tar-subfile-mode minor-mode-alist)
-  ;;      (setq minor-mode-alist (append minor-mode-alist
-  ;;                                (list '(tar-subfile-mode " TarFile")))))
-  (make-local-variable 'tar-subfile-mode)
-  (setq tar-subfile-mode
-       (if (null p)
-           (not tar-subfile-mode)
-           (> (prefix-numeric-value p) 0)))
   (cond (tar-subfile-mode
         (add-hook 'write-file-functions 'tar-subfile-save-buffer nil t)
         ;; turn off auto-save.
         (auto-save-mode -1)
-        (setq buffer-auto-save-file-name nil)
-        (run-hooks 'tar-subfile-mode-hook))
+        (setq buffer-auto-save-file-name nil))
        (t
         (remove-hook 'write-file-functions 'tar-subfile-save-buffer t))))
 
@@ -1255,5 +1243,4 @@ Leaves the region wide."
 
 (provide 'tar-mode)
 
-;; arch-tag: 8a585a4a-340e-42c2-89e7-d3b1013a4b78
 ;;; tar-mode.el ends here