summaryrefslogtreecommitdiff
path: root/lisp/arc-mode.el
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2007-12-02 02:05:48 +0000
committerStefan Monnier <monnier@iro.umontreal.ca>2007-12-02 02:05:48 +0000
commitc9db111a741ff4c64a779d848101b1b9e6e5b9f5 (patch)
treecf26c987685ab1f68a25f9355e90927d368646e1 /lisp/arc-mode.el
parent29c7eba8a113cffc54f3a52476194e383326d9a4 (diff)
downloademacs-c9db111a741ff4c64a779d848101b1b9e6e5b9f5.tar.gz
(archive-find-type): Add recognition of rar-exe format.
(archive-rar-summarize): Allow the file name to be passed as argument. Remove unused vars `header' and `footer'. (archive-rar-exe-summarize, archive-rar-exe-extract): New functions.
Diffstat (limited to 'lisp/arc-mode.el')
-rw-r--r--lisp/arc-mode.el52
1 files changed, 43 insertions, 9 deletions
diff --git a/lisp/arc-mode.el b/lisp/arc-mode.el
index 404e4543e0b..8fb9e239b1c 100644
--- a/lisp/arc-mode.el
+++ b/lisp/arc-mode.el
@@ -705,6 +705,9 @@ archive.
;; Note this regexp is also in archive-exe-p.
((looking-at "MZ\\(.\\|\n\\)\\{34\\}LH[aA]'s SFX ") 'lzh-exe)
((looking-at "Rar!") 'rar)
+ ((and (looking-at "MZ")
+ (re-search-forward "Rar!" (+ (point) 100000) t))
+ 'rar-exe)
(t (error "Buffer format not recognized")))))
;; -------------------------------------------------------------------------
@@ -1844,10 +1847,10 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
;; -------------------------------------------------------------------------
;;; Section: Rar Archives
-(defun archive-rar-summarize ()
- (let* ((file buffer-file-name)
- (copy (file-local-copy file))
- header footer
+(defun archive-rar-summarize (&optional file)
+ ;; File is used internally for `archive-rar-exe-summarize'.
+ (unless file (setq file buffer-file-name))
+ (let* ((copy (file-local-copy file))
(maxname 10)
(maxsize 5)
(files ()))
@@ -1856,9 +1859,6 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
(if copy (delete-file copy))
(goto-char (point-min))
(re-search-forward "^-+\n")
- (setq header
- (buffer-substring (save-excursion (re-search-backward "^[^ ]"))
- (point)))
(while (looking-at (concat " \\(.*\\)\n" ;Name.
;; Size ; Packed.
" +\\([0-9]+\\) +[0-9]+"
@@ -1878,8 +1878,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
size (match-string 3)
;; Date, Time.
(match-string 4) (match-string 5))
- files)))
- (setq footer (buffer-substring (point) (point-max))))
+ files))))
(setq files (nreverse files))
(goto-char (point-min))
(let* ((format (format " %%s %%s %%%ds %%5s %%s" maxsize))
@@ -1921,9 +1920,44 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
(delete-directory (expand-file-name name dest)))
(delete-directory dest)))))
+;;; Section: Rar self-extracting .exe archives.
+
+(defun archive-rar-exe-summarize ()
+ (let ((tmpfile (make-temp-file "rarexe")))
+ (unwind-protect
+ (progn
+ (goto-char (point-min))
+ (re-search-forward "Rar!")
+ (write-region (match-beginning 0) (point-max) tmpfile)
+ (archive-rar-summarize tmpfile))
+ (delete-file tmpfile))))
+
+(defun archive-rar-exe-extract (archive name)
+ (let* ((tmpfile (make-temp-file "rarexe"))
+ (buf (find-buffer-visiting archive))
+ (tmpbuf (unless buf (generate-new-buffer " *rar-exe*"))))
+ (unwind-protect
+ (progn
+ (with-current-buffer (or buf tmpbuf)
+ (save-excursion
+ (save-restriction
+ (if buf
+ ;; point-max unwidened is assumed to be the end of the
+ ;; summary text and the beginning of the actual file data.
+ (progn (goto-char (point-max)) (widen))
+ (insert-file-contents-literally archive)
+ (goto-char (point-min)))
+ (re-search-forward "Rar!")
+ (write-region (match-beginning 0) (point-max) tmpfile))))
+ (archive-rar-extract tmpfile name))
+ (if tmpbuf (kill-buffer tmpbuf))
+ (delete-file tmpfile))))
+
+
;; -------------------------------------------------------------------------
;; This line was a mistake; it is kept now for compatibility.
;; rms 15 Oct 98
+
(provide 'archive-mode)
(provide 'arc-mode)