# HG changeset patch # User Richard M. Stallman # Date 772137006 0 # Node ID b72b84744a85c30bef7d9622d28da3e65124a3d9 # Parent 49dc4ea976a0647327dee770582c89f632c67957 Use plists to record handlers. (jka-compr-insert-file-contents): Don't leave buffer locked. Call the standard function, and file-local-copy, using jka-compr-run-real-handler. (jka-compr-file-local-copy): Call file-local-copy using jka-compr-run-real-handler. (jka-compr-write-region): Likewise. (jka-compr-load): Don't alter file-name-handler-alist. Do bind inhibit-file-name-handlers and inhibit-file-name-operation. (jka-compr-handler): Don't alter file-name-handler-alist. diff -r 49dc4ea976a0 -r b72b84744a85 lisp/jka-compr.el --- a/lisp/jka-compr.el Mon Jun 20 17:07:22 1994 +0000 +++ b/lisp/jka-compr.el Mon Jun 20 18:30:06 1994 +0000 @@ -166,7 +166,7 @@ auto-mode flag non-nil means strip the regexp from file names before attempting to set the mode. -Because of the way call-process is defined, discarding the stderr output of +Because of the way `call-process' is defined, discarding the stderr output of a program adds the overhead of starting a shell each time the program is invoked.") @@ -174,10 +174,6 @@ (defvar jka-compr-file-name-handler-entry nil "The entry in `file-name-handler-alist' used by the jka-compr I/O functions.") - -(defvar jka-compr-op-table - (make-vector 127 0) - "Hash table of operations supported by jka-compr.") ;;; Functions for accessing the return value of jka-get-compression-info (defun jka-compr-info-regexp (info) (aref info 0)) @@ -374,9 +370,6 @@ (defun jka-compr-write-region (start end file &optional append visit) - "Documented as original." - (interactive "r\nFWrite region to file: ") - (let* ((filename (expand-file-name file)) (visit-file (if (stringp visit) (expand-file-name visit) filename)) (info (jka-compr-get-compression-info visit-file))) @@ -434,7 +427,8 @@ compress-message (message "%s %s..." compress-message base-name)) - (write-region start end temp-file t 'dont) + (jka-compr-run-real-handler 'write-region + (list start end temp-file t 'dont)) (jka-compr-call-process compress-program (concat compress-message @@ -445,8 +439,10 @@ compress-args) (set-buffer temp-buffer) - (write-region (point-min) (point-max) - filename (and append can-append) 'dont) + (jka-compr-run-real-handler 'write-region + (list (point-min) (point-max) + filename + (and append can-append) 'dont)) (erase-buffer) (set-buffer cbuf) @@ -472,12 +468,11 @@ nil) - (write-region start end filename append visit)))) + (jka-compr-run-real-handler 'write-region + (list start end filename append visit))))) (defun jka-compr-insert-file-contents (file &optional visit beg end replace) - "Documented as original." - (barf-if-buffer-read-only) (and (or beg end) @@ -494,7 +489,8 @@ (uncompress-args (jka-compr-info-uncompress-args info)) (base-name (file-name-nondirectory filename)) (notfound nil) - (local-copy (file-local-copy filename)) + (local-copy + (jka-compr-run-real-handler 'file-local-copy (list filename))) local-file size start) @@ -555,6 +551,7 @@ (and visit (progn + (unlock-buffer) (setq buffer-file-name filename) (set-visited-file-modtime))) @@ -570,12 +567,11 @@ (list filename size)) - (insert-file-contents file visit beg end replace)))) + (jka-compr-run-real-handler 'insert-file-contents + (list file visit beg end replace))))) (defun jka-compr-file-local-copy (file) - "Documented as original." - (let* ((filename (expand-file-name file)) (info (jka-compr-get-compression-info filename))) @@ -585,7 +581,8 @@ (uncompress-program (jka-compr-info-uncompress-program info)) (uncompress-args (jka-compr-info-uncompress-args info)) (base-name (file-name-nondirectory filename)) - (local-copy (file-local-copy filename)) + (local-copy + (jka-compr-run-real-handler 'file-local-copy (list filename))) (temp-file (jka-compr-make-temp-name t)) (temp-buffer (get-buffer-create " *jka-compr-temp*")) (notfound nil) @@ -629,7 +626,7 @@ temp-file) - (file-local-copy filename)))) + (jka-compr-run-real-handler 'file-local-copy (list filename))))) ;;; Support for loading compressed files. @@ -641,12 +638,8 @@ (unwind-protect - (progn - - (setq file-name-handler-alist - (cons jka-compr-file-name-handler-entry - file-name-handler-alist)) - + (let (inhibit-file-name-operation + inhibit-file-name-handlers) (or nomessage (message "Loading %s..." file)) @@ -655,33 +648,21 @@ (or nomessage (message "Loading %s...done." file))) - (setq file-name-handler-alist - (delq jka-compr-file-name-handler-entry - file-name-handler-alist)) - (jka-compr-delete-temp-file local-copy)) t)) - + +(put 'write-region 'jka-compr 'jka-compr-write-region) +(put 'insert-file-contents 'jka-compr 'jka-compr-insert-file-contents) +(put 'file-local-copy 'jka-compr 'jka-compr-file-local-copy) +(put 'load 'jka-compr 'jka-compr-load) (defun jka-compr-handler (operation &rest args) - - (let ((jka-op (intern-soft (symbol-name operation) jka-compr-op-table)) - (match-data (match-data))) - - (unwind-protect - (progn - (setq file-name-handler-alist - (delq jka-compr-file-name-handler-entry - file-name-handler-alist)) - (if jka-op - (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)) - (store-match-data match-data)))) + (save-match-data + (let ((jka-op (get operation 'jka-compr))) + (if jka-op + (apply jka-op args) + (jka-compr-run-real-handler operation args))))) ;; If we are given an operation that we don't handle, ;; call the Emacs primitive for that operation, @@ -695,30 +676,6 @@ (inhibit-file-name-operation operation)) (apply operation args))) - -(defun jka-compr-intern-operation (op) - (let ((opsym (intern (symbol-name op) jka-compr-op-table)) - (jka-fn (intern (concat "jka-compr-" (symbol-name op))))) - (fset opsym jka-fn))) - - -(defvar jka-compr-operation-list - '( - write-region - insert-file-contents - file-local-copy - load - ) - "List of file operations implemented by jka-compr.") - - -(mapcar - (function - (lambda (fn) - (jka-compr-intern-operation fn))) - jka-compr-operation-list) - - (defun toggle-auto-compression (arg) "Toggle automatic file compression and decompression. With prefix argument ARG, turn auto compression on if positive, else off. @@ -769,6 +726,8 @@ (setq file-name-handler-alist (cons jka-compr-file-name-handler-entry file-name-handler-alist)) + ;; Make entries in auto-mode-alist so that modes are chosen right + ;; according to the file names sans `.gz'. (mapcar (function (lambda (x) (and