Remove unused declarations
[bpt/emacs.git] / src / intervals.h
CommitLineData
90ba40fc 1/* Definitions and global variables for intervals.
429ab54e 2 Copyright (C) 1993, 1994, 2000, 2001, 2002, 2003, 2004,
114f9c96 3 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
90ba40fc
JA
4
5This file is part of GNU Emacs.
6
b9b1cc14 7GNU Emacs is free software: you can redistribute it and/or modify
90ba40fc 8it under the terms of the GNU General Public License as published by
b9b1cc14
GM
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
90ba40fc
JA
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
b9b1cc14 18along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
90ba40fc 19
90ba40fc
JA
20#include "dispextern.h"
21
439d5cb4 22#define NULL_INTERVAL ((INTERVAL)0)
90ba40fc
JA
23#define INTERVAL_DEFAULT NULL_INTERVAL
24
4a6a76d9
SM
25/* Basic data type for use of intervals. */
26
27struct interval
28{
29 /* The first group of entries deal with the tree structure. */
30
48fb6855
DN
31 EMACS_UINT total_length; /* Length of myself and both children. */
32 EMACS_UINT position; /* Cache of interval's character position. */
4a6a76d9
SM
33 /* This field is usually updated
34 simultaneously with an interval
35 traversal, there is no guarantee
36 that it is valid for a random
37 interval. */
38 struct interval *left; /* Intervals which precede me. */
39 struct interval *right; /* Intervals which succeed me. */
40
41 /* Parent in the tree, or the Lisp_Object containing this interval tree. */
42 union
43 {
44 struct interval *interval;
45 Lisp_Object obj;
46 } up;
47 unsigned int up_obj : 1;
48
49 unsigned gcmarkbit : 1;
50
51 /* The remaining components are `properties' of the interval.
52 The first four are duplicates for things which can be on the list,
53 for purposes of speed. */
54
55 unsigned int write_protect : 1; /* Non-zero means can't modify. */
56 unsigned int visible : 1; /* Zero means don't display. */
57 unsigned int front_sticky : 1; /* Non-zero means text inserted just
58 before this interval goes into it. */
59 unsigned int rear_sticky : 1; /* Likewise for just after it. */
60
61 /* Properties of this interval.
62 The mark bit on this field says whether this particular interval
63 tree node has been visited. Since intervals should never be
64 shared, GC aborts if it seems to have visited an interval twice. */
65 Lisp_Object plist;
66};
67
90ba40fc
JA
68/* These are macros for dealing with the interval tree. */
69
70/* Size of the structure used to represent an interval */
71#define INTERVAL_SIZE (sizeof (struct interval))
72
73/* Size of a pointer to an interval structure */
74#define INTERVAL_PTR_SIZE (sizeof (struct interval *))
75
825e0e0b 76#define NULL_INTERVAL_P(i) ((i) == NULL_INTERVAL)
90ba40fc
JA
77
78/* True if this interval has no right child. */
7ac78c9a 79#define NULL_RIGHT_CHILD(i) ((i)->right == NULL_INTERVAL)
90ba40fc
JA
80
81/* True if this interval has no left child. */
7ac78c9a 82#define NULL_LEFT_CHILD(i) ((i)->left == NULL_INTERVAL)
90ba40fc
JA
83
84/* True if this interval has no parent. */
e0b8c689 85#define NULL_PARENT(i) ((i)->up_obj || (i)->up.interval == 0)
90ba40fc
JA
86
87/* True if this interval is the left child of some other interval. */
439d5cb4
KR
88#define AM_LEFT_CHILD(i) (! NULL_PARENT (i) \
89 && INTERVAL_PARENT (i)->left == (i))
90ba40fc 90
7ac78c9a 91/* True if this interval is the right child of some other interval. */
439d5cb4
KR
92#define AM_RIGHT_CHILD(i) (! NULL_PARENT (i) \
93 && INTERVAL_PARENT (i)->right == (i))
90ba40fc
JA
94
95/* True if this interval has no children. */
96#define LEAF_INTERVAL_P(i) ((i)->left == NULL_INTERVAL \
97 && (i)->right == NULL_INTERVAL)
98
99/* True if this interval has no parent and is therefore the root. */
100#define ROOT_INTERVAL_P(i) (NULL_PARENT (i))
101
102/* True if this interval is the only interval in the interval tree. */
7ac78c9a 103#define ONLY_INTERVAL_P(i) (ROOT_INTERVAL_P ((i)) && LEAF_INTERVAL_P ((i)))
90ba40fc
JA
104
105/* True if this interval has both left and right children. */
106#define BOTH_KIDS_P(i) ((i)->left != NULL_INTERVAL \
107 && (i)->right != NULL_INTERVAL)
108
109/* The total size of all text represented by this interval and all its
110 children in the tree. This is zero if the interval is null. */
111#define TOTAL_LENGTH(i) ((i) == NULL_INTERVAL ? 0 : (i)->total_length)
112
113/* The size of text represented by this interval alone. */
114#define LENGTH(i) ((i) == NULL_INTERVAL ? 0 : (TOTAL_LENGTH ((i)) \
115 - TOTAL_LENGTH ((i)->right) \
116 - TOTAL_LENGTH ((i)->left)))
117
3fc86d4b 118/* The position of the character just past the end of I. Note that
90ba40fc 119 the position cache i->position must be valid for this to work. */
3fc86d4b 120#define INTERVAL_LAST_POS(i) ((i)->position + LENGTH ((i)))
90ba40fc
JA
121
122/* The total size of the left subtree of this interval. */
123#define LEFT_TOTAL_LENGTH(i) ((i)->left ? (i)->left->total_length : 0)
124
125/* The total size of the right subtree of this interval. */
126#define RIGHT_TOTAL_LENGTH(i) ((i)->right ? (i)->right->total_length : 0)
127
128
129/* These macros are for dealing with the interval properties. */
130
131/* True if this is a default interval, which is the same as being null
132 or having no properties. */
133#define DEFAULT_INTERVAL_P(i) (NULL_INTERVAL_P (i) || EQ ((i)->plist, Qnil))
134
439d5cb4
KR
135/* Test what type of parent we have. Three possibilities: another
136 interval, a buffer or string object, or NULL_INTERVAL. */
e0b8c689
KR
137#define INTERVAL_HAS_PARENT(i) ((i)->up_obj == 0 && (i)->up.interval != 0)
138#define INTERVAL_HAS_OBJECT(i) ((i)->up_obj)
439d5cb4
KR
139
140/* Set/get parent of an interval.
141
142 The choice of macros is dependent on the type needed. Don't add
143 casts to get around this, it will break some development work in
144 progress. */
4a6a76d9 145#define SET_INTERVAL_PARENT(i,p) \
837584c7 146 ((i)->up_obj = 0, (i)->up.interval = (p))
4a6a76d9
SM
147#define SET_INTERVAL_OBJECT(i,o) \
148 (eassert (BUFFERP (o) || STRINGP (o)), (i)->up_obj = 1, (i)->up.obj = (o))
149#define INTERVAL_PARENT(i) \
150 (eassert ((i) != 0 && (i)->up_obj == 0),(i)->up.interval)
c0333abc 151#define GET_INTERVAL_OBJECT(d,s) (eassert((s)->up_obj == 1), (d) = (s)->up.obj)
439d5cb4
KR
152
153/* Make the parent of D be whatever the parent of S is, regardless of
154 type. This is used when balancing an interval tree. */
4a6a76d9
SM
155#define COPY_INTERVAL_PARENT(d,s) \
156 ((d)->up = (s)->up, (d)->up_obj = (s)->up_obj)
439d5cb4
KR
157
158/* Get the parent interval, if any, otherwise a null pointer. Useful
159 for walking up to the root in a "for" loop; use this to get the
160 "next" value, and test the result to see if it's NULL_INTERVAL. */
4a6a76d9
SM
161#define INTERVAL_PARENT_OR_NULL(i) \
162 (INTERVAL_HAS_PARENT (i) ? INTERVAL_PARENT (i) : 0)
439d5cb4 163
e5a9c92a
RS
164/* Abort if interval I's size is negative. */
165#define CHECK_TOTAL_LENGTH(i) \
166 if ((int) (i)->total_length < 0) abort (); else
167
90ba40fc 168/* Reset this interval to its vanilla, or no-property state. */
7ac78c9a
RS
169#define RESET_INTERVAL(i) \
170{ \
171 (i)->total_length = (i)->position = 0; \
172 (i)->left = (i)->right = NULL_INTERVAL; \
6f716644 173 SET_INTERVAL_PARENT (i, NULL_INTERVAL); \
7ac78c9a
RS
174 (i)->write_protect = 0; \
175 (i)->visible = 0; \
176 (i)->front_sticky = (i)->rear_sticky = 0; \
177 (i)->plist = Qnil; \
178}
90ba40fc
JA
179
180/* Copy the cached property values of interval FROM to interval TO. */
181#define COPY_INTERVAL_CACHE(from,to) \
182{ \
183 (to)->write_protect = (from)->write_protect; \
184 (to)->visible = (from)->visible; \
185 (to)->front_sticky = (from)->front_sticky; \
186 (to)->rear_sticky = (from)->rear_sticky; \
187}
188
189/* Copy only the set bits of FROM's cache. */
190#define MERGE_INTERVAL_CACHE(from,to) \
191{ \
192 if ((from)->write_protect) (to)->write_protect = 1; \
193 if ((from)->visible) (to)->visible = 1; \
194 if ((from)->front_sticky) (to)->front_sticky = 1; \
195 if ((from)->rear_sticky) (to)->rear_sticky = 1; \
196}
197
198/* Macro determining whether the properties of an interval being
199 inserted should be merged with the properties of the text where
200 they are being inserted. */
58943db0 201#define MERGE_INSERTIONS(i) 1
90ba40fc
JA
202
203/* Macro determining if an invisible interval should be displayed
204 as a special glyph, or not at all. */
205#define DISPLAY_INVISIBLE_GLYPH(i) 0
206
207/* Is this interval visible? Replace later with cache access */
208#define INTERVAL_VISIBLE_P(i) \
9207deb2 209 (! NULL_INTERVAL_P (i) && NILP (textget ((i)->plist, Qinvisible)))
90ba40fc
JA
210
211/* Is this interval writable? Replace later with cache access */
5f8a398a
RS
212#define INTERVAL_WRITABLE_P(i) \
213 (! NULL_INTERVAL_P (i) \
214 && (NILP (textget ((i)->plist, Qread_only)) \
215 || ((CONSP (Vinhibit_read_only) \
216 ? !NILP (Fmemq (textget ((i)->plist, Qread_only), \
217 Vinhibit_read_only)) \
218 : !NILP (Vinhibit_read_only))))) \
90ba40fc
JA
219
220/* Macros to tell whether insertions before or after this interval
221 should stick to it. */
58943db0
RS
222/* Replace later with cache access */
223/*#define FRONT_STICKY_P(i) ((i)->front_sticky != 0)
224 #define END_STICKY_P(i) ((i)->rear_sticky != 0)*/
a5ecc8a3
KH
225/* As we now have Vtext_property_default_nonsticky, these macros are
226 unreliable now. Currently, they are never used. */
58943db0
RS
227#define FRONT_STICKY_P(i) \
228 (! NULL_INTERVAL_P (i) && ! NILP (textget ((i)->plist, Qfront_sticky)))
229#define END_NONSTICKY_P(i) \
230 (! NULL_INTERVAL_P (i) && ! NILP (textget ((i)->plist, Qrear_nonsticky)))
97f7b3b2
RS
231#define FRONT_NONSTICKY_P(i) \
232 (! NULL_INTERVAL_P (i) && ! EQ (Qt, textget ((i)->plist, Qfront_sticky)))
90ba40fc
JA
233
234
47b4c04d 235/* If PROP is the `invisible' property of a character,
99776d43
SM
236 this is 1 if the character should be treated as invisible,
237 and 2 if it is invisible but with an ellipsis. */
47b4c04d
RS
238
239#define TEXT_PROP_MEANS_INVISIBLE(prop) \
240 (EQ (current_buffer->invisibility_spec, Qt) \
df1958c4 241 ? !NILP (prop) \
47b4c04d
RS
242 : invisible_p (prop, current_buffer->invisibility_spec))
243
90ba40fc
JA
244/* Declared in alloc.c */
245
383e0970 246extern INTERVAL make_interval (void);
90ba40fc
JA
247
248/* Declared in intervals.c */
249
383e0970
J
250extern INTERVAL create_root_interval (Lisp_Object);
251extern void copy_properties (INTERVAL, INTERVAL);
252extern int intervals_equal (INTERVAL, INTERVAL);
c50bd0d2 253extern void traverse_intervals (INTERVAL, EMACS_INT,
383e0970
J
254 void (*) (INTERVAL, Lisp_Object),
255 Lisp_Object);
256extern void traverse_intervals_noorder (INTERVAL,
257 void (*) (INTERVAL, Lisp_Object),
258 Lisp_Object);
e79123aa
EZ
259extern INTERVAL split_interval_right (INTERVAL, EMACS_INT);
260extern INTERVAL split_interval_left (INTERVAL, EMACS_INT);
261extern INTERVAL find_interval (INTERVAL, EMACS_INT);
383e0970
J
262extern INTERVAL next_interval (INTERVAL);
263extern INTERVAL previous_interval (INTERVAL);
264extern INTERVAL merge_interval_left (INTERVAL);
265extern INTERVAL merge_interval_right (INTERVAL);
266extern void delete_interval (INTERVAL);
b7982059 267extern void offset_intervals (struct buffer *, EMACS_INT, EMACS_INT);
e79123aa 268extern void graft_intervals_into_buffer (INTERVAL, EMACS_INT, EMACS_INT,
383e0970
J
269 struct buffer *, int);
270extern void verify_interval_modification (struct buffer *, int, int);
271extern INTERVAL balance_intervals (INTERVAL);
b7982059 272extern void copy_intervals_to_string (Lisp_Object, struct buffer *,
e79123aa
EZ
273 EMACS_INT, EMACS_INT);
274extern INTERVAL copy_intervals (INTERVAL, EMACS_INT, EMACS_INT);
383e0970
J
275extern int compare_string_intervals (Lisp_Object, Lisp_Object);
276extern Lisp_Object textget (Lisp_Object, Lisp_Object);
277extern Lisp_Object lookup_char_property (Lisp_Object, Lisp_Object, int);
e79123aa 278extern void move_if_not_intangible (EMACS_INT);
579c18d0 279extern int get_property_and_range (EMACS_INT, Lisp_Object, Lisp_Object *,
383e0970 280 EMACS_INT *, EMACS_INT *, Lisp_Object);
e79123aa
EZ
281extern Lisp_Object get_local_map (EMACS_INT, struct buffer *, Lisp_Object);
282extern INTERVAL update_interval (INTERVAL, EMACS_INT);
383e0970
J
283extern void set_intervals_multibyte (int);
284extern INTERVAL validate_interval_range (Lisp_Object, Lisp_Object *,
285 Lisp_Object *, int);
2f7c71a1 286extern INTERVAL interval_of (int, Lisp_Object);
d748a3db
AS
287
288/* Defined in xdisp.c */
383e0970 289extern int invisible_p (Lisp_Object, Lisp_Object);
90ba40fc
JA
290
291/* Declared in textprop.c */
292
293/* Types of hooks. */
294extern Lisp_Object Qmouse_left;
295extern Lisp_Object Qmouse_entered;
296extern Lisp_Object Qpoint_left;
297extern Lisp_Object Qpoint_entered;
1a7c673b
RS
298extern Lisp_Object Qmodification_hooks;
299extern Lisp_Object Qcategory;
300extern Lisp_Object Qlocal_map;
b4030d7b 301extern Lisp_Object Qkeymap;
90ba40fc
JA
302
303/* Visual properties text (including strings) may have. */
304extern Lisp_Object Qforeground, Qbackground, Qfont, Qunderline, Qstipple;
86d62d76 305extern Lisp_Object Qinvisible, Qintangible, Qread_only;
90ba40fc 306
b81de1f7 307extern Lisp_Object Vinhibit_point_motion_hooks;
b9439338 308extern Lisp_Object Vdefault_text_properties;
14112a3f 309extern Lisp_Object Vchar_property_alias_alist;
a5ecc8a3 310extern Lisp_Object Vtext_property_default_nonsticky;
b81de1f7 311
58943db0
RS
312/* Sticky properties */
313extern Lisp_Object Qfront_sticky, Qrear_nonsticky;
314
ec5d8db7
AS
315EXFUN (Fget_char_property, 3);
316EXFUN (Fget_text_property, 3);
317EXFUN (Ftext_properties_at, 2);
318EXFUN (Fnext_property_change, 3);
319EXFUN (Fprevious_property_change, 3);
320EXFUN (Fadd_text_properties, 4);
321EXFUN (Fset_text_properties, 4);
322EXFUN (Fremove_text_properties, 4);
323EXFUN (Ftext_property_any, 5);
212b4f2c 324EXFUN (Fprevious_single_char_property_change, 4);
383e0970
J
325extern Lisp_Object copy_text_properties (Lisp_Object, Lisp_Object,
326 Lisp_Object, Lisp_Object,
327 Lisp_Object, Lisp_Object);
328extern Lisp_Object set_text_properties (Lisp_Object, Lisp_Object,
329 Lisp_Object, Lisp_Object,
330 Lisp_Object);
331extern void set_text_properties_1 (Lisp_Object, Lisp_Object,
332 Lisp_Object, Lisp_Object, INTERVAL);
333
334Lisp_Object text_property_list (Lisp_Object, Lisp_Object, Lisp_Object,
335 Lisp_Object);
336int add_text_properties_from_list (Lisp_Object, Lisp_Object, Lisp_Object);
337Lisp_Object extend_property_ranges (Lisp_Object, Lisp_Object);
338Lisp_Object get_char_property_and_overlay (Lisp_Object, Lisp_Object,
339 Lisp_Object, Lisp_Object*);
340extern int text_property_stickiness (Lisp_Object prop, Lisp_Object pos,
341 Lisp_Object buffer);
342extern Lisp_Object get_pos_property (Lisp_Object pos, Lisp_Object prop,
343 Lisp_Object object);
344
345extern void syms_of_textprop (void);
a5ecc8a3
KH
346
347#include "composite.h"
6b61353c
KH
348
349/* arch-tag: f0bc16c0-b084-498d-9de4-21cc8f077795
350 (do not change this comment) */