X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/9c8020a8df03dc67a56d7df15664dcf7ace54bf0..b336bfcdf39f1e4d35bff4a7bd01d3b4bca8f516:/lisp/arc-mode.el diff --git a/lisp/arc-mode.el b/lisp/arc-mode.el index 421283da9e..1cb3ade9a2 100644 --- a/lisp/arc-mode.el +++ b/lisp/arc-mode.el @@ -1,18 +1,18 @@ ;;; arc-mode.el --- simple editing of archives -;; Copyright (C) 1995, 1997, 1998, 2001, 2002, 2003, 2004, -;; 2005, 2006, 2007 Free Software Foundation, Inc. +;; Copyright (C) 1995, 1997, 1998, 2001, 2002, 2003, 2004, 2005, 2006, +;; 2007, 2008, 2009, 2010 Free Software Foundation, Inc. ;; Author: Morten Welinder -;; Keywords: archives msdog editing major-mode +;; Keywords: files archives msdog editing major-mode ;; Favourite-brand-of-beer: None, I hate beer. ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -20,9 +20,7 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: @@ -137,14 +135,14 @@ :group 'archive) (defcustom archive-remote-regexp "^/[^/:]*[^/:.]:" - "*Regexp recognizing archive files names that are not local. + "Regexp recognizing archive files names that are not local. A non-local file is one whose file name is not proper outside Emacs. A local copy of the archive will be used when updating." :type 'regexp :group 'archive) (defcustom archive-extract-hooks nil - "*Hooks to run when an archive member has been extracted." + "Hooks to run when an archive member has been extracted." :type 'hook :group 'archive) ;; ------------------------------ @@ -154,7 +152,7 @@ A local copy of the archive will be used when updating." ;; to extract to stdout without junk getting added. (defcustom archive-arc-extract '("arc" "x") - "*Program and its options to run in order to extract an arc file member. + "Program and its options to run in order to extract an arc file member. Extraction should happen to the current directory. Archive and member name will be added." :type '(list (string :tag "Program") @@ -165,7 +163,7 @@ name will be added." (defcustom archive-arc-expunge '("arc" "d") - "*Program and its options to run in order to delete arc file members. + "Program and its options to run in order to delete arc file members. Archive and member names will be added." :type '(list (string :tag "Program") (repeat :tag "Options" @@ -175,7 +173,7 @@ Archive and member names will be added." (defcustom archive-arc-write-file-member '("arc" "u") - "*Program and its options to run in order to update an arc file member. + "Program and its options to run in order to update an arc file member. Archive and member name will be added." :type '(list (string :tag "Program") (repeat :tag "Options" @@ -187,7 +185,7 @@ Archive and member name will be added." (defcustom archive-lzh-extract '("lha" "pq") - "*Program and its options to run in order to extract an lzh file member. + "Program and its options to run in order to extract an lzh file member. Extraction should happen to standard output. Archive and member name will be added." :type '(list (string :tag "Program") @@ -198,7 +196,7 @@ be added." (defcustom archive-lzh-expunge '("lha" "d") - "*Program and its options to run in order to delete lzh file members. + "Program and its options to run in order to delete lzh file members. Archive and member names will be added." :type '(list (string :tag "Program") (repeat :tag "Options" @@ -208,7 +206,7 @@ Archive and member names will be added." (defcustom archive-lzh-write-file-member '("lha" "a") - "*Program and its options to run in order to update an lzh file member. + "Program and its options to run in order to update an lzh file member. Archive and member name will be added." :type '(list (string :tag "Program") (repeat :tag "Options" @@ -223,7 +221,7 @@ Archive and member name will be added." (executable-find "pkunzip")) '("pkunzip" "-e" "-o-") '("unzip" "-qq" "-c")) - "*Program and its options to run in order to extract a zip file member. + "Program and its options to run in order to extract a zip file member. Extraction should happen to standard output. Archive and member name will be added." :type '(list (string :tag "Program") @@ -232,7 +230,7 @@ be added." (string :format "%v"))) :group 'archive-zip) -;; For several reasons the latter behaviour is not desirable in general. +;; For several reasons the latter behavior is not desirable in general. ;; (1) It uses more disk space. (2) Error checking is worse or non- ;; existent. (3) It tends to do funny things with other systems' file ;; names. @@ -242,7 +240,7 @@ be added." (executable-find "pkzip")) '("pkzip" "-d") '("zip" "-d" "-q")) - "*Program and its options to run in order to delete zip file members. + "Program and its options to run in order to delete zip file members. Archive and member names will be added." :type '(list (string :tag "Program") (repeat :tag "Options" @@ -255,7 +253,7 @@ Archive and member names will be added." (executable-find "pkzip")) '("pkzip" "-u" "-P") '("zip" "-q")) - "*Program and its options to run in order to update a zip file member. + "Program and its options to run in order to update a zip file member. Options should ensure that specified directory will be put into the zip file. Archive and member name will be added." :type '(list (string :tag "Program") @@ -269,7 +267,7 @@ file. Archive and member name will be added." (executable-find "pkzip")) '("pkzip" "-u" "-P") '("zip" "-q" "-k")) - "*Program and its options to run in order to update a case fiddled zip member. + "Program and its options to run in order to update a case fiddled zip member. Options should ensure that specified directory will be put into the zip file. Archive and member name will be added." :type '(list (string :tag "Program") @@ -279,7 +277,7 @@ Archive and member name will be added." :group 'archive-zip) (defcustom archive-zip-case-fiddle t - "*If non-nil then zip file members may be down-cased. + "If non-nil then zip file members may be down-cased. This case fiddling will only happen for members created by a system that uses caseless file names." :type 'boolean @@ -289,7 +287,7 @@ that uses caseless file names." (defcustom archive-zoo-extract '("zoo" "xpq") - "*Program and its options to run in order to extract a zoo file member. + "Program and its options to run in order to extract a zoo file member. Extraction should happen to standard output. Archive and member name will be added." :type '(list (string :tag "Program") @@ -300,7 +298,7 @@ be added." (defcustom archive-zoo-expunge '("zoo" "DqPP") - "*Program and its options to run in order to delete zoo file members. + "Program and its options to run in order to delete zoo file members. Archive and member names will be added." :type '(list (string :tag "Program") (repeat :tag "Options" @@ -310,7 +308,7 @@ Archive and member names will be added." (defcustom archive-zoo-write-file-member '("zoo" "a") - "*Program and its options to run in order to update a zoo file member. + "Program and its options to run in order to update a zoo file member. Archive and member name will be added." :type '(list (string :tag "Program") (repeat :tag "Options" @@ -358,6 +356,8 @@ Archive and member name will be added." (define-key map "M" 'archive-chmod-entry) (define-key map "G" 'archive-chgrp-entry) (define-key map "O" 'archive-chown-entry) + ;; Let mouse-1 follow the link. + (define-key map [follow-link] 'mouse-face) (if (fboundp 'command-remapping) (progn @@ -638,7 +638,7 @@ archive. ;; mode on and off. You can corrupt things that way. (if (zerop (buffer-size)) ;; At present we cannot create archives from scratch - (funcall default-major-mode) + (funcall (or (default-value 'major-mode) 'fundamental-mode)) (if (and (not force) archive-files) nil (let* ((type (archive-find-type)) (typename (capitalize (symbol-name type)))) @@ -698,7 +698,7 @@ archive. (or file-name-coding-system default-file-name-coding-system locale-coding-system)) - (if default-enable-multibyte-characters + (if (default-value 'enable-multibyte-characters) (set-buffer-multibyte 'to)) (archive-summarize nil) (setq buffer-read-only t)))) @@ -716,18 +716,22 @@ archive. ;; The funny [] here make it unlikely that the .elc file will be treated ;; as an archive by other software. (let (case-fold-search) - (cond ((looking-at "[P]K\003\004") 'zip) + (cond ((looking-at "\\(PK00\\)?[P]K\003\004") 'zip) ((looking-at "..-l[hz][0-9ds]-") 'lzh) ((looking-at "....................[\334]\247\304\375") 'zoo) ((and (looking-at "\C-z") ; signature too simple, IMHO (string-match "\\.[aA][rR][cC]$" (or buffer-file-name (buffer-name)))) 'arc) - ;; This pattern modelled on the BSD/GNU+Linux `file' command. + ;; This pattern modeled 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) ((looking-at "Rar!") 'rar) + ((looking-at "!\n") 'ar) + ((and (looking-at "MZ") + (re-search-forward "Rar!" (+ (point) 100000) t)) + 'rar-exe) (t (error "Buffer format not recognized"))))) ;; ------------------------------------------------------------------------- @@ -814,15 +818,27 @@ If FNAME is something our underlying filesystem can't grok, or if another file by that name already exists in DIR, a unique new name is generated using `make-temp-file', and the generated name is returned." (let ((fullname (expand-file-name fname dir)) - (alien (string-match file-name-invalid-regexp fname))) - (if (or alien (file-exists-p fullname)) - (make-temp-file + (alien (string-match file-name-invalid-regexp fname)) + (tmpfile (expand-file-name (if (if (fboundp 'msdos-long-file-names) (not (msdos-long-file-names))) "am" "arc-mode.") - dir)) + dir))) + (if (or alien (file-exists-p fullname)) + (progn + ;; Maked sure all the leading directories in + ;; archive-local-name exist under archive-tmpdir, so that + ;; the directory structure recorded in the archive is + ;; reconstructed in the temporary directory. + (make-directory (file-name-directory tmpfile) t) + (make-temp-file tmpfile)) + ;; Maked sure all the leading directories in `fullname' exist + ;; under archive-tmpdir. This is necessary for nested archives + ;; (`archive-extract' sets `archive-remote' to t in case + ;; an archive occurs inside another archive). + (make-directory (file-name-directory fullname) t) fullname))) (defun archive-maybe-copy (archive) @@ -839,11 +855,6 @@ using `make-temp-file', and the generated name is returned." archive))) (setq archive-local-name (archive-unique-fname archive-name archive-tmpdir)) - ;; Maked sure all the leading directories in - ;; archive-local-name exist under archive-tmpdir, so that - ;; the directory structure recorded in the archive is - ;; reconstructed in the temporary directory. - (make-directory (file-name-directory archive-local-name) t) (save-restriction (widen) (write-region start (point-max) archive-local-name nil 'nomessage)) @@ -888,6 +899,26 @@ using `make-temp-file', and the generated name is returned." ;; ------------------------------------------------------------------------- ;;; Section: Member extraction +(defun archive-try-jka-compr () + (when (and auto-compression-mode + (jka-compr-get-compression-info buffer-file-name)) + (let* ((basename (file-name-nondirectory buffer-file-name)) + (tmpname (if (string-match ":\\([^:]+\\)\\'" basename) + (match-string 1 basename) basename)) + (tmpfile (make-temp-file (file-name-sans-extension tmpname) + nil + (file-name-extension tmpname 'period)))) + (unwind-protect + (progn + (let ((coding-system-for-write 'no-conversion) + ;; Don't re-compress this data just before decompressing it. + (jka-compr-inhibit t)) + (write-region (point-min) (point-max) tmpfile nil 'quiet)) + (erase-buffer) + (let ((coding-system-for-read 'no-conversion)) + (insert-file-contents tmpfile))) + (delete-file tmpfile))))) + (defun archive-file-name-handler (op &rest args) (or (eq op 'file-exists-p) (let ((file-name-handler-alist nil)) @@ -917,13 +948,12 @@ using `make-temp-file', and the generated name is returned." (car (find-operation-coding-system 'insert-file-contents (cons filename (current-buffer)) t)))))) - (if (and (not coding-system-for-read) - (not enable-multibyte-characters)) - (setq coding - (coding-system-change-text-conversion coding 'raw-text))) - (if (and coding - (not (eq coding 'no-conversion))) - (decode-coding-region (point-min) (point-max) coding) + (unless (or coding-system-for-read + enable-multibyte-characters) + (setq coding + (coding-system-change-text-conversion coding 'raw-text))) + (unless (memq coding '(nil no-conversion)) + (decode-coding-region (point-min) (point-max) coding) (setq last-coding-system-used coding)) (set-buffer-modified-p nil) (kill-local-variable 'buffer-file-coding-system) @@ -995,6 +1025,7 @@ using `make-temp-file', and the generated name is returned." (progn (set-buffer-modified-p nil) (kill-buffer buffer)) + (archive-try-jka-compr) ;Pretty ugly hack :-( (archive-set-buffer-as-visiting-file ename) (goto-char (point-min)) (rename-buffer bufname) @@ -1016,7 +1047,8 @@ using `make-temp-file', and the generated name is returned." (archive-maybe-update t)) (or (not (buffer-name buffer)) (cond - (view-p (view-buffer buffer (and just-created 'kill-buffer))) + (view-p (view-buffer + buffer (and just-created 'kill-buffer-if-not-modified))) ((eq other-window-p 'display) (display-buffer buffer)) (other-window-p (switch-to-buffer-other-window buffer)) (t (switch-to-buffer buffer)))))) @@ -1034,7 +1066,7 @@ using `make-temp-file', and the generated name is returned." nil nil (append (cdr command) (list archive name)))) - (cond ((and (numberp exit-status) (= exit-status 0)) + (cond ((and (numberp exit-status) (zerop exit-status)) (if (not (file-exists-p tmpfile)) (ding (message "`%s': no such file or directory" tmpfile)) (insert-file-contents tmpfile) @@ -1092,7 +1124,7 @@ using `make-temp-file', and the generated name is returned." (file-name-nondirectory buffer-file-name) "")))) (with-current-buffer arcbuf - (or (eq major-mode 'archive-mode) + (or (derived-mode-p 'archive-mode) (error "Buffer is not an archive buffer")) (if archive-read-only (error "Archive is read-only"))) @@ -1146,7 +1178,7 @@ using `make-temp-file', and the generated name is returned." ;; the dired-like listing we created. (if (eq major-mode 'archive-mode) (archive-write-file tmpfile) - (write-region (point-min) (point-max) tmpfile nil 'nomessage)) + (write-region nil nil tmpfile nil 'nomessage)) ;; basic-save-buffer needs last-coding-system-used to have ;; the value used to write the file, so save it before any ;; further processing clobbers it (we restore it in @@ -1165,9 +1197,8 @@ using `make-temp-file', and the generated name is returned." nil (append (cdr command) (list archive ename))))) - (if (equal exitcode 0) - nil - (error "Updating was unsuccessful (%S)" exitcode)))) + (or (zerop exitcode) + (error "Updating was unsuccessful (%S)" exitcode)))) (archive-delete-local tmpfile)))) (defun archive-write-file (&optional file) @@ -1707,7 +1738,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself." str archive-file-name-coding-system))) (isdir (and (= ucsize 0) (string= (file-name-nondirectory efnname) ""))) - (mode (cond ((memq creator '(2 3)) ; Unix + VMS + (mode (cond ((memq creator '(2 3)) ; Unix (archive-l-e (+ p 40) 2)) ((memq creator '(0 5 6 7 10 11 15)) ; Dos etc. (logior ?\444 @@ -1756,9 +1787,20 @@ This doesn't recover lost files, it just undoes changes in the buffer itself." (apply 'vector (nreverse files)))) (defun archive-zip-extract (archive name) - (if (equal (car archive-zip-extract) "pkzip") + (if (member-ignore-case (car archive-zip-extract) '("pkunzip" "pkzip")) (archive-*-extract archive name archive-zip-extract) - (archive-extract-by-stdout archive name archive-zip-extract))) + (archive-extract-by-stdout + archive + ;; unzip expands wildcards in NAME, so we need to quote it. But + ;; not on DOS/Windows, since that fails extraction on those + ;; systems, and file names with wildcards in zip archives don't + ;; work there anyway. + ;; FIXME: Does pkunzip need similar treatment? + (if (and (not (memq system-type '(windows-nt ms-dos))) + (equal (car archive-zip-extract) "unzip")) + (shell-quote-argument name) + name) + archive-zip-extract))) (defun archive-zip-write-file-member (archive descr) (archive-*-write-file-member @@ -1776,7 +1818,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself." (oldmode (aref fil 3)) (newval (archive-calc-mode oldmode newmode t)) (inhibit-read-only t)) - (cond ((memq creator '(2 3)) ; Unix + VMS + (cond ((memq creator '(2 3)) ; Unix (goto-char (+ p 40)) (delete-char 2) (insert-unibyte (logand newval 255) (lsh newval -8))) @@ -1860,10 +1902,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 ())) @@ -1872,16 +1914,13 @@ 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]+" ;; Ratio ; Date' " +\\([0-9%]+\\) +\\([-0-9]+\\)" ;; Time ; Attr. - " +\\([0-9:]+\\) +......" + " +\\([0-9:]+\\) +[^ \n]\\{6,10\\}" ;; CRC; Meth ; Var. " +[0-9A-F]+ +[^ \n]+ +[0-9.]+\n")) (goto-char (match-end 0)) @@ -1894,8 +1933,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)) @@ -1937,6 +1975,159 @@ 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)))) + + +;;; Section `ar' archives. + +;; TODO: we currently only handle the basic format of ar archives, +;; not the GNU nor the BSD extensions. As it turns out, this is sufficient +;; for .deb packages. + +(autoload 'tar-grind-file-mode "tar-mode") + +(defconst archive-ar-file-header-re + "\\(.\\{16\\}\\)\\([ 0-9]\\{12\\}\\)\\([ 0-9]\\{6\\}\\)\\([ 0-9]\\{6\\}\\)\\([ 0-7]\\{8\\}\\)\\([ 0-9]\\{10\\}\\)`\n") + +(defun archive-ar-summarize () + ;; File is used internally for `archive-rar-exe-summarize'. + (let* ((maxname 10) + (maxtime 16) + (maxuser 5) + (maxgroup 5) + (maxmode 8) + (maxsize 5) + (files ())) + (goto-char (point-min)) + (search-forward "!\n") + (while (looking-at archive-ar-file-header-re) + (let ((name (match-string 1)) + extname + ;; Emacs will automatically use float here because those + ;; timestamps don't fit in our ints. + (time (string-to-number (match-string 2))) + (user (match-string 3)) + (group (match-string 4)) + (mode (string-to-number (match-string 5) 8)) + (size (string-to-number (match-string 6)))) + ;; Move to the beginning of the data. + (goto-char (match-end 0)) + (setq time + (format-time-string + "%Y-%m-%d %H:%M" + (let ((high (truncate (/ time 65536)))) + (list high (truncate (- time (* 65536.0 high))))))) + (setq extname + (cond ((equal name "// ") + (propertize ".." 'face 'italic)) + ((equal name "/ ") + (propertize ".." 'face 'italic)) + ((string-match "/? *\\'" name) + (substring name 0 (match-beginning 0))))) + (setq user (substring user 0 (string-match " +\\'" user))) + (setq group (substring group 0 (string-match " +\\'" group))) + (setq mode (tar-grind-file-mode mode)) + ;; Move to the end of the data. + (forward-char size) (if (eq ?\n (char-after)) (forward-char 1)) + (setq size (number-to-string size)) + (if (> (length name) maxname) (setq maxname (length name))) + (if (> (length time) maxtime) (setq maxtime (length time))) + (if (> (length user) maxuser) (setq maxuser (length user))) + (if (> (length group) maxgroup) (setq maxgroup (length group))) + (if (> (length mode) maxmode) (setq maxmode (length mode))) + (if (> (length size) maxsize) (setq maxsize (length size))) + (push (vector name extname nil mode + time user group size) + files))) + (setq files (nreverse files)) + (goto-char (point-min)) + (let* ((format (format "%%%ds %%%ds/%%-%ds %%%ds %%%ds %%s" + maxmode maxuser maxgroup maxsize maxtime)) + (sep (format format (make-string maxmode ?-) + (make-string maxuser ?-) + (make-string maxgroup ?-) + (make-string maxsize ?-) + (make-string maxtime ?-) "")) + (column (length sep))) + (insert (format format " Mode " "User" "Group" " Size " + " Date " "Filename") + "\n") + (insert sep (make-string maxname ?-) "\n") + (archive-summarize-files (mapcar (lambda (desc) + (let ((text + (format format + (aref desc 3) + (aref desc 5) + (aref desc 6) + (aref desc 7) + (aref desc 4) + (aref desc 1)))) + (vector text + column + (length text)))) + files)) + (insert sep (make-string maxname ?-) "\n") + (apply 'vector files)))) + +(defun archive-ar-extract (archive name) + (let ((destbuf (current-buffer)) + (archivebuf (find-file-noselect archive)) + (from nil) size) + (with-current-buffer archivebuf + (save-restriction + ;; We may be in archive-mode or not, so either with or without + ;; narrowing and with or without a prepended summary. + (save-excursion + (widen) + (search-forward "!\n") + (while (and (not from) (looking-at archive-ar-file-header-re)) + (let ((this (match-string 1))) + (setq size (string-to-number (match-string 6))) + (goto-char (match-end 0)) + (if (equal name this) + (setq from (point)) + ;; Move to the end of the data. + (forward-char size) (if (eq ?\n (char-after)) (forward-char 1))))) + (when from + (set-buffer-multibyte nil) + (with-current-buffer destbuf + ;; Do it within the `widen'. + (insert-buffer-substring archivebuf from (+ from size))) + (set-buffer-multibyte 'to) + ;; Inform the caller that the call succeeded. + t)))))) + ;; ------------------------------------------------------------------------- ;; This line was a mistake; it is kept now for compatibility. ;; rms 15 Oct 98