changeset 22107:5507c26908af

(insert_1_both, insert_from_string_1, replace_range) (insert_from_buffer_1, adjust_before_replace, adjust_after_replace): Don't copy text being deleted, if undo is disabled.
author Richard M. Stallman <rms@gnu.org>
date Sat, 16 May 1998 20:34:59 +0000
parents f4a52ea42920
children 7d28e1d5ea0e
files src/insdel.c
diffstat 1 files changed, 121 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/src/insdel.c	Sat May 16 19:56:07 1998 +0000
+++ b/src/insdel.c	Sat May 16 20:34:59 1998 +0000
@@ -1014,7 +1014,7 @@
      register int nchars, nbytes;
      int inherit, prepare, before_markers;
 {
-  register Lisp_Object temp, deletion;
+  register Lisp_Object temp;
   int combined_before_bytes, combined_after_bytes;
 
   if (NILP (current_buffer->enable_multibyte_characters))
@@ -1045,23 +1045,33 @@
 
   if (combined_after_bytes)
     {
-      deletion = make_buffer_string_both (PT, PT_BYTE,
-					  PT + combined_after_bytes,
-					  PT_BYTE + combined_after_bytes, 1);
+      Lisp_Object deletion;
+      deletion = Qnil;
+
+      if (! EQ (current_buffer->undo_list, Qt))
+	deletion = make_buffer_string_both (PT, PT_BYTE,
+					    PT + combined_after_bytes,
+					    PT_BYTE + combined_after_bytes, 1);
 
       adjust_markers_for_record_delete (PT, PT_BYTE,
 					PT + combined_after_bytes,
 					PT_BYTE + combined_after_bytes);
-      record_delete (PT, deletion);
+      if (! EQ (current_buffer->undo_list, Qt))
+	record_delete (PT, deletion);
     }
 
   if (combined_before_bytes)
     {
-      deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1),
-					  PT, PT_BYTE, 1);
+      Lisp_Object deletion;
+      deletion = Qnil;
+
+      if (! EQ (current_buffer->undo_list, Qt))
+	deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1),
+					    PT, PT_BYTE, 1);
       adjust_markers_for_record_delete (PT - 1, CHAR_TO_BYTE (PT - 1),
 					PT, PT_BYTE);
-      record_delete (PT - 1, deletion);
+      if (! EQ (current_buffer->undo_list, Qt))
+	record_delete (PT - 1, deletion);
     }
 
   record_insert (PT - !!combined_before_bytes,
@@ -1170,7 +1180,6 @@
   int combined_before_bytes, combined_after_bytes;
   int adjusted_nchars;
   INTERVAL intervals;
-  Lisp_Object deletion;
 
   /* Make OUTGOING_NBYTES describe the text
      as it will be inserted in this buffer.  */
@@ -1220,23 +1229,33 @@
 
   if (combined_after_bytes)
     {
-      deletion = make_buffer_string_both (PT, PT_BYTE,
-					  PT + combined_after_bytes,
-					  PT_BYTE + combined_after_bytes, 1);
+      Lisp_Object deletion;
+      deletion = Qnil;
+
+      if (! EQ (current_buffer->undo_list, Qt))
+	deletion = make_buffer_string_both (PT, PT_BYTE,
+					    PT + combined_after_bytes,
+					    PT_BYTE + combined_after_bytes, 1);
 
       adjust_markers_for_record_delete (PT, PT_BYTE,
 					PT + combined_after_bytes,
 					PT_BYTE + combined_after_bytes);
-      record_delete (PT, deletion);
+      if (! EQ (current_buffer->undo_list, Qt))
+	record_delete (PT, deletion);
     }
 
   if (combined_before_bytes)
     {
-      deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1),
-					  PT, PT_BYTE, 1);
+      Lisp_Object deletion;
+      deletion = Qnil;
+
+      if (! EQ (current_buffer->undo_list, Qt))
+	deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1),
+					    PT, PT_BYTE, 1);
       adjust_markers_for_record_delete (PT - 1, CHAR_TO_BYTE (PT - 1),
 					PT, PT_BYTE);
