Checked TUTORIAL.cn.
[bpt/emacs.git] / src / intervals.h
CommitLineData
90ba40fc 1/* Definitions and global variables for intervals.
ab422c4d 2 Copyright (C) 1993-1994, 2000-2013 Free Software Foundation, Inc.
90ba40fc
JA
3
4This file is part of GNU Emacs.
5
b9b1cc14 6GNU Emacs is free software: you can redistribute it and/or modify
90ba40fc 7it under the terms of the GNU General Public License as published by
b9b1cc14
GM
8the Free Software Foundation, either version 3 of the License, or
9(at your option) any later version.
90ba40fc
JA
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
b9b1cc14 17along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
90ba40fc 18
90ba40fc
JA
19#include "dispextern.h"
20
6a3d20cc 21INLINE_HEADER_BEGIN
42b3a444
DA
22#ifndef INTERVALS_INLINE
23# define INTERVALS_INLINE INLINE
24#endif
6a3d20cc 25
4a6a76d9
SM
26/* Basic data type for use of intervals. */
27
28struct interval
29{
30 /* The first group of entries deal with the tree structure. */
31
d311d28c
PE
32 ptrdiff_t total_length; /* Length of myself and both children. */
33 ptrdiff_t position; /* Cache of interval's character position. */
4a6a76d9
SM
34 /* This field is usually updated
35 simultaneously with an interval
36 traversal, there is no guarantee
37 that it is valid for a random
38 interval. */
39 struct interval *left; /* Intervals which precede me. */
40 struct interval *right; /* Intervals which succeed me. */
41
42 /* Parent in the tree, or the Lisp_Object containing this interval tree. */
43 union
44 {
45 struct interval *interval;
46 Lisp_Object obj;
47 } up;
48 unsigned int up_obj : 1;
49
50 unsigned gcmarkbit : 1;
51
52 /* The remaining components are `properties' of the interval.
53 The first four are duplicates for things which can be on the list,
54 for purposes of speed. */
55
56 unsigned int write_protect : 1; /* Non-zero means can't modify. */
57 unsigned int visible : 1; /* Zero means don't display. */
58 unsigned int front_sticky : 1; /* Non-zero means text inserted just
59 before this interval goes into it. */
60 unsigned int rear_sticky : 1; /* Likewise for just after it. */
cce7fefc 61 Lisp_Object plist; /* Other properties. */
4a6a76d9
SM
62};
63
b50a28de 64/* These are macros for dealing with the interval tree. */
90ba40fc 65
b50a28de 66/* True if this interval has no right child. */
77c7bcb1 67#define NULL_RIGHT_CHILD(i) ((i)->right == NULL)
90ba40fc 68
b50a28de 69/* True if this interval has no left child. */
77c7bcb1 70#define NULL_LEFT_CHILD(i) ((i)->left == NULL)
90ba40fc 71
b50a28de 72/* True if this interval has no parent. */
e0b8c689 73#define NULL_PARENT(i) ((i)->up_obj || (i)->up.interval == 0)
90ba40fc 74
b50a28de 75/* True if this interval is the left child of some other interval. */
77c7bcb1
DA
76#define AM_LEFT_CHILD(i) \
77 (! NULL_PARENT (i) && INTERVAL_PARENT (i)->left == (i))
90ba40fc 78
b50a28de 79/* True if this interval is the right child of some other interval. */
77c7bcb1
DA
80#define AM_RIGHT_CHILD(i) \
81 (! NULL_PARENT (i) && INTERVAL_PARENT (i)->right == (i))
90ba40fc 82
b50a28de 83/* True if this interval has no children. */
77c7bcb1 84#define LEAF_INTERVAL_P(i) ((i)->left == NULL && (i)->right == NULL)
90ba40fc 85
b50a28de 86/* True if this interval has no parent and is therefore the root. */
90ba40fc
JA
87#define ROOT_INTERVAL_P(i) (NULL_PARENT (i))
88
b50a28de 89/* True if this interval is the only interval in the interval tree. */
7ac78c9a 90#define ONLY_INTERVAL_P(i) (ROOT_INTERVAL_P ((i)) && LEAF_INTERVAL_P ((i)))
90ba40fc 91
b50a28de 92/* True if this interval has both left and right children. */
77c7bcb1 93#define BOTH_KIDS_P(i) ((i)->left != NULL && (i)->right != NULL)
90ba40fc
JA
94
95/* The total size of all text represented by this interval and all its
b50a28de 96 children in the tree. This is zero if the interval is null. */
77c7bcb1 97#define TOTAL_LENGTH(i) ((i) == NULL ? 0 : (i)->total_length)
90ba40fc 98
b50a28de 99/* The size of text represented by this interval alone. */
77c7bcb1
DA
100#define LENGTH(i) ((i) == NULL ? 0 : (TOTAL_LENGTH ((i)) \
101 - TOTAL_LENGTH ((i)->right) \
102 - TOTAL_LENGTH ((i)->left)))
90ba40fc 103
3fc86d4b 104/* The position of the character just past the end of I. Note that
b50a28de 105 the position cache i->position must be valid for this to work. */
3fc86d4b 106#define INTERVAL_LAST_POS(i) ((i)->position + LENGTH ((i)))
90ba40fc 107
b50a28de 108/* The total size of the left subtree of this interval. */
90ba40fc
JA
109#define LEFT_TOTAL_LENGTH(i) ((i)->left ? (i)->left->total_length : 0)
110
b50a28de 111/* The total size of the right subtree of this interval. */
90ba40fc
JA
112#define RIGHT_TOTAL_LENGTH(i) ((i)->right ? (i)->right->total_length : 0)
113
b50a28de 114/* These macros are for dealing with the interval properties. */
90ba40fc
JA
115
116/* True if this is a default interval, which is the same as being null
b50a28de 117 or having no properties. */
77c7bcb1 118#define DEFAULT_INTERVAL_P(i) (!i || EQ ((i)->plist, Qnil))
90ba40fc 119
439d5cb4 120/* Test what type of parent we have. Three possibilities: another
77c7bcb1 121 interval, a buffer or string object, or NULL. */
e0b8c689
KR
122#define INTERVAL_HAS_PARENT(i) ((i)->up_obj == 0 && (i)->up.interval != 0)
123#define INTERVAL_HAS_OBJECT(i) ((i)->up_obj)
439d5cb4 124
6a3d20cc 125/* Use these macros to get parent of an interval.
439d5cb4
KR
126
127 The choice of macros is dependent on the type needed. Don't add
128 casts to get around this, it will break some development work in
129 progress. */
6a3d20cc
DA
130
131#define INTERVAL_PARENT(i) \
132 (eassert ((i) != 0 && (i)->up_obj == 0), (i)->up.interval)
133
134#define GET_INTERVAL_OBJECT(d,s) (eassert ((s)->up_obj == 1), (d) = (s)->up.obj)
135
136/* Use these functions to set Lisp_Object
137 or pointer slots of struct interval. */
138
42b3a444 139INTERVALS_INLINE void
0c94c8d6 140set_interval_parent (INTERVAL i, INTERVAL parent)
6a3d20cc
DA
141{
142 i->up_obj = 0;
143 i->up.interval = parent;
144}
145
42b3a444 146INTERVALS_INLINE void
0c94c8d6 147set_interval_plist (INTERVAL i, Lisp_Object plist)
6a3d20cc
DA
148{
149 i->plist = plist;
6a3d20cc 150}
439d5cb4
KR
151
152/* Get the parent interval, if any, otherwise a null pointer. Useful
153 for walking up to the root in a "for" loop; use this to get the
77c7bcb1 154 "next" value, and test the result to see if it's NULL. */
4a6a76d9
SM
155#define INTERVAL_PARENT_OR_NULL(i) \
156 (INTERVAL_HAS_PARENT (i) ? INTERVAL_PARENT (i) : 0)
439d5cb4 157
b50a28de 158/* Reset this interval to its vanilla, or no-property state. */
6a3d20cc
DA
159#define RESET_INTERVAL(i) \
160{ \
161 (i)->total_length = (i)->position = 0; \
77c7bcb1 162 (i)->left = (i)->right = NULL; \
0c94c8d6 163 set_interval_parent (i, NULL); \
6a3d20cc
DA
164 (i)->write_protect = 0; \
165 (i)->visible = 0; \
166 (i)->front_sticky = (i)->rear_sticky = 0; \
0c94c8d6 167 set_interval_plist (i, Qnil); \
7ac78c9a 168}
90ba40fc 169
b50a28de 170/* Copy the cached property values of interval FROM to interval TO. */
6a3d20cc
DA
171#define COPY_INTERVAL_CACHE(from,to) \
172{ \
173 (to)->write_protect = (from)->write_protect; \
174 (to)->visible = (from)->visible; \
175 (to)->front_sticky = (from)->front_sticky; \
176 (to)->rear_sticky = (from)->rear_sticky; \
90ba40fc
JA
177}
178
b50a28de 179/* Copy only the set bits of FROM's cache. */
6a3d20cc
DA
180#define MERGE_INTERVAL_CACHE(from,to) \
181{ \
90ba40fc 182 if ((from)->write_protect) (to)->write_protect = 1; \
6a3d20cc 183 if ((from)->visible) (to)->visible = 1; \
90ba40fc
JA
184 if ((from)->front_sticky) (to)->front_sticky = 1; \
185 if ((from)->rear_sticky) (to)->rear_sticky = 1; \
186}
187
b50a28de 188/* Is this interval visible? Replace later with cache access. */
90ba40fc 189#define INTERVAL_VISIBLE_P(i) \
77c7bcb1 190 (i && NILP (textget ((i)->plist, Qinvisible)))
90ba40fc 191
b50a28de 192/* Is this interval writable? Replace later with cache access. */
5f8a398a 193#define INTERVAL_WRITABLE_P(i) \
77c7bcb1
DA
194 (i && (NILP (textget ((i)->plist, Qread_only)) \
195 || ((CONSP (Vinhibit_read_only) \
196 ? !NILP (Fmemq (textget ((i)->plist, Qread_only), \
197 Vinhibit_read_only)) \
198 : !NILP (Vinhibit_read_only))))) \
90ba40fc
JA
199
200/* Macros to tell whether insertions before or after this interval
77c7bcb1
DA
201 should stick to it. Now we have Vtext_property_default_nonsticky,
202 so these macros are unreliable now and never used. */
203
204#if 0
205#define FRONT_STICKY_P(i) \
206 (i && ! NILP (textget ((i)->plist, Qfront_sticky)))
207#define END_NONSTICKY_P(i) \
208 (i && ! NILP (textget ((i)->plist, Qrear_nonsticky)))
209#define FRONT_NONSTICKY_P(i) \
210 (i && ! EQ (Qt, textget ((i)->plist, Qfront_sticky)))
211#endif
90ba40fc 212
47b4c04d 213/* If PROP is the `invisible' property of a character,
99776d43
SM
214 this is 1 if the character should be treated as invisible,
215 and 2 if it is invisible but with an ellipsis. */
47b4c04d 216
77c7bcb1 217#define TEXT_PROP_MEANS_INVISIBLE(prop) \
4b4deea2 218 (EQ (BVAR (current_buffer, invisibility_spec), Qt) \
77c7bcb1 219 ? !NILP (prop) \
4b4deea2 220 : invisible_p (prop, BVAR (current_buffer, invisibility_spec)))
47b4c04d 221
b50a28de 222/* Declared in alloc.c. */
90ba40fc 223
383e0970 224extern INTERVAL make_interval (void);
90ba40fc 225
b50a28de 226/* Declared in intervals.c. */
90ba40fc 227
383e0970
J
228extern INTERVAL create_root_interval (Lisp_Object);
229extern void copy_properties (INTERVAL, INTERVAL);
a08d4ba7 230extern bool intervals_equal (INTERVAL, INTERVAL);
d311d28c 231extern void traverse_intervals (INTERVAL, ptrdiff_t,
383e0970
J
232 void (*) (INTERVAL, Lisp_Object),
233 Lisp_Object);
234extern void traverse_intervals_noorder (INTERVAL,
235 void (*) (INTERVAL, Lisp_Object),
236 Lisp_Object);
d311d28c
PE
237extern INTERVAL split_interval_right (INTERVAL, ptrdiff_t);
238extern INTERVAL split_interval_left (INTERVAL, ptrdiff_t);
239extern INTERVAL find_interval (INTERVAL, ptrdiff_t);
383e0970
J
240extern INTERVAL next_interval (INTERVAL);
241extern INTERVAL previous_interval (INTERVAL);
242extern INTERVAL merge_interval_left (INTERVAL);
d311d28c
PE
243extern void offset_intervals (struct buffer *, ptrdiff_t, ptrdiff_t);
244extern void graft_intervals_into_buffer (INTERVAL, ptrdiff_t, ptrdiff_t,
a08d4ba7 245 struct buffer *, bool);
d1dfb56c 246extern void verify_interval_modification (struct buffer *,
d311d28c 247 ptrdiff_t, ptrdiff_t);
383e0970 248extern INTERVAL balance_intervals (INTERVAL);
b7982059 249extern void copy_intervals_to_string (Lisp_Object, struct buffer *,
d311d28c
PE
250 ptrdiff_t, ptrdiff_t);
251extern INTERVAL copy_intervals (INTERVAL, ptrdiff_t, ptrdiff_t);
a08d4ba7 252extern bool compare_string_intervals (Lisp_Object, Lisp_Object);
383e0970 253extern Lisp_Object textget (Lisp_Object, Lisp_Object);
a08d4ba7 254extern Lisp_Object lookup_char_property (Lisp_Object, Lisp_Object, bool);
d311d28c 255extern void move_if_not_intangible (ptrdiff_t);
a08d4ba7
PE
256extern bool get_property_and_range (ptrdiff_t, Lisp_Object, Lisp_Object *,
257 ptrdiff_t *, ptrdiff_t *, Lisp_Object);
d311d28c
PE
258extern Lisp_Object get_local_map (ptrdiff_t, struct buffer *, Lisp_Object);
259extern INTERVAL update_interval (INTERVAL, ptrdiff_t);
a08d4ba7 260extern void set_intervals_multibyte (bool);
383e0970 261extern INTERVAL validate_interval_range (Lisp_Object, Lisp_Object *,
81c23309 262 Lisp_Object *, bool);
d311d28c 263extern INTERVAL interval_of (ptrdiff_t, Lisp_Object);
d748a3db 264
b50a28de 265/* Defined in xdisp.c. */
383e0970 266extern int invisible_p (Lisp_Object, Lisp_Object);
90ba40fc 267
b50a28de 268/* Declared in textprop.c. */
90ba40fc 269
b50a28de 270/* Types of hooks. */
90ba40fc
JA
271extern Lisp_Object Qpoint_left;
272extern Lisp_Object Qpoint_entered;
1a7c673b
RS
273extern Lisp_Object Qmodification_hooks;
274extern Lisp_Object Qcategory;
275extern Lisp_Object Qlocal_map;
b4030d7b 276extern Lisp_Object Qkeymap;
90ba40fc 277
b50a28de 278/* Visual properties text (including strings) may have. */
955cbe7b
PE
279extern Lisp_Object Qfont;
280extern Lisp_Object Qinvisible, Qintangible;
90ba40fc 281
b50a28de 282/* Sticky properties. */
58943db0
RS
283extern Lisp_Object Qfront_sticky, Qrear_nonsticky;
284
383e0970
J
285extern Lisp_Object copy_text_properties (Lisp_Object, Lisp_Object,
286 Lisp_Object, Lisp_Object,
287 Lisp_Object, Lisp_Object);
288extern Lisp_Object set_text_properties (Lisp_Object, Lisp_Object,
289 Lisp_Object, Lisp_Object,
290 Lisp_Object);
291extern void set_text_properties_1 (Lisp_Object, Lisp_Object,
292 Lisp_Object, Lisp_Object, INTERVAL);
293
294Lisp_Object text_property_list (Lisp_Object, Lisp_Object, Lisp_Object,
295 Lisp_Object);
ecc0fdd4 296void add_text_properties_from_list (Lisp_Object, Lisp_Object, Lisp_Object);
383e0970
J
297Lisp_Object extend_property_ranges (Lisp_Object, Lisp_Object);
298Lisp_Object get_char_property_and_overlay (Lisp_Object, Lisp_Object,
299 Lisp_Object, Lisp_Object*);
300extern int text_property_stickiness (Lisp_Object prop, Lisp_Object pos,
301 Lisp_Object buffer);
302extern Lisp_Object get_pos_property (Lisp_Object pos, Lisp_Object prop,
303 Lisp_Object object);
304
305extern void syms_of_textprop (void);
a5ecc8a3
KH
306
307#include "composite.h"
6a3d20cc
DA
308
309INLINE_HEADER_END