changeset 50336:15141bb6dc1f

(with-category-table): Use `make-symbol' to avoid variable capture. Set table within `unwind-protect'. Ensure table is restored in correct buffer. Add docstring. Basically, copy `with-syntax-table'.
author John Paul Wallington <jpw@pobox.com>
date Sat, 29 Mar 2003 02:56:35 +0000
parents 0d468249dd37
children f4504bc1f3bf
files lisp/international/mule.el
diffstat 1 files changed, 17 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/international/mule.el	Sat Mar 29 02:35:08 2003 +0000
+++ b/lisp/international/mule.el	Sat Mar 29 02:56:35 2003 +0000
@@ -593,7 +593,7 @@
 		 (make-char charset (+ i start) (+ start chars -1)))))))
 
 (defun register-char-codings (coding-system safe-chars)
-  "This is an obsolete function.  
+  "This is an obsolete function.
 It exists just for backward compatibility, and it does nothing.")
 (make-obsolete 'register-char-codings
 	       "Unnecessary function.  Calling it has no effect."
@@ -1985,12 +1985,22 @@
 
 (put 'with-category-table 'lisp-indent-function 1)
 
-(defmacro with-category-table (category-table &rest body)
-  `(let ((current-category-table (category-table)))
-     (set-category-table ,category-table)
-     (unwind-protect
-	 (progn ,@body)
-       (set-category-table current-category-table))))
+(defmacro with-category-table (table &rest body)
+  "Evaluate BODY with category table of current buffer set to TABLE.
+The category table of the current buffer is saved, BODY is evaluated,
+then the saved table is restored, even in case of an abnormal exit.
+Value is what BODY returns."
+  (let ((old-table (make-symbol "old-table"))
+	(old-buffer (make-symbol "old-buffer")))
+    `(let ((,old-table (category-table))
+	   (,old-buffer (current-buffer)))
+       (unwind-protect
+	   (progn
+	     (set-category-table ,table)
+	     ,@body)
+	 (save-current-buffer
+	   (set-buffer ,old-buffer)
+	   (set-category-table ,old-table))))))
 
 (defun define-translation-hash-table (symbol table)
   "Define SYMBOL as the name of the hash translation TABLE for use in CCL.