-      record_delete (PT - 1, deletion);
+      if (! EQ (current_buffer->undo_list, Qt))
+	record_delete (PT - 1, deletion);
     }
 
   record_insert (PT - !!combined_before_bytes,
@@ -1318,7 +1337,7 @@
      int from, nchars;
      int inherit;
 {
-  register Lisp_Object temp, deletion;
+  register Lisp_Object temp;
   int chunk;
   int from_byte = buf_charpos_to_bytepos (buf, from);
   int to_byte = buf_charpos_to_bytepos (buf, from + nchars);
@@ -1391,23 +1410,33 @@
 
   if (combined_after_bytes)
     {
-      deletion = make_buffer_string_both (PT, PT_BYTE,
-					  PT + combined_after_bytes,
-					  PT_BYTE + combined_after_bytes, 1);
+      Lisp_Object deletion;
+      deletion = Qnil;
+
+      if (! EQ (current_buffer->undo_list, Qt))
+	deletion = make_buffer_string_both (PT, PT_BYTE,
+					    PT + combined_after_bytes,
+					    PT_BYTE + combined_after_bytes, 1);
 
       adjust_markers_for_record_delete (PT, PT_BYTE,
 					PT + combined_after_bytes,
 					PT_BYTE + combined_after_bytes);
-      record_delete (PT, deletion);
+      if (! EQ (current_buffer->undo_list, Qt))
+	record_delete (PT, deletion);
     }
 
   if (combined_before_bytes)
     {
-      deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1),
-					  PT, PT_BYTE, 1);
+      Lisp_Object deletion;
+      deletion = Qnil;
+
+      if (! EQ (current_buffer->undo_list, Qt))
+	deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1),
+					    PT, PT_BYTE, 1);
       adjust_markers_for_record_delete (PT - 1, CHAR_TO_BYTE (PT - 1),
 					PT, PT_BYTE);
