+(defun archive-file-name-handler (op &rest args)
+ (or (eq op 'file-exists-p)
+ (let ((file-name-handler-alist nil))
+ (apply op args))))
+
+(defun archive-set-buffer-as-visiting-file (filename)
+ "Set the current buffer as if it were visiting FILENAME."
+ (save-excursion
+ (goto-char (point-min))
+ (let ((coding
+ (or coding-system-for-read
+ (and set-auto-coding-function
+ (funcall set-auto-coding-function
+ filename (- (point-max) (point-min))))
+ ;; dos-w32.el defines find-operation-coding-system for
+ ;; DOS/Windows systems which preserves the coding-system
+ ;; of existing files. We want it to act here as if the
+ ;; extracted file existed.
+ (let ((file-name-handler-alist
+ '(("" . archive-file-name-handler))))
+ (car (find-operation-coding-system 'insert-file-contents
+ filename 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)
+ (setq last-coding-system-used coding))
+ (set-buffer-modified-p nil)
+ (kill-local-variable 'buffer-file-coding-system)
+ (after-insert-file-set-buffer-file-coding-system (- (point-max)
+ (point-min))))))
+