*** empty log message ***
[bpt/emacs.git] / src / undo.c
index 0c87a59..dd086db 100644 (file)
@@ -36,6 +36,62 @@ Lisp_Object Qinhibit_read_only;
    an undo-boundary.  */
 Lisp_Object pending_boundary;
 
    an undo-boundary.  */
 Lisp_Object pending_boundary;
 
+/* Record point as it was at beginning of this command (if necessary)
+   And prepare the undo info for recording a change.
+   PT is the position of point that will naturally occur as a result of the
+   undo record that will be added just after this command terminates.  */
+
+static void
+record_point (pt)
+     int pt;
+{
+  int at_boundary;
+
+  /* Allocate a cons cell to be the undo boundary after this command.  */
+  if (NILP (pending_boundary))
+    pending_boundary = Fcons (Qnil, Qnil);
+
+  if (!BUFFERP (last_undo_buffer)
+      || current_buffer != XBUFFER (last_undo_buffer))
+    Fundo_boundary ();
+  XSETBUFFER (last_undo_buffer, current_buffer);
+
+  if (CONSP (current_buffer->undo_list))
+    {
+      /* Set AT_BOUNDARY to 1 only when we have nothing other than
+         marker adjustment before undo boundary.  */
+
+      Lisp_Object tail = current_buffer->undo_list, elt;
+
+      while (1)
+       {
+         if (NILP (tail))
+           elt = Qnil;
+         else
+           elt = XCAR (tail);
+         if (NILP (elt) || ! (CONSP (elt) && MARKERP (XCAR (elt))))
+           break;
+         tail = XCDR (tail);
+       }
+      at_boundary = NILP (elt);
+    }
+  else
+    at_boundary = 1;
+
+  if (MODIFF <= SAVE_MODIFF)
+    record_first_change ();
+
+  /* If we are just after an undo boundary, and
+     point wasn't at start of deleted range, record where it was.  */
+  if (at_boundary
+      && last_point_position != pt
+      /* If we're called from batch mode, this could be nil.  */
+      && BUFFERP (last_point_position_buffer)
+      && current_buffer == XBUFFER (last_point_position_buffer))
+    current_buffer->undo_list
+      = Fcons (make_number (last_point_position), current_buffer->undo_list);
+}
+
 /* 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
 /* 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
@@ -50,17 +106,7 @@ record_insert (beg, length)
   if (EQ (current_buffer->undo_list, Qt))
     return;
 
   if (EQ (current_buffer->undo_list, Qt))
     return;
 
-  /* Allocate a cons cell to be the undo boundary after this command.  */
-  if (NILP (pending_boundary))
-    pending_boundary = Fcons (Qnil, Qnil);
-
-  if (!BUFFERP (last_undo_buffer)
-      || current_buffer != XBUFFER (last_undo_buffer))
-    Fundo_boundary ();
-  XSETBUFFER (last_undo_buffer, current_buffer);
-
-  if (MODIFF <= SAVE_MODIFF)
-    record_first_change ();
+  record_point (beg);
 
   /* If this is following another insertion and consecutive with it
      in the buffer, combine the two.  */
 
   /* If this is following another insertion and consecutive with it
      in the buffer, combine the two.  */
