;; Copyright (C) 1993, 1994, 1995, 1997 Free Software Foundation, Inc.
;; Author: jka@ece.cmu.edu (Jay K. Adams)
+;; Maintainer: FSF
;; Keywords: data
;; This file is part of GNU Emacs.
(defvar jka-compr-mode-alist-additions
(list (cons "\\.tgz\\'" 'tar-mode))
- "A list of pairs to add to auto-mode-alist when jka-compr is installed.")
+ "A list of pairs to add to `auto-mode-alist' when jka-compr is installed.")
+
+;; List of all the elements we actually added to file-coding-system-alist.
+(defvar jka-compr-added-to-file-coding-system-alist nil)
(defvar jka-compr-file-name-handler-entry
nil
(defun jka-compr-call-process (prog message infile output temp args)
(if jka-compr-use-shell
- (let ((err-file (jka-compr-make-temp-name)))
-
+ (let ((err-file (jka-compr-make-temp-name))
+ (coding-system-for-read (or coding-system-for-read 'undecided))
+ (coding-system-for-write 'no-conversion) )
+
(unwind-protect
(or (memq
(jka-compr-run-real-handler 'write-region
(list start end temp-file t 'dont))
- (jka-compr-call-process compress-program
- (concat compress-message
- " " base-name)
- temp-file
- temp-buffer
- nil
- compress-args)
+ ;; Here we must read the output of compress program as is
+ ;; without any code conversion.
+ (let ((coding-system-for-read 'no-conversion))
+ (jka-compr-call-process compress-program
+ (concat compress-message
+ " " base-name)
+ temp-file
+ temp-buffer
+ nil
+ compress-args))
(with-current-buffer temp-buffer
- (jka-compr-run-real-handler 'write-region
- (list (point-min) (point-max)
- filename
- (and append can-append) 'dont))
- (erase-buffer))
+ (let ((coding-system-for-write 'no-conversion))
+ (if (memq system-type '(ms-dos windows-nt))
+ (setq buffer-file-type t) )
+ (jka-compr-run-real-handler 'write-region
+ (list (point-min) (point-max)
+ filename
+ (and append can-append) 'dont))
+ (erase-buffer)) )
(jka-compr-delete-temp-file temp-file)
(local-copy
(jka-compr-run-real-handler 'file-local-copy (list filename)))
local-file
- size start)
+ size start
+ (coding-system-for-read
+ (or coding-system-for-read
+ (let ((tail file-coding-system-alist)
+ (newfile
+ (jka-compr-byte-compiler-base-file-name file))
+ result)
+ (while tail
+ (if (string-match (car (car tail)) newfile)
+ (setq result (car (cdr (car tail)))
+ tail nil))
+ (setq tail (cdr tail)))
+ result)
+ 'undecided)) )
(setq local-file (or local-copy filename))
uncompress-message
(message "%s %s..." uncompress-message base-name))
- (jka-compr-call-process uncompress-program
- (concat uncompress-message
- " " base-name)
- local-file
- t
- nil
- uncompress-args)
-
- (and
- uncompress-message
- (message "%s %s...done" uncompress-message base-name))
-
- (write-region
- (point-min) (point-max) temp-file nil 'dont))
+ ;; Here we must read the output of uncompress program
+ ;; and write it to TEMP-FILE without any code
+ ;; conversion. An appropriate code conversion (if
+ ;; necessary) is done by the later I/O operation
+ ;; (e.g. load).
+ (let ((coding-system-for-read 'no-conversion)
+ (coding-system-for-write 'no-conversion))
+
+ (jka-compr-call-process uncompress-program
+ (concat uncompress-message
+ " " base-name)
+ local-file
+ t
+ nil
+ uncompress-args)
+
+ (and
+ uncompress-message
+ (message "%s %s...done" uncompress-message base-name))
+
+ (write-region
+ (point-min) (point-max) temp-file nil 'dont)))
(and
local-copy
(put 'byte-compiler-base-file-name 'jka-compr
'jka-compr-byte-compiler-base-file-name)
+(defvar jka-compr-inhibit nil
+ "Non-nil means inhibit automatic uncompression temporarily.
+Lisp programs can bind this to t to do that.
+It is not recommended to set this variable permanently to anything but nil.")
+
(defun jka-compr-handler (operation &rest args)
(save-match-data
(let ((jka-op (get operation 'jka-compr)))
- (if jka-op
+ (if (and jka-op (not jka-compr-inhibit))
(apply jka-op args)
(jka-compr-run-real-handler operation args)))))
(setq file-name-handler-alist (cons jka-compr-file-name-handler-entry
file-name-handler-alist))
+ (setq jka-compr-added-to-file-coding-system-alist nil)
+
(mapcar
(function (lambda (x)
+ ;; Don't do multibyte encoding on the compressed files.
+ (let ((elt (cons (jka-compr-info-regexp x)
+ '(no-conversion . no-conversion))))
+ (setq file-coding-system-alist
+ (cons elt file-coding-system-alist))
+ (setq jka-compr-added-to-file-coding-system-alist
+ (cons elt jka-compr-added-to-file-coding-system-alist)))
+
(and (jka-compr-info-strip-extension x)
;; Make entries in auto-mode-alist so that modes
;; are chosen right according to the file names
(setcdr last (cdr (cdr last)))
(setq last (cdr last))))
- (setq auto-mode-alist (cdr ama))))
+ (setq auto-mode-alist (cdr ama)))
+
+ (let* ((ama (cons nil file-coding-system-alist))
+ (last ama)
+ entry)
+
+ (while (cdr last)
+ (setq entry (car (cdr last)))
+ (if (member entry jka-compr-added-to-file-coding-system-alist)
+ (setcdr last (cdr (cdr last)))
+ (setq last (cdr last))))
+
+ (setq file-coding-system-alist (cdr ama))))
(defun jka-compr-installed-p ()