/* Code for doing intervals.
- Copyright (C) 1993-1995, 1997-1998, 2001-2012 Free Software Foundation, Inc.
+ Copyright (C) 1993-1995, 1997-1998, 2001-2013 Free Software
+ Foundation, Inc.
This file is part of GNU Emacs.
#include <config.h>
-#define INTERVALS_INLINE EXTERN_INLINE
-
-#include <setjmp.h>
#include <intprops.h>
#include "lisp.h"
#include "intervals.h"
/* Use these functions to set Lisp_Object
or pointer slots of struct interval. */
-static inline void
+static void
set_interval_object (INTERVAL i, Lisp_Object obj)
{
eassert (BUFFERP (obj) || STRINGP (obj));
i->up.obj = obj;
}
-static inline void
+static void
set_interval_left (INTERVAL i, INTERVAL left)
{
i->left = left;
}
-static inline void
+static void
set_interval_right (INTERVAL i, INTERVAL right)
{
i->right = right;
/* Make the parent of D be whatever the parent of S is, regardless
of the type. This is used when balancing an interval tree. */
-static inline void
+static void
copy_interval_parent (INTERVAL d, INTERVAL s)
{
d->up = s->up;
{
new->total_length = (BUF_Z (XBUFFER (parent))
- BUF_BEG (XBUFFER (parent)));
- eassert (0 <= TOTAL_LENGTH (new));
+ eassert (TOTAL_LENGTH (new) >= 0);
set_buffer_intervals (XBUFFER (parent), new);
new->position = BEG;
}
else if (STRINGP (parent))
{
new->total_length = SCHARS (parent);
- eassert (0 <= TOTAL_LENGTH (new));
+ eassert (TOTAL_LENGTH (new) >= 0);
set_string_intervals (parent, new);
new->position = 0;
}
i0_sym = XCAR (i0_cdr);
i0_cdr = XCDR (i0_cdr);
if (!CONSP (i0_cdr))
- return 0; /* abort (); */
+ return 0;
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 (); */
+ return 0;
i1_val = XCDR (i1_val);
}
i1_cdr = XCDR (i1_cdr);
if (!CONSP (i1_cdr))
- return 0; /* abort (); */
+ return 0;
i1_cdr = XCDR (i1_cdr);
}
c c
*/
-static inline INTERVAL
+static INTERVAL
rotate_right (INTERVAL interval)
{
INTERVAL i;
/* A's total length is decreased by the length of B and its left child. */
interval->total_length -= B->total_length - LEFT_TOTAL_LENGTH (interval);
- eassert (0 <= TOTAL_LENGTH (interval));
+ eassert (TOTAL_LENGTH (interval) >= 0);
/* B must have the same total length of A. */
B->total_length = old_total;
- eassert (0 <= TOTAL_LENGTH (B));
+ eassert (TOTAL_LENGTH (B) >= 0);
return B;
}
c c
*/
-static inline INTERVAL
+static INTERVAL
rotate_left (INTERVAL interval)
{
INTERVAL i;
/* A's total length is decreased by the length of B and its right child. */
interval->total_length -= B->total_length - RIGHT_TOTAL_LENGTH (interval);
- eassert (0 <= TOTAL_LENGTH (interval));
+ eassert (TOTAL_LENGTH (interval) >= 0);
/* B must have the same total length of A. */
B->total_length = old_total;
- eassert (0 <= TOTAL_LENGTH (B));
+ eassert (TOTAL_LENGTH (B) >= 0);
return B;
}
/* Balance INTERVAL, potentially stuffing it back into its parent
Lisp Object. */
-static inline INTERVAL
+static INTERVAL
balance_possible_root_interval (INTERVAL interval)
{
Lisp_Object parent;
{
set_interval_right (interval, new);
new->total_length = new_length;
- eassert (0 <= TOTAL_LENGTH (new));
+ eassert (TOTAL_LENGTH (new) >= 0);
}
else
{
set_interval_parent (interval->right, new);
set_interval_right (interval, new);
new->total_length = new_length + new->right->total_length;
- eassert (0 <= TOTAL_LENGTH (new));
+ eassert (TOTAL_LENGTH (new) >= 0);
balance_an_interval (new);
}
{
set_interval_left (interval, new);
new->total_length = new_length;
- eassert (0 <= TOTAL_LENGTH (new));
+ eassert (TOTAL_LENGTH (new) >= 0);
}
else
{
set_interval_parent (new->left, new);
set_interval_left (interval, new);
new->total_length = new_length + new->left->total_length;
- eassert (0 <= TOTAL_LENGTH (new));
+ eassert (TOTAL_LENGTH (new) >= 0);
balance_an_interval (new);
}
eassert (relative_position <= TOTAL_LENGTH (tree));
- if (!handling_signal)
- tree = balance_possible_root_interval (tree);
+ tree = balance_possible_root_interval (tree);
while (1)
{
for (temp = prev ? prev : i; temp; temp = INTERVAL_PARENT_OR_NULL (temp))
{
temp->total_length += length;
- eassert (0 <= TOTAL_LENGTH (temp));
+ eassert (TOTAL_LENGTH (temp) >= 0);
temp = balance_possible_root_interval (temp);
}
for (temp = i; temp; temp = INTERVAL_PARENT_OR_NULL (temp))
{
temp->total_length += length;
- eassert (0 <= TOTAL_LENGTH (temp));
+ eassert (TOTAL_LENGTH (temp) >= 0);
temp = balance_possible_root_interval (temp);
}
}
this = this->left;
this->total_length += migrate_amt;
}
- eassert (0 <= TOTAL_LENGTH (this));
+ eassert (TOTAL_LENGTH (this) >= 0);
set_interval_left (this, migrate);
set_interval_parent (migrate, this);
else if (STRINGP (owner))
set_string_intervals (owner, parent);
else
- abort ();
+ emacs_abort ();
return;
}
relative_position,
amount);
tree->total_length -= subtract;
- eassert (0 <= TOTAL_LENGTH (tree));
+ eassert (TOTAL_LENGTH (tree) >= 0);
return subtract;
}
/* Right branch. */
relative_position,
amount);
tree->total_length -= subtract;
- eassert (0 <= TOTAL_LENGTH (tree));
+ eassert (TOTAL_LENGTH (tree) >= 0);
return subtract;
}
/* Here -- this node. */
amount = my_amount;
tree->total_length -= amount;
- eassert (0 <= TOTAL_LENGTH (tree));
+ eassert (TOTAL_LENGTH (tree) >= 0);
if (LENGTH (tree) == 0)
delete_interval (tree);
if (ONLY_INTERVAL_P (tree))
{
tree->total_length -= length;
- eassert (0 <= TOTAL_LENGTH (tree));
+ eassert (TOTAL_LENGTH (tree) >= 0);
return;
}
adjust_intervals_for_insertion (buffer_intervals (buffer),
start, length);
else
- {
- IF_LINT (if (length < - TYPE_MAXIMUM (ptrdiff_t)) abort ();)
- adjust_intervals_for_deletion (buffer, start, -length);
- }
+ adjust_intervals_for_deletion (buffer, start, -length);
}
\f
/* Merge interval I with its lexicographic successor. The resulting
while (! NULL_LEFT_CHILD (successor))
{
successor->total_length += absorb;
- eassert (0 <= TOTAL_LENGTH (successor));
+ eassert (TOTAL_LENGTH (successor) >= 0);
successor = successor->left;
}
successor->total_length += absorb;
- eassert (0 <= TOTAL_LENGTH (successor));
+ eassert (TOTAL_LENGTH (successor) >= 0);
delete_interval (i);
return successor;
}
/* Zero out this interval. */
i->total_length -= absorb;
- eassert (0 <= TOTAL_LENGTH (i));
+ eassert (TOTAL_LENGTH (i) >= 0);
successor = i;
while (! NULL_PARENT (successor)) /* It's above us. Subtract as
successor = INTERVAL_PARENT (successor);
successor->total_length -= absorb;
- eassert (0 <= TOTAL_LENGTH (successor));
+ eassert (TOTAL_LENGTH (successor) >= 0);
}
/* This must be the rightmost or last interval and cannot
be merged right. The caller should have known. */
- abort ();
+ emacs_abort ();
}
\f
/* Merge interval I with its lexicographic predecessor. The resulting
while (! NULL_RIGHT_CHILD (predecessor))
{
predecessor->total_length += absorb;
- eassert (0 <= TOTAL_LENGTH (predecessor));
+ eassert (TOTAL_LENGTH (predecessor) >= 0);
predecessor = predecessor->right;
}
predecessor->total_length += absorb;
- eassert (0 <= TOTAL_LENGTH (predecessor));
+ eassert (TOTAL_LENGTH (predecessor) >= 0);
delete_interval (i);
return predecessor;
}
/* Zero out this interval. */
i->total_length -= absorb;
- eassert (0 <= TOTAL_LENGTH (i));
+ eassert (TOTAL_LENGTH (i) >= 0);
predecessor = i;
while (! NULL_PARENT (predecessor)) /* It's above us. Go up,
predecessor = INTERVAL_PARENT (predecessor);
predecessor->total_length -= absorb;
- eassert (0 <= TOTAL_LENGTH (predecessor));
+ eassert (TOTAL_LENGTH (predecessor) >= 0);
}
/* This must be the leftmost or first interval and cannot
be merged left. The caller should have known. */
- abort ();
+ emacs_abort ();
}
\f
/* Create a copy of SOURCE but with the default value of UP. */
XSETBUFFER (buf, buffer);
set_text_properties_1 (make_number (position),
make_number (position + length),
- Qnil, buf, 0);
+ Qnil, buf,
+ find_interval (tree, position));
}
/* Shouldn't be necessary. --Stef */
buffer_balance_intervals (buffer);
ptrdiff_t charpos, ptrdiff_t bytepos)
{
/* In a single-byte buffer, the two positions must be equal. */
- if (BUF_ZV (buffer) == BUF_ZV_BYTE (buffer))
- eassert (charpos == bytepos);
+ eassert (BUF_ZV (buffer) != BUF_ZV_BYTE (buffer) || charpos == bytepos);
eassert (charpos <= bytepos);
eassert (charpos <= BUF_ZV (buffer) || BUF_BEGV (buffer) <= charpos);
set_point_both (charpos, buf_charpos_to_bytepos (current_buffer, charpos));
}
+/* Set PT from MARKER's clipped position. */
+
+void
+set_point_from_marker (Lisp_Object marker)
+{
+ if (XMARKER (marker)->buffer != current_buffer)
+ signal_error ("Marker points into wrong buffer", marker);
+ set_point_both
+ (clip_to_bounds (BEGV, marker_position (marker), ZV),
+ clip_to_bounds (BEGV_BYTE, marker_byte_position (marker), ZV_BYTE));
+}
+
/* If there's an invisible character at position POS + TEST_OFFS in the
current buffer, and the invisible property has a `stickiness' such that
inserting a character at position POS would inherit the property it,
else if (STRINGP (object))
i = find_interval (string_intervals (object), pos);
else
- abort ();
+ emacs_abort ();
if (!i || (i->position + LENGTH (i) <= pos))
return 0;
/* 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.
-
- POSITION must be in the accessible part of BUFFER. */
+ `local-map' use BUFFER's local map. */
Lisp_Object
-get_local_map (register ptrdiff_t position, register struct buffer *buffer,
- Lisp_Object type)
+get_local_map (ptrdiff_t position, struct buffer *buffer, Lisp_Object type)
{
Lisp_Object prop, lispy_position, lispy_buffer;
ptrdiff_t old_begv, old_zv, old_begv_byte, old_zv_byte;
- /* Perhaps we should just change `position' to the limit. */
- if (position > BUF_ZV (buffer) || position < BUF_BEGV (buffer))
- abort ();
+ position = clip_to_bounds (BUF_BEGV (buffer), position, BUF_ZV (buffer));
/* Ignore narrowing, so that a local map continues to be valid even if
the visible region contains no characters and hence no properties. */
new->position = 0;
got = (LENGTH (i) - (start - i->position));
new->total_length = length;
- eassert (0 <= TOTAL_LENGTH (new));
+ eassert (TOTAL_LENGTH (new) >= 0);
copy_properties (i, new);
t = new;
i->total_length = end - start;
else
i->total_length = end_byte - start_byte;
- eassert (0 <= TOTAL_LENGTH (i));
+ eassert (TOTAL_LENGTH (i) >= 0);
if (TOTAL_LENGTH (i) == 0)
{