]> code.delx.au - gnu-emacs/blobdiff - src/intervals.c
(Version, mh-version): Update for release 8.0.
[gnu-emacs] / src / intervals.c
index 9c6a4ef98d48ce62a47043031b7f9e794cd05e31..8bbab5a2a28c20ac014717052919d799453ad865 100644 (file)
@@ -1,5 +1,6 @@
 /* Code for doing intervals.
-   Copyright (C) 1993, 1994, 1995, 1997, 1998, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1994, 1995, 1997, 1998, 2002, 2003, 2004,
+                 2005, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -15,8 +16,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 
 /* NOTES:
@@ -790,14 +791,14 @@ update_interval (i, pos)
          /* Move right. */
          if (pos < INTERVAL_LAST_POS (i) + TOTAL_LENGTH (i->right))
            {
-             i->right->position = INTERVAL_LAST_POS (i) +
-               LEFT_TOTAL_LENGTH (i->right);
+             i->right->position = INTERVAL_LAST_POS (i)
+               LEFT_TOTAL_LENGTH (i->right);
              i = i->right;             /* Move to the right child */
            }
          else if (NULL_PARENT (i))
-           error ("Point after end of properties");
+           error ("Point %d after end of properties", pos);
          else
-             i = INTERVAL_PARENT (i);
+            i = INTERVAL_PARENT (i);
          continue;
        }
       else
@@ -1712,6 +1713,7 @@ graft_intervals_into_buffer (source, position, length, buffer, inherit)
 {
   register INTERVAL under, over, this, prev;
   register INTERVAL tree;
+  int over_used;
 
   tree = BUF_INTERVALS (buffer);
 
@@ -1745,6 +1747,7 @@ graft_intervals_into_buffer (source, position, length, buffer, inherit)
          XSETBUFFER (buf, buffer);
          BUF_INTERVALS (buffer) = reproduce_tree_obj (source, buf);
          BUF_INTERVALS (buffer)->position = BEG;
+         BUF_INTERVALS (buffer)->up_obj = 1;
 
          /* Explicitly free the old tree here?  */
 
@@ -1767,6 +1770,7 @@ graft_intervals_into_buffer (source, position, length, buffer, inherit)
     {
       BUF_INTERVALS (buffer) = reproduce_tree (source, INTERVAL_PARENT (tree));
       BUF_INTERVALS (buffer)->position = BEG;
+      BUF_INTERVALS (buffer)->up_obj = 1;
       /* Explicitly free the old tree here.  */
 
       return;
@@ -1814,21 +1818,42 @@ graft_intervals_into_buffer (source, position, length, buffer, inherit)
      adjust_intervals_for_insertion, so stickiness has
      already been taken care of.  */
 
+  /* OVER is the interval we are copying from next.
+     OVER_USED says how many characters' worth of OVER
+     have already been copied into target intervals.
+     UNDER is the next interval in the target.  */
+  over_used = 0;
   while (! NULL_INTERVAL_P (over))
     {
-      if (LENGTH (over) < LENGTH (under))
+      /* If UNDER is longer than OVER, split it.  */
+      if (LENGTH (over) - over_used < LENGTH (under))
        {
-         this = split_interval_left (under, LENGTH (over));
+         this = split_interval_left (under, LENGTH (over) - over_used);
          copy_properties (under, this);
        }
       else
        this = under;
-      copy_properties (over, this);
+
+      /* THIS is now the interval to copy or merge into.
+        OVER covers all of it.  */
       if (inherit)
        merge_properties (over, this);
       else
        copy_properties (over, this);
-      over = next_interval (over);
+
+      /* If THIS and OVER end at the same place,
+        advance OVER to a new source interval.  */
+      if (LENGTH (this) == LENGTH (over) - over_used)
+       {
+         over = next_interval (over);
+         over_used = 0;
+       }
+      else
+       /* Otherwise just record that more of OVER has been used.  */
+       over_used += LENGTH (this);
+
+      /* Always advance to a new target interval.  */
+      under = next_interval (this);
     }
 
   if (! NULL_INTERVAL_P (BUF_INTERVALS (buffer)))
@@ -1875,11 +1900,13 @@ lookup_char_property (plist, prop, textprop)
     return fallback;
   /* Check for alternative properties */
   tail = Fassq (prop, Vchar_property_alias_alist);
-  if (NILP (tail))
-    return tail;
-  tail = XCDR (tail);
-  for (; NILP (fallback) && CONSP (tail); tail = XCDR (tail))
-    fallback = Fplist_get (plist, XCAR (tail));
+  if (! NILP (tail))
+    {
+      tail = XCDR (tail);
+      for (; NILP (fallback) && CONSP (tail); tail = XCDR (tail))
+       fallback = Fplist_get (plist, XCAR (tail));
+    }
+
   if (textprop && NILP (fallback) && CONSP (Vdefault_text_properties))
     fallback = Fplist_get (Vdefault_text_properties, prop);
   return fallback;
@@ -2249,6 +2276,10 @@ move_if_not_intangible (position)
          pos = Fnext_char_property_change (pos, Qnil);
 
     }
+  else if (position < BEGV)
+    position = BEGV;
+  else if (position > ZV)
+    position = ZV;
 
   /* If the whole stretch between PT and POSITION isn't intangible,
      try moving to POSITION (which means we actually move farther
@@ -2587,3 +2618,6 @@ set_intervals_multibyte (multi_flag)
     set_intervals_multibyte_1 (BUF_INTERVALS (current_buffer), multi_flag,
                               BEG, BEG_BYTE, Z, Z_BYTE);
 }
+
+/* arch-tag: 3d402b60-083c-4271-b4a3-ebd9a74bfe27
+   (do not change this comment) */