changeset 4638:3872f91770fc

(adjust_intervals_for_insertion): If inserting in middle of interval that is sticky in neither direction, don't copy props. (merge_properties_sticky): Handle non-list as front-sticky or rear-nonsticky property.
author Richard M. Stallman <rms@gnu.org>
date Sun, 15 Aug 1993 03:49:28 +0000
parents f3b38883ee2d
children 76f242eb1fa8
files src/intervals.c
diffstat 1 files changed, 23 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/intervals.c	Sun Aug 15 03:39:42 1993 +0000
+++ b/src/intervals.c	Sun Aug 15 03:49:28 1993 +0000
@@ -656,6 +656,18 @@
 
   i = find_interval (tree, position);
 
+  /* If in middle of an interval which is not sticky either way,
+     we must not just give its properties to the insertion.
+     So split this interval at the insertion point.  */
+  if (! (position == i->position || eobp)
+      && END_NONSTICKY_P (i)
+      && ! FRONT_STICKY_P (i))
+    {
+      temp = split_interval_right (i, position - i->position);
+      copy_properties (i, temp);
+      i = temp;
+    }
+
   /* If we are positioned between intervals, check the stickiness of
      both of them.  We have to do this too, if we are at BEG or Z.  */
   if (position == i->position || eobp)
@@ -748,12 +760,13 @@
       if (EQ (sym, Qrear_nonsticky) || EQ (sym, Qfront_sticky))
 	continue;
       
-      if (NILP (Fmemq (sym, lrear)))
+      if (CONSP (lrear) ? NILP (Fmemq (sym, lrear)) : NILP (lrear))
 	{
 	  /* rear-sticky is dominant, we needn't search in PRIGHT.  */
 	  
 	  props = Fcons (sym, Fcons (Fcar (Fcdr (tail1)), props));
-	  if (! NILP (Fmemq (sym, lfront)))
+	  if ((CONSP (lfront) || NILP (lfront))
+	      && ! NILP (Fmemq (sym, lfront)))
 	    front = Fcons (sym, front);
 	}
       else
@@ -763,13 +776,15 @@
 	    if (EQ (sym, Fcar (tail2)))
 	      {
 		
-		if (! NILP (Fmemq (sym, rfront)))
+		if (CONSP (rfront)
+		    ? ! NILP (Fmemq (sym, rfront)) : ! NILP (rfront))
 		  {
 		    /* Nonsticky at the left and sticky at the right,
 		       so take the right one.  */
 		    props = Fcons (sym, Fcons (Fcar (Fcdr (tail2)), props));
 		    front = Fcons (sym, front);
-		    if (! NILP (Fmemq (sym, rrear)))
+		    if ((CONSP (rrear) || NILP (rrear))
+			&& ! NILP (Fmemq (sym, rrear)))
 		      rear = Fcons (sym, rear);
 		  }
 		break;
@@ -786,7 +801,8 @@
 	continue;
 
       /* If it ain't sticky, we don't take it.  */
-      if (NILP (Fmemq (sym, rfront)))
+      if (CONSP (rfront)
+	  ? NILP (Fmemq (sym, rfront)) : NILP (rfront))
 	continue;
       
       /* If sym is in PLEFT we already got it.  */
@@ -798,7 +814,8 @@
 	{
 	  props = Fcons (sym, Fcons (Fcar (Fcdr (tail2)), props));
 	  front = Fcons (sym, front);
-	  if (! NILP (Fmemq (sym, rrear)))
+	  if ((CONSP (rrear) || NILP (rrear))
+	      && ! NILP (Fmemq (sym, rrear)))
 	    rear = Fcons (sym, rear);
 	}
     }