/* 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.
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:
/* 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
{
register INTERVAL under, over, this, prev;
register INTERVAL tree;
+ int over_used;
tree = BUF_INTERVALS (buffer);
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? */
{
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;
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)))
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;
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
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) */