@@ -93,59 +139,20 @@ record_delete (beg, string)
      Lisp_Object string;
 {
   Lisp_Object sbeg;
      Lisp_Object string;
 {
   Lisp_Object sbeg;
-  int at_boundary;
 
   if (EQ (current_buffer->undo_list, Qt))
     return;
 
 
   if (EQ (current_buffer->undo_list, Qt))
     return;
 
-  /* Allocate a cons cell to be the undo boundary after this command.  */
-  if (NILP (pending_boundary))
-    pending_boundary = Fcons (Qnil, Qnil);
-
-  if (BUFFERP (last_undo_buffer)
-      && current_buffer != XBUFFER (last_undo_buffer))
-    Fundo_boundary ();
-  XSETBUFFER (last_undo_buffer, current_buffer);
-
-  if (CONSP (current_buffer->undo_list))
+  if (PT == beg + SCHARS (string))
     {
     {
-      /* Set AT_BOUNDARY to 1 only when we have nothing other than
-         marker adjustment before undo boundary.  */
-
-      Lisp_Object tail = current_buffer->undo_list, elt;
-
-      while (1)
-       {
-         if (NILP (tail))
-           elt = Qnil;
-         else
-           elt = XCAR (tail);
-         if (NILP (elt) || ! (CONSP (elt) && MARKERP (XCAR (elt))))
-           break;
-         tail = XCDR (tail);
-       }
-      at_boundary = NILP (elt);
+      XSETINT (sbeg, -beg);
+      record_point (PT);
     }
   else
     }
   else
-    at_boundary = 0;
-
-  if (MODIFF <= SAVE_MODIFF)
-    record_first_change ();
-
-  if (PT == beg + XSTRING (string)->size)
-    XSETINT (sbeg, -beg);
-  else
-    XSETFASTINT (sbeg, beg);
-
-  /* If we are just after an undo boundary, and 
-     point wasn't at start of deleted range, record where it was.  */
-  if (at_boundary
-      && last_point_position != XFASTINT (sbeg)
-      /* If we're called from batch mode, this could be nil.  */
-      && BUFFERP (last_point_position_buffer)
-      && current_buffer == XBUFFER (last_point_position_buffer))
-    current_buffer->undo_list
-      = Fcons (make_number (last_point_position), current_buffer->undo_list);
+    {
+      XSETFASTINT (sbeg, beg);
+      record_point (beg);
+    }
 
   current_buffer->undo_list
     = Fcons (Fcons (string, sbeg), current_buffer->undo_list);
 
   current_buffer->undo_list
     = Fcons (Fcons (string, sbeg), current_buffer->undo_list);
@@ -168,7 +175,7 @@ record_marker_adjustment (marker, adjustment)
   if (NILP (pending_boundary))
     pending_boundary = Fcons (Qnil, Qnil);
 
   if (NILP (pending_boundary))
     pending_boundary = Fcons (Qnil, Qnil);
 
-  if (!BUFFERP (last_undo_buffer) 
+  if (!BUFFERP (last_undo_buffer)
       || current_buffer != XBUFFER (last_undo_buffer))
     Fundo_boundary ();
   XSETBUFFER (last_undo_buffer, current_buffer);
       || current_buffer != XBUFFER (last_undo_buffer))
     Fundo_boundary ();
   XSETBUFFER (last_undo_buffer, current_buffer);
@@ -305,7 +312,7 @@ truncate_undo_list (list, minsize, maxsize)
      If the first element is an undo boundary, skip past it.
 
      Skip, skip, skip the undo, skip, skip, skip the undo,
      If the first element is an undo boundary, skip past it.
 
      Skip, skip, skip the undo, skip, skip, skip the undo,
-     Skip, skip, skip the undo, skip to the undo bound'ry. 
+     Skip, skip, skip the undo, skip to the undo bound'ry.
      (Get it?  "Skip to my Loo?")  */
   if (CONSP (next) && NILP (XCAR (next)))
     {
      (Get it?  "Skip to my Loo?")  */
   if (CONSP (next) && NILP (XCAR (next)))
     {
@@ -328,7 +335,7 @@ truncate_undo_list (list, minsize, maxsize)
          size_so_far += sizeof (struct Lisp_Cons);
          if (STRINGP (XCAR (elt)))
            size_so_far += (sizeof (struct Lisp_String) - 1
          size_so_far += sizeof (struct Lisp_Cons);
          if (STRINGP (XCAR (elt)))
            size_so_far += (sizeof (struct Lisp_String) - 1
-                           + XSTRING (XCAR (elt))->size);
+                           + SCHARS (XCAR (elt)));
        }
 
       /* Advance to next element.  */
        }
 
       /* Advance to next element.  */
@@ -363,7 +370,7 @@ truncate_undo_list (list, minsize, maxsize)
          size_so_far += sizeof (struct Lisp_Cons);
          if (STRINGP (XCAR (elt)))
            size_so_far += (sizeof (struct Lisp_String) - 1
          size_so_far += sizeof (struct Lisp_Cons);
          if (STRINGP (XCAR (elt)))
            size_so_far += (sizeof (struct Lisp_String) - 1
-                           + XSTRING (XCAR (elt))->size);
+                           + SCHARS (XCAR (elt)));
        }
 
       /* Advance to next element.  */
        }
 
       /* Advance to next element.  */
@@ -393,9 +400,9 @@ Return what remains of the list.  */)
 {
   struct gcpro gcpro1, gcpro2;
   Lisp_Object next;
 {
   struct gcpro gcpro1, gcpro2;
   Lisp_Object next;
-  int count = BINDING_STACK_SIZE ();
+  int count = SPECPDL_INDEX ();
   register int arg;
   register int arg;
-  
+
 #if 0  /* This is a good feature, but would make undo-start
          unable to do what is expected.  */
   Lisp_Object tem;
 #if 0  /* This is a good feature, but would make undo-start
          unable to do what is expected.  */
   Lisp_Object tem;
@@ -407,7 +414,7 @@ Return what remains of the list.  */)
     list = Fcdr (list);
 #endif
 
     list = Fcdr (list);
 #endif
 
-  CHECK_NUMBER (n, 0);
+  CHECK_NUMBER (n);
   arg = XINT (n);
   next = Qnil;
   GCPRO2 (next, list);
   arg = XINT (n);
   next = Qnil;
   GCPRO2 (next, list);
@@ -547,3 +554,6 @@ syms_of_undo ()
   defsubr (&Sprimitive_undo);
   defsubr (&Sundo_boundary);
 }
   defsubr (&Sprimitive_undo);
   defsubr (&Sundo_boundary);
 }
+
+/* arch-tag: d546ee01-4aed-4ffb-bb8b-eefaae50d38a
+   (do not change this comment) */