-      record_delete (PT - 1, deletion);
+      if (! EQ (current_buffer->undo_list, Qt))
+	record_delete (PT - 1, deletion);
     }
 
   record_insert (PT - !!combined_before_bytes,
@@ -1474,12 +1503,17 @@
      int from, from_byte, to, to_byte;
 {
   Lisp_Object deletion;
-  deletion = make_buffer_string_both (from, from_byte, to, to_byte, 1);
+
+  if (! EQ (current_buffer->undo_list, Qt))
+    deletion = make_buffer_string_both (from, from_byte, to, to_byte, 1);
 
   CHECK_MARKERS ();
 
   adjust_markers_for_delete (from, from_byte, to, to_byte);
-  record_delete (from, deletion);
+
+  if (! EQ (current_buffer->undo_list, Qt))
+    record_delete (from, deletion);
+
   adjust_overlays_for_delete (from, to - from);
 }
 
@@ -1499,28 +1533,39 @@
     = count_combining_before (GPT_ADDR, len_byte, from, from_byte);
   int combined_after_bytes
     = count_combining_after (GPT_ADDR, len_byte, from, from_byte);
-  Lisp_Object deletion;
   int nchars_del = 0, nbytes_del = 0;
 
   if (combined_after_bytes)
     {
-      deletion = make_buffer_string_both (from, from_byte,
-					  from + combined_after_bytes,
-					  from_byte + combined_after_bytes, 1);
+      Lisp_Object deletion;
+      deletion = Qnil;
+
+      if (! EQ (current_buffer->undo_list, Qt))
+	deletion = make_buffer_string_both (from, from_byte,
+					    from + combined_after_bytes,
+					    from_byte + combined_after_bytes,
+					    1);
 
       adjust_markers_for_record_delete (from, from_byte,
 					from + combined_after_bytes,
 					from_byte + combined_after_bytes);
-      record_delete (from, deletion);
+
+      if (! EQ (current_buffer->undo_list, Qt))
+	record_delete (from, deletion);
     }
 
   if (combined_before_bytes)
     {
-      deletion = make_buffer_string_both (from - 1, CHAR_TO_BYTE (from - 1),
-					  from, from_byte, 1);
+      Lisp_Object deletion;
+      deletion = Qnil;
+
+      if (! EQ (current_buffer->undo_list, Qt))
+	deletion = make_buffer_string_both (from - 1, CHAR_TO_BYTE (from - 1),
+					    from, from_byte, 1);
       adjust_markers_for_record_delete (from - 1, CHAR_TO_BYTE (from - 1),
 					from, from_byte);
-      record_delete (from - 1, deletion);
+      if (! EQ (current_buffer->undo_list, Qt))
+	record_delete (from - 1, deletion);
     }
 
   /* Update various buffer positions for the new text.  */
@@ -1624,7 +1669,6 @@
   int adjusted_inschars;
   INTERVAL intervals;
   int outgoing_insbytes = insbytes;
-  Lisp_Object deletion;
 
   CHECK_MARKERS ();
 
@@ -1676,16 +1720,23 @@
   if (to < GPT)
     gap_left (to, to_byte, 0);
 
-  deletion = make_buffer_string_both (from, from_byte, to, to_byte, 1);
-
-  if (nomarkers)
-    /* Relocate all markers pointing into the new, larger gap
-       to point at the end of the text before the gap.
-       Do this before recording the deletion,
-       so that undo handles this after reinserting the text.  */
-    adjust_markers_for_delete (from, from_byte, to, to_byte);
-
-  record_delete (from, deletion);
+  {
+    Lisp_Object deletion;
+    deletion = Qnil;
+
+    if (! EQ (current_buffer->undo_list, Qt))
+      deletion = make_buffer_string_both (from, from_byte, to, to_byte, 1);
+
+    if (nomarkers)
+      /* Relocate all markers pointing into the new, larger gap
+	 to point at the end of the text before the gap.
+	 Do this before recording the deletion,
+	 so that undo handles this after reinserting the text.  */
+      adjust_markers_for_delete (from, from_byte, to, to_byte);
+
+    if (! EQ (current_buffer->undo_list, Qt))
+      record_delete (from, deletion);
+  }
 
   GAP_SIZE += nbytes_del;
   ZV -= nchars_del;
@@ -1733,23 +1784,33 @@
 
   if (combined_after_bytes)
     {
-      deletion = make_buffer_string_both (PT, PT_BYTE,
-					  PT + combined_after_bytes,
-					  PT_BYTE + combined_after_bytes, 1);
+      Lisp_Object deletion;
+      deletion = Qnil;
+
+      if (! EQ (current_buffer->undo_list, Qt))
+	deletion = make_buffer_string_both (PT, PT_BYTE,
+					    PT + combined_after_bytes,
+					    PT_BYTE + combined_after_bytes, 1);
 
       adjust_markers_for_record_delete (PT, PT_BYTE,
 					PT + combined_after_bytes,
 					PT_BYTE + combined_after_bytes);
-      record_delete (PT, deletion);
+      if (! EQ (current_buffer->undo_list, Qt))
+	record_delete (PT, deletion);
     }
 
   if (combined_before_bytes)
     {
-      deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1),
-					  PT, PT_BYTE, 1);
+      Lisp_Object deletion;
+      deletion = Qnil;
+
+      if (! EQ (current_buffer->undo_list, Qt))
+	deletion = make_buffer_string_both (PT - 1, CHAR_TO_BYTE (PT - 1),
+					    PT, PT_BYTE, 1);
       adjust_markers_for_record_delete (PT - 1, CHAR_TO_BYTE (PT - 1),
 					PT, PT_BYTE);
-      record_delete (PT - 1, deletion);
+      if (! EQ (current_buffer->undo_list, Qt))
+	record_delete (PT - 1, deletion);
     }
 
   record_insert (PT - !!combined_before_bytes,
@@ -1966,11 +2027,12 @@
   else
     from_byte_1 = from_byte;
 
-  deletion
-    = make_buffer_string_both (from - !!combined_after_bytes,
-			       from_byte_1,
-			       to + combined_after_bytes,
-			       to_byte + combined_after_bytes, 1);
+  if (! EQ (current_buffer->undo_list, Qt))
+    deletion
+      = make_buffer_string_both (from - !!combined_after_bytes,
+				 from_byte_1,
+				 to + combined_after_bytes,
+				 to_byte + combined_after_bytes, 1);
   if (combined_after_bytes)
     /* COMBINED_AFTER_BYTES nonzero means that the above code moved
        the gap.  We must move the gap again to a proper place.  */
@@ -1997,7 +2059,8 @@
       adjust_markers_for_record_delete (from - 1, from_byte_1,
 					from, from_byte);
     }
-  record_delete (from - !!combined_after_bytes, deletion);
+  if (! EQ (current_buffer->undo_list, Qt))
+    record_delete (from - !!combined_after_bytes, deletion);
   MODIFF++;
 
   /* Relocate point as if it were a marker.  */