# HG changeset patch # User Chong Yidong # Date 1177026782 0 # Node ID 1b3aff56da730ebe7de3771a4722f97729b20251 # Parent 40604938395a59e75a39315236427faa3a6a7f8e (archive-find-type): lzh-exe for lzh self-extracting exe. (archive-lzh-summarize): Add optional start arg for where to start looking at the archive. (archive-lzh-exe-summarize, archive-lzh-exe-extract): New functions. diff -r 40604938395a -r 1b3aff56da73 lisp/arc-mode.el --- a/lisp/arc-mode.el Thu Apr 19 23:52:40 2007 +0000 +++ b/lisp/arc-mode.el Thu Apr 19 23:53:02 2007 +0000 @@ -700,6 +700,10 @@ (string-match "\\.[aA][rR][cC]$" (or buffer-file-name (buffer-name)))) 'arc) + ;; This pattern modelled on the BSD/GNU+Linux `file' command. + ;; Have seen capital "LHA's", and file has lower case "LHa's" too. + ;; Note this regexp is also in archive-exe-p. + ((looking-at "MZ\\(.\\|\n\\)\\{34\\}LH[aA]'s SFX ") 'lzh-exe) (t (error "Buffer format not recognized"))))) ;; ------------------------------------------------------------------------- (defun archive-summarize (&optional shut-up) @@ -1398,8 +1402,8 @@ ;; ------------------------------------------------------------------------- ;; Section: Lzh Archives -(defun archive-lzh-summarize () - (let ((p 1) +(defun archive-lzh-summarize (&optional start) + (let ((p (or start 1)) ;; 1 for .lzh, something further on for .exe (totalsize 0) (maxlen 8) files @@ -1621,6 +1625,34 @@ ;; This should work even though newmode will be dynamically accessed. (lambda (old) (archive-calc-mode old newmode t)) files "a unix-style mode" 8)) + +;; ------------------------------------------------------------------------- +;; Section: Lzh Self-Extracting .exe Archives +;; +;; No support for modifying these files. It looks like the lha for unix +;; program (as of version 1.14i) can't create or retain the DOS exe part. +;; If you do an "lha a" on a .exe for instance it renames and writes to a +;; plain .lzh. + +(defun archive-lzh-exe-summarize () + "Summarize the contents of an LZH self-extracting exe, for `archive-mode'." + + ;; Skip the initial executable code part and apply archive-lzh-summarize + ;; to the archive part proper. The "-lh5-" etc regexp here for the start + ;; is the same as in archive-find-type. + ;; + ;; The lha program (version 1.14i) does this in skip_msdos_sfx1_code() by + ;; a similar scan. It looks for "..-l..-" plus for level 0 or 1 a test of + ;; the header checksum, or level 2 a test of the "attribute" and size. + ;; + (re-search-forward "..-l[hz][0-9ds]-" nil) + (archive-lzh-summarize (match-beginning 0))) + +;; `archive-lzh-extract' runs "lha pq", and that works for .exe as well as +;; .lzh files +(defalias 'archive-lzh-exe-extract 'archive-lzh-extract + "Extract a member from an LZH self-extracting exe, for `archive-mode'.") + ;; ------------------------------------------------------------------------- ;; Section: Zip Archives