emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/undo.c


From: Stefan Monnier
Subject: [Emacs-diffs] Changes to emacs/src/undo.c
Date: Thu, 04 Apr 2002 15:43:02 -0500

Index: emacs/src/undo.c
diff -c emacs/src/undo.c:1.54 emacs/src/undo.c:1.55
*** emacs/src/undo.c:1.54       Fri Nov  2 15:34:18 2001
--- emacs/src/undo.c    Thu Apr  4 15:42:56 2002
***************
*** 36,54 ****
     an undo-boundary.  */
  Lisp_Object pending_boundary;
  
! /* 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
!    because we don't need to record the contents.)  */
  
! void
! record_insert (beg, length)
!      int beg, length;
  {
!   Lisp_Object lbeg, lend;
! 
!   if (EQ (current_buffer->undo_list, Qt))
!     return;
  
    /* Allocate a cons cell to be the undo boundary after this command.  */
    if (NILP (pending_boundary))
--- 36,50 ----
     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 at_boundary;
  
    /* Allocate a cons cell to be the undo boundary after this command.  */
    if (NILP (pending_boundary))
***************
*** 59,67 ****
--- 55,112 ----
      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
+    because we don't need to record the contents.)  */
+ 
+ void
+ record_insert (beg, length)
+      int beg, length;
+ {
+   Lisp_Object lbeg, lend;
+ 
+   if (EQ (current_buffer->undo_list, Qt))
+     return;
+ 
+   record_point (beg);
+ 
    /* If this is following another insertion and consecutive with it
       in the buffer, combine the two.  */
    if (CONSP (current_buffer->undo_list))
***************
*** 93,151 ****
       Lisp_Object string;
  {
    Lisp_Object sbeg;
-   int at_boundary;
  
    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))
      {
!       /* 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 = 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);
  
    current_buffer->undo_list
      = Fcons (Fcons (string, sbeg), current_buffer->undo_list);
--- 138,157 ----
       Lisp_Object string;
  {
    Lisp_Object sbeg;
  
    if (EQ (current_buffer->undo_list, Qt))
      return;
  
!   if (PT == beg + XSTRING (string)->size)
      {
!       XSETINT (sbeg, -beg);
!       record_point (PT);
      }
    else
!     {
!       XSETFASTINT (sbeg, beg);
!       record_point (beg);
!     }
  
    current_buffer->undo_list
      = Fcons (Fcons (string, sbeg), current_buffer->undo_list);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]