]> git.eshelyaron.com Git - emacs.git/commitdiff
(with-category-table): Use `make-symbol' to avoid variable capture.
authorJohn Paul Wallington <jpw@pobox.com>
Sat, 29 Mar 2003 02:57:19 +0000 (02:57 +0000)
committerJohn Paul Wallington <jpw@pobox.com>
Sat, 29 Mar 2003 02:57:19 +0000 (02:57 +0000)
Set table within `unwind-protect'.  Ensure table is restored in
correct buffer.  Add docstring.  Basically, copy `with-syntax-table'.

lisp/ChangeLog
lisp/international/mule.el

index 8a92d0d6b713ecedffa91895fa7fdc38eb008cb2..a7e5e0b70235e927a38392d5962fb487af6b687b 100644 (file)
@@ -1,3 +1,9 @@
+2003-03-29  John Paul Wallington  <jpw@gnu.org>
+
+       * international/mule.el (with-category-table): Use `make-symbol'
+       to avoid variable capture.  Set table within `unwind-protect'.
+       Ensure table is restored in correct buffer.  Add docstring.
+
 2003-03-29  Kenichi Handa  <handa@etlken2>
 
        * language/japan-util.el: If system-type is not for Windows,
index d5e516ee059fe9489d9255d7409c9b920e5a69f8..0d96510edf85c3bf2d7c4bdb4bda97d335748d3d 100644 (file)
@@ -593,7 +593,7 @@ character code range.  Thus FUNC should iterate over [START, END]."
                 (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 @@ the table in `translation-table-vector'."
 
 (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.