]> code.delx.au - gnu-emacs/blobdiff - src/intervals.c
(compilation-directory-matcher): Doc fix (Nil -> nil).
[gnu-emacs] / src / intervals.c
index 33ef9a3417740701322f05f05cedfd3205604535..20c4c191a9319d4444f56af728c97b288f0db61a 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
@@ -2015,6 +2016,10 @@ set_point_both (buffer, charpos, bytepos)
   register INTERVAL to, from, toprev, fromprev;
   int buffer_point;
   int old_position = BUF_PT (buffer);
+  /* This ensures that we move forward past intangible text when the
+     initial position is the same as the destination, in the rare
+     instances where this is important, e.g. in line-move-finish
+     (simple.el).  */
   int backwards = (charpos < old_position ? 1 : 0);
   int have_overlays;
   int original_position;
@@ -2195,36 +2200,38 @@ set_point_both (buffer, charpos, bytepos)
       Lisp_Object leave_after, leave_before, enter_after, enter_before;
 
       if (fromprev)
-       leave_after = textget (fromprev->plist, Qpoint_left);
+       leave_before = textget (fromprev->plist, Qpoint_left);
       else
-       leave_after = Qnil;
+       leave_before = Qnil;
+
       if (from)
-       leave_before = textget (from->plist, Qpoint_left);
+       leave_after = textget (from->plist, Qpoint_left);
       else
-       leave_before = Qnil;
+       leave_after = Qnil;
 
       if (toprev)
-       enter_after = textget (toprev->plist, Qpoint_entered);
+       enter_before = textget (toprev->plist, Qpoint_entered);
       else
-       enter_after = Qnil;
+       enter_before = Qnil;
+
       if (to)
-       enter_before = textget (to->plist, Qpoint_entered);
+       enter_after = textget (to->plist, Qpoint_entered);
       else
-       enter_before = Qnil;
+       enter_after = Qnil;
 
       if (! EQ (leave_before, enter_before) && !NILP (leave_before))
-       call2 (leave_before, make_number (old_position),
-              make_number (charpos));
+       call2 (leave_before, make_number (old_position),
+              make_number (charpos));
       if (! EQ (leave_after, enter_after) && !NILP (leave_after))
-       call2 (leave_after, make_number (old_position),
-              make_number (charpos));
+       call2 (leave_after, make_number (old_position),
+              make_number (charpos));
 
       if (! EQ (enter_before, leave_before) && !NILP (enter_before))
-       call2 (enter_before, make_number (old_position),
-              make_number (charpos));
+       call2 (enter_before, make_number (old_position),
+              make_number (charpos));
       if (! EQ (enter_after, leave_after) && !NILP (enter_after))
-       call2 (enter_after, make_number (old_position),
-              make_number (charpos));
+       call2 (enter_after, make_number (old_position),
+              make_number (charpos));
     }
 }
 \f
@@ -2275,6 +2282,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
@@ -2334,7 +2345,9 @@ get_property_and_range (pos, prop, val, start, end, object)
 /* Return the proper local keymap TYPE for position POSITION in
    BUFFER; TYPE should be one of `keymap' or `local-map'.  Use the map
    specified by the PROP property, if any.  Otherwise, if TYPE is
-   `local-map' use BUFFER's local map.  */
+   `local-map' use BUFFER's local map.
+
+   POSITION must be in the accessible part of BUFFER.  */
 
 Lisp_Object
 get_local_map (position, buffer, type)
@@ -2346,7 +2359,7 @@ get_local_map (position, buffer, type)
   int old_begv, old_zv, old_begv_byte, old_zv_byte;
 
   /* Perhaps we should just change `position' to the limit.  */
-  if (position > BUF_Z (buffer) || position < BUF_BEG (buffer))
+  if (position > BUF_ZV (buffer) || position < BUF_BEGV (buffer))
     abort ();
 
   /* Ignore narrowing, so that a local map continues to be valid even if