(Fprimitive_undo): Rename arg to N to avoid conflict.
[bpt/emacs.git] / src / undo.c
index 18bfc3a..2e6cae3 100644 (file)
@@ -26,6 +26,8 @@ and this notice must be preserved on all copies.  */
 /* Last buffer for which undo information was recorded.  */
 Lisp_Object last_undo_buffer;
 
+Lisp_Object Qinhibit_read_only;
+
 /* Record an insertion that just happened or is about to happen,
    for LENGTH characters at position BEG.
    (It is possible to record an insertion before or after the fact
@@ -283,10 +285,11 @@ truncate_undo_list (list, minsize, maxsize)
 DEFUN ("primitive-undo", Fprimitive_undo, Sprimitive_undo, 2, 2, 0,
   "Undo N records from the front of the list LIST.\n\
 Return what remains of the list.")
-  (count, list)
-     Lisp_Object count, list;
+  (n, list)
+     Lisp_Object n, list;
 {
-  register int arg = XINT (count);
+  int count = specpdl_ptr - specpdl;
+  register int arg = XINT (n);
 #if 0  /* This is a good feature, but would make undo-start
          unable to do what is expected.  */
   Lisp_Object tem;
@@ -298,6 +301,10 @@ Return what remains of the list.")
     list = Fcdr (list);
 #endif
 
+  /* Don't let read-only properties interfere with undo.  */
+  if (NILP (current_buffer->read_only))
+    specbind (Qinhibit_read_only, Qt);
+
   while (arg > 0)
     {
       while (1)
@@ -401,11 +408,14 @@ Return what remains of the list.")
       arg--;
     }
 
-  return list;
+  return unbind_to (count, list);
 }
 
 syms_of_undo ()
 {
+  Qinhibit_read_only = intern ("inhibit-read-only");
+  staticpro (&Qinhibit_read_only);
+
   defsubr (&Sprimitive_undo);
   defsubr (&Sundo_boundary);
 }