/* Code for doing intervals.
- Copyright (C) 1993, 1994, 1995, 1997, 1998, 2002, 2003, 2004,
- 2005 Free Software Foundation, Inc.
+ Copyright (C) 1993, 1994, 1995, 1997, 1998, 2001, 2002, 2003, 2004,
+ 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
while (CONSP (o))
{
sym = XCAR (o);
- val = Fmemq (sym, target->plist);
+ o = XCDR (o);
+ CHECK_CONS (o);
+
+ val = target->plist;
+ while (CONSP (val) && !EQ (XCAR (val), sym))
+ {
+ val = XCDR (val);
+ if (!CONSP (val))
+ break;
+ val = XCDR (val);
+ }
if (NILP (val))
{
- o = XCDR (o);
- CHECK_CONS (o);
val = XCAR (o);
target->plist = Fcons (sym, Fcons (val, target->plist));
- o = XCDR (o);
}
- else
- o = Fcdr (XCDR (o));
+ o = XCDR (o);
}
}
intervals_equal (i0, i1)
INTERVAL i0, i1;
{
- register Lisp_Object i0_cdr, i0_sym, i1_val;
- register int i1_len;
+ register Lisp_Object i0_cdr, i0_sym;
+ register Lisp_Object i1_cdr, i1_val;
if (DEFAULT_INTERVAL_P (i0) && DEFAULT_INTERVAL_P (i1))
return 1;
if (DEFAULT_INTERVAL_P (i0) || DEFAULT_INTERVAL_P (i1))
return 0;
- i1_len = XFASTINT (Flength (i1->plist));
- if (i1_len & 0x1) /* Paranoia -- plists are always even */
- abort ();
- i1_len /= 2;
i0_cdr = i0->plist;
- while (CONSP (i0_cdr))
+ i1_cdr = i1->plist;
+ while (CONSP (i0_cdr) && CONSP (i1_cdr))
{
- /* Lengths of the two plists were unequal. */
- if (i1_len == 0)
- return 0;
-
i0_sym = XCAR (i0_cdr);
- i1_val = Fmemq (i0_sym, i1->plist);
+ i0_cdr = XCDR (i0_cdr);
+ if (!CONSP (i0_cdr))
+ return 0; /* abort (); */
+ i1_val = i1->plist;
+ while (CONSP (i1_val) && !EQ (XCAR (i1_val), i0_sym))
+ {
+ i1_val = XCDR (i1_val);
+ if (!CONSP (i1_val))
+ return 0; /* abort (); */
+ i1_val = XCDR (i1_val);
+ }
/* i0 has something i1 doesn't. */
if (EQ (i1_val, Qnil))
return 0;
/* i0 and i1 both have sym, but it has different values in each. */
- i0_cdr = XCDR (i0_cdr);
- CHECK_CONS (i0_cdr);
- if (!EQ (Fcar (Fcdr (i1_val)), XCAR (i0_cdr)))
+ if (!CONSP (i1_val)
+ || (i1_val = XCDR (i1_val), !CONSP (i1_val))
+ || !EQ (XCAR (i1_val), XCAR (i0_cdr)))
return 0;
i0_cdr = XCDR (i0_cdr);
- i1_len--;
- }
- /* Lengths of the two plists were unequal. */
- if (i1_len > 0)
- return 0;
+ i1_cdr = XCDR (i1_cdr);
+ if (!CONSP (i1_cdr))
+ return 0; /* abort (); */
+ i1_cdr = XCDR (i1_cdr);
+ }
- return 1;
+ /* Lengths of the two plists were equal. */
+ return (NILP (i0_cdr) && NILP (i1_cdr));
}
\f
/* Since the left child is longer, there must be one. */
new_diff = i->total_length - i->left->total_length
+ RIGHT_TOTAL_LENGTH (i->left) - LEFT_TOTAL_LENGTH (i->left);
- if (abs (new_diff) >= old_diff)
+ if (eabs (new_diff) >= old_diff)
break;
i = rotate_right (i);
balance_an_interval (i->right);
/* Since the right child is longer, there must be one. */
new_diff = i->total_length - i->right->total_length
+ LEFT_TOTAL_LENGTH (i->right) - RIGHT_TOTAL_LENGTH (i->right);
- if (abs (new_diff) >= -old_diff)
+ if (eabs (new_diff) >= -old_diff)
break;
i = rotate_left (i);
balance_an_interval (i->left);
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;
temp_set_point_both (buffer, charpos, bytepos);
- /* We run point-left and point-entered hooks here, iff the
+ /* We run point-left and point-entered hooks here, if the
two intervals are not equivalent. These hooks take
(old_point, new_point) as arguments. */
if (NILP (Vinhibit_point_motion_hooks)
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
/* 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)
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
temp = CHAR_TO_BYTE (left_end);
/* If LEFT_END_BYTE is in the middle of a character,
- adjust it and LEFT_END to a char boundary. */
+ adjust it and LEFT_END to a char boundary. */
if (left_end_byte > temp)
{
left_end_byte = temp;
right_start = BYTE_TO_CHAR (right_start_byte);
/* If RIGHT_START_BYTE is in the middle of a character,
- adjust it and RIGHT_START to a char boundary. */
+ adjust it and RIGHT_START to a char boundary. */
temp = CHAR_TO_BYTE (right_start);
if (right_start_byte < temp)