changeset 86928:29dfee94a77f

(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.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sun, 02 Dec 2007 02:05:48 +0000
parents d4651506a112
children edfd75871d15
files lisp/ChangeLog lisp/arc-mode.el
diffstat 2 files changed, 57 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sat Dec 01 22:04:57 2007 +0000
+++ b/lisp/ChangeLog	Sun Dec 02 02:05:48 2007 +0000
@@ -1,3 +1,10 @@
+2007-12-02  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* arc-mode.el (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.
+
 2007-12-01  Dan Nicolaescu  <dann@ics.uci.edu>
 
 	* log-edit.el (log-edit-show-diff): New function.
@@ -38,8 +45,8 @@
 	* textmodes/org-export-latex.el (org-export-latex-cleaned-string):
 	Move args on defun line.
 
-	* textmodes/org.el (org-calendar-holiday): Use
-	calendar-check-holidays instead of the obsolete
+	* textmodes/org.el (org-calendar-holiday):
+	Use calendar-check-holidays instead of the obsolete
 	check-calendar-holidays.
 	(add-to-diary-list, table--at-cell-p, Info-find-node, bbdb)
 	(bbdb-company, bbdb-current-record, bbdb-name)
@@ -69,8 +76,8 @@
 
 	* longlines.el (longlines-show-hard-newlines): Remove handling of
 	buffer-undo-list and buffer-modified status.
-	(longlines-show-region, longlines-unshow-hard-newlines): Handle
-	buffer-undo-list, buffer-modified status, inhibit-read-only, and
+	(longlines-show-region, longlines-unshow-hard-newlines):
+	Handle buffer-undo-list, buffer-modified status, inhibit-read-only, and
 	inhibit-modification-hooks here to avoid that a buffer appears
 	modified when toggling visibility of hard newlines.
 
@@ -160,8 +167,8 @@
 	* net/newsticker.el (w3m-toggle-inline-image, htmlr-reset)
 	(htmlr-step): Declare as functions.
 
-	* net/eudcb-bbdb.el (eudc-bbdb-extract-addresses): Use
-	bbdb-address-zip rather than bbdb-address-zip-string.
+	* net/eudcb-bbdb.el (eudc-bbdb-extract-addresses):
+	Use bbdb-address-zip rather than bbdb-address-zip-string.
 
 2007-11-28  Richard Stallman  <rms@gnu.org>
 
@@ -190,8 +197,7 @@
 
 	* nxml/nxml-maint.el (nxml-create-unicode-char-name-sets):
 	* nxml/nxml-mode.el (nxml-get-char-name, nxml-insert-named-char):
-	* nxml/xsd-regexp.el (xsdre-gen-categories): Use mapc rather than
-	mapcar.
+	* nxml/xsd-regexp.el (xsdre-gen-categories): Change mapcar -> mapc.
 
 	* nxml/nxml-outln.el (nxml-token-start-tag-p)
 	(nxml-token-end-tag-p): Move definitions before use.
--- a/lisp/arc-mode.el	Sat Dec 01 22:04:57 2007 +0000
+++ b/lisp/arc-mode.el	Sun Dec 02 02:05:48 2007 +0000
@@ -705,6 +705,9 @@
           ;; 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 @@
 ;; -------------------------------------------------------------------------
 ;;; 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 @@
       (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 @@
                         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 @@
           (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)