annotate src/intervals.c @ 41882:f3bc5e440020

Resurrect the Hebrew category settings for all Hebrew characters removed by the last change. Add code for setting the Hebrew category of the Unicode Hebrew characters. Set syntax entries for Hebrew punctuation characters.
author Eli Zaretskii <eliz@gnu.org>
date Fri, 07 Dec 2001 17:52:20 +0000
parents 960d5d2165b3
children 52fc7b74e8a1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1 /* Code for doing intervals.
20706
d43ba5d91281 Update copyright year.
Richard M. Stallman <rms@gnu.org>
parents: 20677
diff changeset
2 Copyright (C) 1993, 1994, 1995, 1997, 1998 Free Software Foundation, Inc.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
3
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
4 This file is part of GNU Emacs.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
5
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
9 any later version.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
10
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
14 GNU General Public License for more details.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
15
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14036
diff changeset
19 Boston, MA 02111-1307, USA. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
20
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
21
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
22 /* NOTES:
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
23
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
24 Have to ensure that we can't put symbol nil on a plist, or some
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
25 functions may work incorrectly.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
26
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
27 An idea: Have the owner of the tree keep count of splits and/or
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
28 insertion lengths (in intervals), and balance after every N.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
29
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
30 Need to call *_left_hook when buffer is killed.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
31
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
32 Scan for zero-length, or 0-length to see notes about handling
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
33 zero length interval-markers.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
34
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
35 There are comments around about freeing intervals. It might be
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
36 faster to explicitly free them (put them on the free list) than
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
37 to GC them.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
38
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
39 */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
40
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
41
4696
1fc792473491 Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents: 4638
diff changeset
42 #include <config.h>
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
43 #include "lisp.h"
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
44 #include "intervals.h"
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
45 #include "buffer.h"
4962
99edf052bfa0 Include puresize.h.
Richard M. Stallman <rms@gnu.org>
parents: 4718
diff changeset
46 #include "puresize.h"
8897
69cdecdaebf7 Add #include "keyboard.h"
Karl Heuer <kwzh@gnu.org>
parents: 8761
diff changeset
47 #include "keyboard.h"
39697
0b986bb45526 Include keymap.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39682
diff changeset
48 #include "keymap.h"
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
49
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
50 /* Test for membership, allowing for t (actually any non-cons) to mean the
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
51 universal set. */
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
52
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
53 #define TMEM(sym, set) (CONSP (set) ? ! NILP (Fmemq (sym, set)) : ! NILP (set))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
54
5173
d48ba25b35bf (merge_properties_sticky): Declared.
Richard M. Stallman <rms@gnu.org>
parents: 5169
diff changeset
55 Lisp_Object merge_properties_sticky ();
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
56 static INTERVAL reproduce_tree P_ ((INTERVAL, INTERVAL));
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
57 static INTERVAL reproduce_tree_obj P_ ((INTERVAL, Lisp_Object));
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
58
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
59 /* Utility functions for intervals. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
60
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
61
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
62 /* Create the root interval of some object, a buffer or string. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
63
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
64 INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
65 create_root_interval (parent)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
66 Lisp_Object parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
67 {
4962
99edf052bfa0 Include puresize.h.
Richard M. Stallman <rms@gnu.org>
parents: 4718
diff changeset
68 INTERVAL new;
99edf052bfa0 Include puresize.h.
Richard M. Stallman <rms@gnu.org>
parents: 4718
diff changeset
69
99edf052bfa0 Include puresize.h.
Richard M. Stallman <rms@gnu.org>
parents: 4718
diff changeset
70 CHECK_IMPURE (parent);
99edf052bfa0 Include puresize.h.
Richard M. Stallman <rms@gnu.org>
parents: 4718
diff changeset
71
99edf052bfa0 Include puresize.h.
Richard M. Stallman <rms@gnu.org>
parents: 4718
diff changeset
72 new = make_interval ();
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
73
9125
a78f02f76f03 (create_root_interval, balance_possible_root_interval, delete_interval): Use
Karl Heuer <kwzh@gnu.org>
parents: 9072
diff changeset
74 if (BUFFERP (parent))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
75 {
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
76 new->total_length = (BUF_Z (XBUFFER (parent))
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
77 - BUF_BEG (XBUFFER (parent)));
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
78 BUF_INTERVALS (XBUFFER (parent)) = new;
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
79 new->position = 1;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
80 }
9125
a78f02f76f03 (create_root_interval, balance_possible_root_interval, delete_interval): Use
Karl Heuer <kwzh@gnu.org>
parents: 9072
diff changeset
81 else if (STRINGP (parent))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
82 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
83 new->total_length = XSTRING (parent)->size;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
84 XSTRING (parent)->intervals = new;
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
85 new->position = 0;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
86 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
87
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
88 SET_INTERVAL_OBJECT (new, parent);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
89
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
90 return new;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
91 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
92
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
93 /* Make the interval TARGET have exactly the properties of SOURCE */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
94
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
95 void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
96 copy_properties (source, target)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
97 register INTERVAL source, target;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
98 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
99 if (DEFAULT_INTERVAL_P (source) && DEFAULT_INTERVAL_P (target))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
100 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
101
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
102 COPY_INTERVAL_CACHE (source, target);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
103 target->plist = Fcopy_sequence (source->plist);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
104 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
105
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
106 /* Merge the properties of interval SOURCE into the properties
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
107 of interval TARGET. That is to say, each property in SOURCE
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
108 is added to TARGET if TARGET has no such property as yet. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
109
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
110 static void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
111 merge_properties (source, target)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
112 register INTERVAL source, target;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
113 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
114 register Lisp_Object o, sym, val;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
115
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
116 if (DEFAULT_INTERVAL_P (source) && DEFAULT_INTERVAL_P (target))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
117 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
118
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
119 MERGE_INTERVAL_CACHE (source, target);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
120
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
121 o = source->plist;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
122 while (! EQ (o, Qnil))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
123 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
124 sym = Fcar (o);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
125 val = Fmemq (sym, target->plist);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
126
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
127 if (NILP (val))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
128 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
129 o = Fcdr (o);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
130 val = Fcar (o);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
131 target->plist = Fcons (sym, Fcons (val, target->plist));
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
132 o = Fcdr (o);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
133 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
134 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
135 o = Fcdr (Fcdr (o));
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
136 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
137 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
138
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
139 /* Return 1 if the two intervals have the same properties,
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
140 0 otherwise. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
141
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
142 int
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
143 intervals_equal (i0, i1)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
144 INTERVAL i0, i1;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
145 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
146 register Lisp_Object i0_cdr, i0_sym, i1_val;
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21351
diff changeset
147 register int i1_len;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
148
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
149 if (DEFAULT_INTERVAL_P (i0) && DEFAULT_INTERVAL_P (i1))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
150 return 1;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
151
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
152 if (DEFAULT_INTERVAL_P (i0) || DEFAULT_INTERVAL_P (i1))
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
153 return 0;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
154
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
155 i1_len = XFASTINT (Flength (i1->plist));
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
156 if (i1_len & 0x1) /* Paranoia -- plists are always even */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
157 abort ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
158 i1_len /= 2;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
159 i0_cdr = i0->plist;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
160 while (!NILP (i0_cdr))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
161 {
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
162 /* Lengths of the two plists were unequal. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
163 if (i1_len == 0)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
164 return 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
165
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
166 i0_sym = Fcar (i0_cdr);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
167 i1_val = Fmemq (i0_sym, i1->plist);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
168
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
169 /* i0 has something i1 doesn't. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
170 if (EQ (i1_val, Qnil))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
171 return 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
172
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
173 /* i0 and i1 both have sym, but it has different values in each. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
174 i0_cdr = Fcdr (i0_cdr);
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
175 if (! EQ (Fcar (Fcdr (i1_val)), Fcar (i0_cdr)))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
176 return 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
177
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
178 i0_cdr = Fcdr (i0_cdr);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
179 i1_len--;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
180 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
181
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
182 /* Lengths of the two plists were unequal. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
183 if (i1_len > 0)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
184 return 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
185
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
186 return 1;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
187 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
188
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
189
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
190 /* Traverse an interval tree TREE, performing FUNCTION on each node.
39851
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
191 No guarantee is made about the order of traversal.
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
192 Pass FUNCTION two args: an interval, and ARG. */
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
193
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
194 void
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
195 traverse_intervals_noorder (tree, function, arg)
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
196 INTERVAL tree;
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
197 void (* function) P_ ((INTERVAL, Lisp_Object));
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
198 Lisp_Object arg;
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
199 {
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
200 /* Minimize stack usage. */
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
201 while (!NULL_INTERVAL_P (tree))
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
202 {
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
203 (*function) (tree, arg);
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
204 if (NULL_INTERVAL_P (tree->right))
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
205 tree = tree->left;
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
206 else
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
207 {
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
208 traverse_intervals_noorder (tree->left, function, arg);
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
209 tree = tree->right;
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
210 }
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
211 }
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
212 }
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
213
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
214 /* Traverse an interval tree TREE, performing FUNCTION on each node.
1958
8bc716df45e3 (traverse_intervals): New arg ARG.
Richard M. Stallman <rms@gnu.org>
parents: 1412
diff changeset
215 Pass FUNCTION two args: an interval, and ARG. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
216
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
217 void
39854
a1e434124570 (traverse_intervals): Drop `depth' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39851
diff changeset
218 traverse_intervals (tree, position, function, arg)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
219 INTERVAL tree;
39854
a1e434124570 (traverse_intervals): Drop `depth' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39851
diff changeset
220 int position;
20317
f62a4f83537e (traverse_intervals): Protoize parameter.
Andreas Schwab <schwab@suse.de>
parents: 18743
diff changeset
221 void (* function) P_ ((INTERVAL, Lisp_Object));
1958
8bc716df45e3 (traverse_intervals): New arg ARG.
Richard M. Stallman <rms@gnu.org>
parents: 1412
diff changeset
222 Lisp_Object arg;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
223 {
39851
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
224 while (!NULL_INTERVAL_P (tree))
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
225 {
39854
a1e434124570 (traverse_intervals): Drop `depth' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39851
diff changeset
226 traverse_intervals (tree->left, position, function, arg);
39851
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
227 position += LEFT_TOTAL_LENGTH (tree);
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
228 tree->position = position;
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
229 (*function) (tree, arg);
39854
a1e434124570 (traverse_intervals): Drop `depth' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39851
diff changeset
230 position += LENGTH (tree); tree = tree->right;
39851
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
231 }
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
232 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
233
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
234 #if 0
25747
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
235
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
236 static int icount;
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
237 static int idepth;
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
238 static int zero_length;
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
239
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
240 /* These functions are temporary, for debugging purposes only. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
241
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
242 INTERVAL search_interval, found_interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
243
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
244 void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
245 check_for_interval (i)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
246 register INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
247 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
248 if (i == search_interval)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
249 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
250 found_interval = i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
251 icount++;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
252 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
253 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
254
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
255 INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
256 search_for_interval (i, tree)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
257 register INTERVAL i, tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
258 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
259 icount = 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
260 search_interval = i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
261 found_interval = NULL_INTERVAL;
39851
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
262 traverse_intervals_noorder (tree, &check_for_interval, Qnil);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
263 return found_interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
264 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
265
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
266 static void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
267 inc_interval_count (i)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
268 INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
269 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
270 icount++;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
271 if (LENGTH (i) == 0)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
272 zero_length++;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
273 if (depth > idepth)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
274 idepth = depth;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
275 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
276
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
277 int
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
278 count_intervals (i)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
279 register INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
280 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
281 icount = 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
282 idepth = 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
283 zero_length = 0;
39851
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
284 traverse_intervals_noorder (i, &inc_interval_count, Qnil);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
285
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
286 return icount;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
287 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
288
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
289 static INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
290 root_interval (interval)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
291 INTERVAL interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
292 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
293 register INTERVAL i = interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
294
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
295 while (! ROOT_INTERVAL_P (i))
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
296 i = INTERVAL_PARENT (i);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
297
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
298 return i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
299 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
300 #endif
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
301
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
302 /* Assuming that a left child exists, perform the following operation:
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
303
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
304 A B
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
305 / \ / \
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
306 B => A
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
307 / \ / \
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
308 c c
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
309 */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
310
39851
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
311 static INLINE INTERVAL
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
312 rotate_right (interval)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
313 INTERVAL interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
314 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
315 INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
316 INTERVAL B = interval->left;
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
317 int old_total = interval->total_length;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
318
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
319 /* Deal with any Parent of A; make it point to B. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
320 if (! ROOT_INTERVAL_P (interval))
25747
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
321 {
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
322 if (AM_LEFT_CHILD (interval))
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
323 INTERVAL_PARENT (interval)->left = B;
25747
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
324 else
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
325 INTERVAL_PARENT (interval)->right = B;
25747
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
326 }
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
327 COPY_INTERVAL_PARENT (B, interval);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
328
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
329 /* Make B the parent of A */
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
330 i = B->right;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
331 B->right = interval;
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
332 SET_INTERVAL_PARENT (interval, B);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
333
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
334 /* Make A point to c */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
335 interval->left = i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
336 if (! NULL_INTERVAL_P (i))
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
337 SET_INTERVAL_PARENT (i, interval);
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
338
5760
ffe89784cef2 (merge_properties_sticky): Preserve original order of properties.
Karl Heuer <kwzh@gnu.org>
parents: 5666
diff changeset
339 /* A's total length is decreased by the length of B and its left child. */
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
340 interval->total_length -= B->total_length - LEFT_TOTAL_LENGTH (interval);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
341
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
342 /* B must have the same total length of A. */
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
343 B->total_length = old_total;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
344
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
345 return B;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
346 }
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
347
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
348 /* Assuming that a right child exists, perform the following operation:
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
349
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
350 A B
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
351 / \ / \
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
352 B => A
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
353 / \ / \
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
354 c c
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
355 */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
356
39851
a535a2e3b5c4 (traverse_intervals): Use less stack space.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39697
diff changeset
357 static INLINE INTERVAL
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
358 rotate_left (interval)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
359 INTERVAL interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
360 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
361 INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
362 INTERVAL B = interval->right;
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
363 int old_total = interval->total_length;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
364
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
365 /* Deal with any parent of A; make it point to B. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
366 if (! ROOT_INTERVAL_P (interval))
25747
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
367 {
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
368 if (AM_LEFT_CHILD (interval))
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
369 INTERVAL_PARENT (interval)->left = B;
25747
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
370 else
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
371 INTERVAL_PARENT (interval)->right = B;
25747
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
372 }
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
373 COPY_INTERVAL_PARENT (B, interval);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
374
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
375 /* Make B the parent of A */
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
376 i = B->left;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
377 B->left = interval;
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
378 SET_INTERVAL_PARENT (interval, B);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
379
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
380 /* Make A point to c */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
381 interval->right = i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
382 if (! NULL_INTERVAL_P (i))
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
383 SET_INTERVAL_PARENT (i, interval);
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
384
5760
ffe89784cef2 (merge_properties_sticky): Preserve original order of properties.
Karl Heuer <kwzh@gnu.org>
parents: 5666
diff changeset
385 /* A's total length is decreased by the length of B and its right child. */
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
386 interval->total_length -= B->total_length - RIGHT_TOTAL_LENGTH (interval);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
387
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
388 /* B must have the same total length of A. */
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
389 B->total_length = old_total;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
390
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
391 return B;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
392 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
393
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
394 /* Balance an interval tree with the assumption that the subtrees
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
395 themselves are already balanced. */
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
396
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
397 static INTERVAL
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
398 balance_an_interval (i)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
399 INTERVAL i;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
400 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
401 register int old_diff, new_diff;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
402
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
403 while (1)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
404 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
405 old_diff = LEFT_TOTAL_LENGTH (i) - RIGHT_TOTAL_LENGTH (i);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
406 if (old_diff > 0)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
407 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
408 new_diff = i->total_length - i->left->total_length
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
409 + RIGHT_TOTAL_LENGTH (i->left) - LEFT_TOTAL_LENGTH (i->left);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
410 if (abs (new_diff) >= old_diff)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
411 break;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
412 i = rotate_right (i);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
413 balance_an_interval (i->right);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
414 }
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
415 else if (old_diff < 0)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
416 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
417 new_diff = i->total_length - i->right->total_length
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
418 + LEFT_TOTAL_LENGTH (i->right) - RIGHT_TOTAL_LENGTH (i->right);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
419 if (abs (new_diff) >= -old_diff)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
420 break;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
421 i = rotate_left (i);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
422 balance_an_interval (i->left);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
423 }
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
424 else
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
425 break;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
426 }
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
427 return i;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
428 }
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
429
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
430 /* Balance INTERVAL, potentially stuffing it back into its parent
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
431 Lisp Object. */
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
432
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
433 static INLINE INTERVAL
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
434 balance_possible_root_interval (interval)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
435 register INTERVAL interval;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
436 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
437 Lisp_Object parent;
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
438 int have_parent = 0;
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
439
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
440 if (!INTERVAL_HAS_OBJECT (interval) && !INTERVAL_HAS_PARENT (interval))
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
441 return interval;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
442
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
443 if (INTERVAL_HAS_OBJECT (interval))
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
444 {
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
445 have_parent = 1;
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
446 GET_INTERVAL_OBJECT (parent, interval);
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
447 }
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
448 interval = balance_an_interval (interval);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
449
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
450 if (have_parent)
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
451 {
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
452 if (BUFFERP (parent))
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
453 BUF_INTERVALS (XBUFFER (parent)) = interval;
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
454 else if (STRINGP (parent))
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
455 XSTRING (parent)->intervals = interval;
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
456 }
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
457
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
458 return interval;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
459 }
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
460
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
461 /* Balance the interval tree TREE. Balancing is by weight
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
462 (the amount of text). */
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
463
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
464 static INTERVAL
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
465 balance_intervals_internal (tree)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
466 register INTERVAL tree;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
467 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
468 /* Balance within each side. */
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
469 if (tree->left)
15734
98d8e063fdae (balance_intervals_internal): Recurse directly.
Erik Naggum <erik@naggum.no>
parents: 14186
diff changeset
470 balance_intervals_internal (tree->left);
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
471 if (tree->right)
15734
98d8e063fdae (balance_intervals_internal): Recurse directly.
Erik Naggum <erik@naggum.no>
parents: 14186
diff changeset
472 balance_intervals_internal (tree->right);
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
473 return balance_an_interval (tree);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
474 }
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
475
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
476 /* Advertised interface to balance intervals. */
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
477
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
478 INTERVAL
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
479 balance_intervals (tree)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
480 INTERVAL tree;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
481 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
482 if (tree == NULL_INTERVAL)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
483 return NULL_INTERVAL;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
484
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
485 return balance_intervals_internal (tree);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
486 }
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
487
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
488 /* Split INTERVAL into two pieces, starting the second piece at
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
489 character position OFFSET (counting from 0), relative to INTERVAL.
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
490 INTERVAL becomes the left-hand piece, and the right-hand piece
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
491 (second, lexicographically) is returned.
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
492
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
493 The size and position fields of the two intervals are set based upon
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
494 those of the original interval. The property list of the new interval
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
495 is reset, thus it is up to the caller to do the right thing with the
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
496 result.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
497
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
498 Note that this does not change the position of INTERVAL; if it is a root,
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
499 it is still a root after this operation. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
500
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
501 INTERVAL
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
502 split_interval_right (interval, offset)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
503 INTERVAL interval;
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
504 int offset;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
505 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
506 INTERVAL new = make_interval ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
507 int position = interval->position;
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
508 int new_length = LENGTH (interval) - offset;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
509
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
510 new->position = position + offset;
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
511 SET_INTERVAL_PARENT (new, interval);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
512
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
513 if (NULL_RIGHT_CHILD (interval))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
514 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
515 interval->right = new;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
516 new->total_length = new_length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
517 }
20908
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
518 else
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
519 {
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
520 /* Insert the new node between INTERVAL and its right child. */
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
521 new->right = interval->right;
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
522 SET_INTERVAL_PARENT (interval->right, new);
20908
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
523 interval->right = new;
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
524 new->total_length = new_length + new->right->total_length;
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
525 balance_an_interval (new);
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
526 }
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
527
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
528 balance_possible_root_interval (interval);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
529
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
530 return new;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
531 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
532
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
533 /* Split INTERVAL into two pieces, starting the second piece at
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
534 character position OFFSET (counting from 0), relative to INTERVAL.
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
535 INTERVAL becomes the right-hand piece, and the left-hand piece
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
536 (first, lexicographically) is returned.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
537
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
538 The size and position fields of the two intervals are set based upon
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
539 those of the original interval. The property list of the new interval
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
540 is reset, thus it is up to the caller to do the right thing with the
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
541 result.
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
542
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
543 Note that this does not change the position of INTERVAL; if it is a root,
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
544 it is still a root after this operation. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
545
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
546 INTERVAL
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
547 split_interval_left (interval, offset)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
548 INTERVAL interval;
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
549 int offset;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
550 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
551 INTERVAL new = make_interval ();
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
552 int new_length = offset;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
553
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
554 new->position = interval->position;
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
555 interval->position = interval->position + offset;
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
556 SET_INTERVAL_PARENT (new, interval);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
557
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
558 if (NULL_LEFT_CHILD (interval))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
559 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
560 interval->left = new;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
561 new->total_length = new_length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
562 }
20908
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
563 else
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
564 {
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
565 /* Insert the new node between INTERVAL and its left child. */
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
566 new->left = interval->left;
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
567 SET_INTERVAL_PARENT (new->left, new);
20908
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
568 interval->left = new;
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
569 new->total_length = new_length + new->left->total_length;
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
570 balance_an_interval (new);
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
571 }
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
572
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
573 balance_possible_root_interval (interval);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
574
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
575 return new;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
576 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
577
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
578 /* Return the proper position for the first character
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
579 described by the interval tree SOURCE.
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
580 This is 1 if the parent is a buffer,
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
581 0 if the parent is a string or if there is no parent.
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
582
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
583 Don't use this function on an interval which is the child
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
584 of another interval! */
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
585
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
586 int
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
587 interval_start_pos (source)
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
588 INTERVAL source;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
589 {
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
590 Lisp_Object parent;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
591
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
592 if (NULL_INTERVAL_P (source))
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
593 return 0;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
594
28406
451721e784a8 Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents: 28269
diff changeset
595 if (! INTERVAL_HAS_OBJECT (source))
451721e784a8 Stop assuming interval pointers and lisp objects can be distinguished by
Ken Raeburn <raeburn@raeburn.org>
parents: 28269
diff changeset
596 return 0;
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
597 GET_INTERVAL_OBJECT (parent, source);
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
598 if (BUFFERP (parent))
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
599 return BUF_BEG (XBUFFER (parent));
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
600 return 0;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
601 }
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
602
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
603 /* Find the interval containing text position POSITION in the text
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
604 represented by the interval tree TREE. POSITION is a buffer
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
605 position (starting from 1) or a string index (starting from 0).
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
606 If POSITION is at the end of the buffer or string,
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
607 return the interval containing the last character.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
608
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
609 The `position' field, which is a cache of an interval's position,
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
610 is updated in the interval found. Other functions (e.g., next_interval)
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
611 will update this cache based on the result of find_interval. */
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
612
18125
5b0dfe8c78fb (find_interval): No longer inline.
Richard M. Stallman <rms@gnu.org>
parents: 18078
diff changeset
613 INTERVAL
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
614 find_interval (tree, position)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
615 register INTERVAL tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
616 register int position;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
617 {
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
618 /* The distance from the left edge of the subtree at TREE
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
619 to POSITION. */
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
620 register int relative_position;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
621
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
622 if (NULL_INTERVAL_P (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
623 return NULL_INTERVAL;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
624
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
625 relative_position = position;
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
626 if (INTERVAL_HAS_OBJECT (tree))
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
627 {
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
628 Lisp_Object parent;
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
629 GET_INTERVAL_OBJECT (parent, tree);
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
630 if (BUFFERP (parent))
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
631 relative_position -= BUF_BEG (XBUFFER (parent));
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
632 }
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
633
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
634 if (relative_position > TOTAL_LENGTH (tree))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
635 abort (); /* Paranoia */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
636
37328
9a801971bd7e (find_interval): Don't rebalance during signal handling.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35256
diff changeset
637 if (!handling_signal)
9a801971bd7e (find_interval): Don't rebalance during signal handling.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35256
diff changeset
638 tree = balance_possible_root_interval (tree);
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
639
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
640 while (1)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
641 {
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
642 if (relative_position < LEFT_TOTAL_LENGTH (tree))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
643 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
644 tree = tree->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
645 }
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
646 else if (! NULL_RIGHT_CHILD (tree)
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
647 && relative_position >= (TOTAL_LENGTH (tree)
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
648 - RIGHT_TOTAL_LENGTH (tree)))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
649 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
650 relative_position -= (TOTAL_LENGTH (tree)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
651 - RIGHT_TOTAL_LENGTH (tree));
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
652 tree = tree->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
653 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
654 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
655 {
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
656 tree->position
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
657 = (position - relative_position /* the left edge of *tree */
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
658 + LEFT_TOTAL_LENGTH (tree)); /* the left edge of this interval */
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
659
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
660 return tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
661 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
662 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
663 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
664
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
665 /* Find the succeeding interval (lexicographically) to INTERVAL.
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
666 Sets the `position' field based on that of INTERVAL (see
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
667 find_interval). */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
668
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
669 INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
670 next_interval (interval)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
671 register INTERVAL interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
672 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
673 register INTERVAL i = interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
674 register int next_position;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
675
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
676 if (NULL_INTERVAL_P (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
677 return NULL_INTERVAL;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
678 next_position = interval->position + LENGTH (interval);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
679
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
680 if (! NULL_RIGHT_CHILD (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
681 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
682 i = i->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
683 while (! NULL_LEFT_CHILD (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
684 i = i->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
685
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
686 i->position = next_position;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
687 return i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
688 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
689
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
690 while (! NULL_PARENT (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
691 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
692 if (AM_LEFT_CHILD (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
693 {
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
694 i = INTERVAL_PARENT (i);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
695 i->position = next_position;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
696 return i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
697 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
698
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
699 i = INTERVAL_PARENT (i);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
700 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
701
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
702 return NULL_INTERVAL;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
703 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
704
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
705 /* Find the preceding interval (lexicographically) to INTERVAL.
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
706 Sets the `position' field based on that of INTERVAL (see
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
707 find_interval). */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
708
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
709 INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
710 previous_interval (interval)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
711 register INTERVAL interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
712 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
713 register INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
714
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
715 if (NULL_INTERVAL_P (interval))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
716 return NULL_INTERVAL;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
717
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
718 if (! NULL_LEFT_CHILD (interval))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
719 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
720 i = interval->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
721 while (! NULL_RIGHT_CHILD (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
722 i = i->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
723
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
724 i->position = interval->position - LENGTH (i);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
725 return i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
726 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
727
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
728 i = interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
729 while (! NULL_PARENT (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
730 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
731 if (AM_RIGHT_CHILD (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
732 {
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
733 i = INTERVAL_PARENT (i);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
734
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
735 i->position = interval->position - LENGTH (i);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
736 return i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
737 }
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
738 i = INTERVAL_PARENT (i);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
739 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
740
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
741 return NULL_INTERVAL;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
742 }
17461
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
743
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
744 /* Find the interval containing POS given some non-NULL INTERVAL
21012
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
745 in the same tree. Note that we need to update interval->position
37328
9a801971bd7e (find_interval): Don't rebalance during signal handling.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35256
diff changeset
746 if we go down the tree.
9a801971bd7e (find_interval): Don't rebalance during signal handling.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35256
diff changeset
747 To speed up the process, we assume that the ->position of
9a801971bd7e (find_interval): Don't rebalance during signal handling.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35256
diff changeset
748 I and all its parents is already uptodate. */
17461
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
749 INTERVAL
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
750 update_interval (i, pos)
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
751 register INTERVAL i;
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
752 int pos;
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
753 {
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
754 if (NULL_INTERVAL_P (i))
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
755 return NULL_INTERVAL;
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
756
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
757 while (1)
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
758 {
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
759 if (pos < i->position)
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
760 {
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
761 /* Move left. */
21012
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
762 if (pos >= i->position - TOTAL_LENGTH (i->left))
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
763 {
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
764 i->left->position = i->position - TOTAL_LENGTH (i->left)
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
765 + LEFT_TOTAL_LENGTH (i->left);
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
766 i = i->left; /* Move to the left child */
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
767 }
17461
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
768 else if (NULL_PARENT (i))
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
769 error ("Point before start of properties");
21012
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
770 else
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
771 i = INTERVAL_PARENT (i);
17461
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
772 continue;
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
773 }
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
774 else if (pos >= INTERVAL_LAST_POS (i))
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
775 {
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
776 /* Move right. */
21012
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
777 if (pos < INTERVAL_LAST_POS (i) + TOTAL_LENGTH (i->right))
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
778 {
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
779 i->right->position = INTERVAL_LAST_POS (i) +
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
780 LEFT_TOTAL_LENGTH (i->right);
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
781 i = i->right; /* Move to the right child */
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
782 }
17461
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
783 else if (NULL_PARENT (i))
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
784 error ("Point after end of properties");
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
785 else
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
786 i = INTERVAL_PARENT (i);
17461
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
787 continue;
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
788 }
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
789 else
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
790 return i;
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
791 }
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
792 }
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
793
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
794
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
795 #if 0
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
796 /* Traverse a path down the interval tree TREE to the interval
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
797 containing POSITION, adjusting all nodes on the path for
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
798 an addition of LENGTH characters. Insertion between two intervals
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
799 (i.e., point == i->position, where i is second interval) means
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
800 text goes into second interval.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
801
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
802 Modifications are needed to handle the hungry bits -- after simply
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
803 finding the interval at position (don't add length going down),
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
804 if it's the beginning of the interval, get the previous interval
14036
621a575db6f7 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 13028
diff changeset
805 and check the hungry bits of both. Then add the length going back up
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
806 to the root. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
807
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
808 static INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
809 adjust_intervals_for_insertion (tree, position, length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
810 INTERVAL tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
811 int position, length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
812 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
813 register int relative_position;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
814 register INTERVAL this;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
815
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
816 if (TOTAL_LENGTH (tree) == 0) /* Paranoia */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
817 abort ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
818
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
819 /* If inserting at point-max of a buffer, that position
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
820 will be out of range */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
821 if (position > TOTAL_LENGTH (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
822 position = TOTAL_LENGTH (tree);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
823 relative_position = position;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
824 this = tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
825
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
826 while (1)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
827 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
828 if (relative_position <= LEFT_TOTAL_LENGTH (this))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
829 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
830 this->total_length += length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
831 this = this->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
832 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
833 else if (relative_position > (TOTAL_LENGTH (this)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
834 - RIGHT_TOTAL_LENGTH (this)))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
835 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
836 relative_position -= (TOTAL_LENGTH (this)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
837 - RIGHT_TOTAL_LENGTH (this));
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
838 this->total_length += length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
839 this = this->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
840 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
841 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
842 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
843 /* If we are to use zero-length intervals as buffer pointers,
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
844 then this code will have to change. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
845 this->total_length += length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
846 this->position = LEFT_TOTAL_LENGTH (this)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
847 + position - relative_position + 1;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
848 return tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
849 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
850 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
851 }
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
852 #endif
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
853
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
854 /* Effect an adjustment corresponding to the addition of LENGTH characters
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
855 of text. Do this by finding the interval containing POSITION in the
5760
ffe89784cef2 (merge_properties_sticky): Preserve original order of properties.
Karl Heuer <kwzh@gnu.org>
parents: 5666
diff changeset
856 interval tree TREE, and then adjusting all of its ancestors by adding
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
857 LENGTH to them.
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
858
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
859 If POSITION is the first character of an interval, meaning that point
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
860 is actually between the two intervals, make the new text belong to
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
861 the interval which is "sticky".
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
862
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
863 If both intervals are "sticky", then make them belong to the left-most
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
864 interval. Another possibility would be to create a new interval for
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
865 this text, and make it have the merged properties of both ends. */
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
866
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
867 static INTERVAL
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
868 adjust_intervals_for_insertion (tree, position, length)
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
869 INTERVAL tree;
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
870 int position, length;
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
871 {
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
872 register INTERVAL i;
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
873 register INTERVAL temp;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
874 int eobp = 0;
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
875 Lisp_Object parent;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
876 int offset;
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
877
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
878 if (TOTAL_LENGTH (tree) == 0) /* Paranoia */
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
879 abort ();
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
880
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
881 GET_INTERVAL_OBJECT (parent, tree);
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
882 offset = (BUFFERP (parent) ? BUF_BEG (XBUFFER (parent)) : 0);
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
883
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
884 /* If inserting at point-max of a buffer, that position will be out
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
885 of range. Remember that buffer positions are 1-based. */
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
886 if (position >= TOTAL_LENGTH (tree) + offset)
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
887 {
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
888 position = TOTAL_LENGTH (tree) + offset;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
889 eobp = 1;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
890 }
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
891
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
892 i = find_interval (tree, position);
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
893
4638
3872f91770fc (adjust_intervals_for_insertion): If inserting in middle
Richard M. Stallman <rms@gnu.org>
parents: 4383
diff changeset
894 /* If in middle of an interval which is not sticky either way,
3872f91770fc (adjust_intervals_for_insertion): If inserting in middle
Richard M. Stallman <rms@gnu.org>
parents: 4383
diff changeset
895 we must not just give its properties to the insertion.
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
896 So split this interval at the insertion point.
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
897
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
898 Originally, the if condition here was this:
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
899 (! (position == i->position || eobp)
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
900 && END_NONSTICKY_P (i)
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
901 && FRONT_NONSTICKY_P (i))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
902 But, these macros are now unreliable because of introduction of
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
903 Vtext_property_default_nonsticky. So, we always check properties
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
904 one by one if POSITION is in middle of an interval. */
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
905 if (! (position == i->position || eobp))
4638
3872f91770fc (adjust_intervals_for_insertion): If inserting in middle
Richard M. Stallman <rms@gnu.org>
parents: 4383
diff changeset
906 {
16740
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
907 Lisp_Object tail;
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
908 Lisp_Object front, rear;
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
909
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
910 tail = i->plist;
16740
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
911
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
912 /* Properties font-sticky and rear-nonsticky override
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
913 Vtext_property_default_nonsticky. So, if they are t, we can
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
914 skip one by one checking of properties. */
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
915 rear = textget (i->plist, Qrear_nonsticky);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
916 if (! CONSP (rear) && ! NILP (rear))
16740
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
917 {
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
918 /* All properties are nonsticky. We split the interval. */
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
919 goto check_done;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
920 }
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
921 front = textget (i->plist, Qfront_sticky);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
922 if (! CONSP (front) && ! NILP (front))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
923 {
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
924 /* All properties are sticky. We don't split the interval. */
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
925 tail = Qnil;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
926 goto check_done;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
927 }
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
928
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
929 /* Does any actual property pose an actual problem? We break
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
930 the loop if we find a nonsticky property. */
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
931 for (; CONSP (tail); tail = Fcdr (XCDR (tail)))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
932 {
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
933 Lisp_Object prop, tmp;
25662
0a7261c1d487 Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents: 24910
diff changeset
934 prop = XCAR (tail);
16740
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
935
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
936 /* Is this particular property front-sticky? */
16740
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
937 if (CONSP (front) && ! NILP (Fmemq (prop, front)))
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
938 continue;
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
939
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
940 /* Is this particular property rear-nonsticky? */
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
941 if (CONSP (rear) && ! NILP (Fmemq (prop, rear)))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
942 break;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
943
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
944 /* Is this particular property recorded as sticky or
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
945 nonsticky in Vtext_property_default_nonsticky? */
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
946 tmp = Fassq (prop, Vtext_property_default_nonsticky);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
947 if (CONSP (tmp))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
948 {
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
949 if (NILP (tmp))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
950 continue;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
951 break;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
952 }
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
953
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
954 /* By default, a text property is rear-sticky, thus we
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
955 continue the loop. */
16740
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
956 }
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
957
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
958 check_done:
16740
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
959 /* If any property is a real problem, split the interval. */
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
960 if (! NILP (tail))
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
961 {
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
962 temp = split_interval_right (i, position - i->position);
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
963 copy_properties (i, temp);
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
964 i = temp;
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
965 }
4638
3872f91770fc (adjust_intervals_for_insertion): If inserting in middle
Richard M. Stallman <rms@gnu.org>
parents: 4383
diff changeset
966 }
3872f91770fc (adjust_intervals_for_insertion): If inserting in middle
Richard M. Stallman <rms@gnu.org>
parents: 4383
diff changeset
967
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
968 /* If we are positioned between intervals, check the stickiness of
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
969 both of them. We have to do this too, if we are at BEG or Z. */
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
970 if (position == i->position || eobp)
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
971 {
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
972 register INTERVAL prev;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
973
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
974 if (position == BEG)
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
975 prev = 0;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
976 else if (eobp)
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
977 {
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
978 prev = i;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
979 i = 0;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
980 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
981 else
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
982 prev = previous_interval (i);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
983
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
984 /* Even if we are positioned between intervals, we default
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
985 to the left one if it exists. We extend it now and split
14036
621a575db6f7 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 13028
diff changeset
986 off a part later, if stickiness demands it. */
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
987 for (temp = prev ? prev : i; temp; temp = INTERVAL_PARENT_OR_NULL (temp))
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
988 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
989 temp->total_length += length;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
990 temp = balance_possible_root_interval (temp);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
991 }
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
992
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
993 /* If at least one interval has sticky properties,
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
994 we check the stickiness property by property.
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
995
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
996 Originally, the if condition here was this:
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
997 (END_NONSTICKY_P (prev) || FRONT_STICKY_P (i))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
998 But, these macros are now unreliable because of introduction
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
999 of Vtext_property_default_nonsticky. So, we always have to
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1000 check stickiness of properties one by one. If cache of
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1001 stickiness is implemented in the future, we may be able to
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1002 use those macros again. */
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1003 if (1)
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1004 {
6501
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1005 Lisp_Object pleft, pright;
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1006 struct interval newi;
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1007
6501
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1008 pleft = NULL_INTERVAL_P (prev) ? Qnil : prev->plist;
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1009 pright = NULL_INTERVAL_P (i) ? Qnil : i->plist;
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1010 newi.plist = merge_properties_sticky (pleft, pright);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1011
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1012 if (! prev) /* i.e. position == BEG */
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1013 {
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1014 if (! intervals_equal (i, &newi))
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1015 {
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1016 i = split_interval_left (i, length);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1017 i->plist = newi.plist;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1018 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1019 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1020 else if (! intervals_equal (prev, &newi))
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1021 {
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1022 prev = split_interval_right (prev,
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1023 position - prev->position);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1024 prev->plist = newi.plist;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1025 if (! NULL_INTERVAL_P (i)
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1026 && intervals_equal (prev, i))
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1027 merge_interval_right (prev);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1028 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1029
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1030 /* We will need to update the cache here later. */
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1031 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1032 else if (! prev && ! NILP (i->plist))
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1033 {
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1034 /* Just split off a new interval at the left.
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1035 Since I wasn't front-sticky, the empty plist is ok. */
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1036 i = split_interval_left (i, length);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1037 }
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1038 }
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1039
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1040 /* Otherwise just extend the interval. */
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1041 else
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1042 {
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1043 for (temp = i; temp; temp = INTERVAL_PARENT_OR_NULL (temp))
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
1044 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
1045 temp->total_length += length;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
1046 temp = balance_possible_root_interval (temp);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
1047 }
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1048 }
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1049
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1050 return tree;
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1051 }
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1052
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1053 /* Any property might be front-sticky on the left, rear-sticky on the left,
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1054 front-sticky on the right, or rear-sticky on the right; the 16 combinations
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1055 can be arranged in a matrix with rows denoting the left conditions and
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1056 columns denoting the right conditions:
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1057 _ __ _
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1058 _ FR FR FR FR
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1059 FR__ 0 1 2 3
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1060 _FR 4 5 6 7
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1061 FR 8 9 A B
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1062 FR C D E F
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1063
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1064 left-props = '(front-sticky (p8 p9 pa pb pc pd pe pf)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1065 rear-nonsticky (p4 p5 p6 p7 p8 p9 pa pb)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1066 p0 L p1 L p2 L p3 L p4 L p5 L p6 L p7 L
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1067 p8 L p9 L pa L pb L pc L pd L pe L pf L)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1068 right-props = '(front-sticky (p2 p3 p6 p7 pa pb pe pf)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1069 rear-nonsticky (p1 p2 p5 p6 p9 pa pd pe)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1070 p0 R p1 R p2 R p3 R p4 R p5 R p6 R p7 R
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1071 p8 R p9 R pa R pb R pc R pd R pe R pf R)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1072
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1073 We inherit from whoever has a sticky side facing us. If both sides
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1074 do (cases 2, 3, E, and F), then we inherit from whichever side has a
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1075 non-nil value for the current property. If both sides do, then we take
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1076 from the left.
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1077
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1078 When we inherit a property, we get its stickiness as well as its value.
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1079 So, when we merge the above two lists, we expect to get this:
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1080
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1081 result = '(front-sticky (p6 p7 pa pb pc pd pe pf)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1082 rear-nonsticky (p6 pa)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1083 p0 L p1 L p2 L p3 L p6 R p7 R
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1084 pa R pb R pc L pd L pe L pf L)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1085
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1086 The optimizable special cases are:
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1087 left rear-nonsticky = nil, right front-sticky = nil (inherit left)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1088 left rear-nonsticky = t, right front-sticky = t (inherit right)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1089 left rear-nonsticky = t, right front-sticky = nil (inherit none)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1090 */
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1091
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1092 Lisp_Object
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1093 merge_properties_sticky (pleft, pright)
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1094 Lisp_Object pleft, pright;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1095 {
6501
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1096 register Lisp_Object props, front, rear;
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1097 Lisp_Object lfront, lrear, rfront, rrear;
16708
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1098 register Lisp_Object tail1, tail2, sym, lval, rval, cat;
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1099 int use_left, use_right;
16708
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1100 int lpresent;
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1101
6501
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1102 props = Qnil;
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1103 front = Qnil;
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1104 rear = Qnil;
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1105 lfront = textget (pleft, Qfront_sticky);
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1106 lrear = textget (pleft, Qrear_nonsticky);
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1107 rfront = textget (pright, Qfront_sticky);
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1108 rrear = textget (pright, Qrear_nonsticky);
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1109
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1110 /* Go through each element of PRIGHT. */
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1111 for (tail1 = pright; CONSP (tail1); tail1 = Fcdr (Fcdr (tail1)))
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1112 {
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1113 Lisp_Object tmp;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1114
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1115 sym = Fcar (tail1);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1116
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1117 /* Sticky properties get special treatment. */
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1118 if (EQ (sym, Qrear_nonsticky) || EQ (sym, Qfront_sticky))
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1119 continue;
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1120
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1121 rval = Fcar (Fcdr (tail1));
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1122 for (tail2 = pleft; CONSP (tail2); tail2 = Fcdr (Fcdr (tail2)))
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1123 if (EQ (sym, Fcar (tail2)))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1124 break;
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1125
16708
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1126 /* Indicate whether the property is explicitly defined on the left.
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1127 (We know it is defined explicitly on the right
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1128 because otherwise we don't get here.) */
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1129 lpresent = ! NILP (tail2);
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1130 lval = (NILP (tail2) ? Qnil : Fcar (Fcdr (tail2)));
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1131
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1132 /* Even if lrear or rfront say nothing about the stickiness of
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1133 SYM, Vtext_property_default_nonsticky may give default
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1134 stickiness to SYM. */
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1135 tmp = Fassq (sym, Vtext_property_default_nonsticky);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1136 use_left = (lpresent
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1137 && ! (TMEM (sym, lrear)
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1138 || CONSP (tmp) && ! NILP (XCDR (tmp))));
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1139 use_right = (TMEM (sym, rfront)
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1140 || (CONSP (tmp) && NILP (XCDR (tmp))));
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1141 if (use_left && use_right)
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1142 {
16708
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1143 if (NILP (lval))
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1144 use_left = 0;
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1145 else if (NILP (rval))
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1146 use_right = 0;
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1147 }
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1148 if (use_left)
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1149 {
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1150 /* We build props as (value sym ...) rather than (sym value ...)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1151 because we plan to nreverse it when we're done. */
16708
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1152 props = Fcons (lval, Fcons (sym, props));
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1153 if (TMEM (sym, lfront))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1154 front = Fcons (sym, front);
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1155 if (TMEM (sym, lrear))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1156 rear = Fcons (sym, rear);
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1157 }
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1158 else if (use_right)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1159 {
16708
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1160 props = Fcons (rval, Fcons (sym, props));
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1161 if (TMEM (sym, rfront))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1162 front = Fcons (sym, front);
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1163 if (TMEM (sym, rrear))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1164 rear = Fcons (sym, rear);
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1165 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1166 }
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1167
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1168 /* Now go through each element of PLEFT. */
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1169 for (tail2 = pleft; CONSP (tail2); tail2 = Fcdr (Fcdr (tail2)))
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1170 {
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1171 Lisp_Object tmp;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1172
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1173 sym = Fcar (tail2);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1174
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1175 /* Sticky properties get special treatment. */
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1176 if (EQ (sym, Qrear_nonsticky) || EQ (sym, Qfront_sticky))
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1177 continue;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1178
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1179 /* If sym is in PRIGHT, we've already considered it. */
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1180 for (tail1 = pright; CONSP (tail1); tail1 = Fcdr (Fcdr (tail1)))
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1181 if (EQ (sym, Fcar (tail1)))
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1182 break;
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1183 if (! NILP (tail1))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1184 continue;
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1185
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1186 lval = Fcar (Fcdr (tail2));
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1187
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1188 /* Even if lrear or rfront say nothing about the stickiness of
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1189 SYM, Vtext_property_default_nonsticky may give default
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1190 stickiness to SYM. */
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1191 tmp = Fassq (sym, Vtext_property_default_nonsticky);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1192
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1193 /* Since rval is known to be nil in this loop, the test simplifies. */
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1194 if (! (TMEM (sym, lrear) || (CONSP (tmp) && ! NILP (XCDR (tmp)))))
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1195 {
16708
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1196 props = Fcons (lval, Fcons (sym, props));
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1197 if (TMEM (sym, lfront))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1198 front = Fcons (sym, front);
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1199 }
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1200 else if (TMEM (sym, rfront) || (CONSP (tmp) && NILP (XCDR (tmp))))
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1201 {
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1202 /* The value is nil, but we still inherit the stickiness
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1203 from the right. */
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1204 front = Fcons (sym, front);
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1205 if (TMEM (sym, rrear))
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1206 rear = Fcons (sym, rear);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1207 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1208 }
5760
ffe89784cef2 (merge_properties_sticky): Preserve original order of properties.
Karl Heuer <kwzh@gnu.org>
parents: 5666
diff changeset
1209 props = Fnreverse (props);
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1210 if (! NILP (rear))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1211 props = Fcons (Qrear_nonsticky, Fcons (Fnreverse (rear), props));
16708
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1212
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1213 cat = textget (props, Qcategory);
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1214 if (! NILP (front)
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1215 &&
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1216 /* If we have inherited a front-stick category property that is t,
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1217 we don't need to set up a detailed one. */
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1218 ! (! NILP (cat) && SYMBOLP (cat)
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1219 && EQ (Fget (cat, Qfront_sticky), Qt)))
5760
ffe89784cef2 (merge_properties_sticky): Preserve original order of properties.
Karl Heuer <kwzh@gnu.org>
parents: 5666
diff changeset
1220 props = Fcons (Qfront_sticky, Fcons (Fnreverse (front), props));
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1221 return props;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1222 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1223
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1224
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1225 /* Delete an node I from its interval tree by merging its subtrees
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1226 into one subtree which is then returned. Caller is responsible for
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1227 storing the resulting subtree into its parent. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1228
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1229 static INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1230 delete_node (i)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1231 register INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1232 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1233 register INTERVAL migrate, this;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1234 register int migrate_amt;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1235
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1236 if (NULL_INTERVAL_P (i->left))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1237 return i->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1238 if (NULL_INTERVAL_P (i->right))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1239 return i->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1240
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1241 migrate = i->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1242 migrate_amt = i->left->total_length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1243 this = i->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1244 this->total_length += migrate_amt;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1245 while (! NULL_INTERVAL_P (this->left))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1246 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1247 this = this->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1248 this->total_length += migrate_amt;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1249 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1250 this->left = migrate;
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1251 SET_INTERVAL_PARENT (migrate, this);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1252
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1253 return i->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1254 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1255
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1256 /* Delete interval I from its tree by calling `delete_node'
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1257 and properly connecting the resultant subtree.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1258
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1259 I is presumed to be empty; that is, no adjustments are made
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1260 for the length of I. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1261
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1262 void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1263 delete_interval (i)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1264 register INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1265 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1266 register INTERVAL parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1267 int amt = LENGTH (i);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1268
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1269 if (amt > 0) /* Only used on zero-length intervals now. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1270 abort ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1271
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1272 if (ROOT_INTERVAL_P (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1273 {
6501
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1274 Lisp_Object owner;
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1275 GET_INTERVAL_OBJECT (owner, i);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1276 parent = delete_node (i);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1277 if (! NULL_INTERVAL_P (parent))
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1278 SET_INTERVAL_OBJECT (parent, owner);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1279
9125
a78f02f76f03 (create_root_interval, balance_possible_root_interval, delete_interval): Use
Karl Heuer <kwzh@gnu.org>
parents: 9072
diff changeset
1280 if (BUFFERP (owner))
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1281 BUF_INTERVALS (XBUFFER (owner)) = parent;
9125
a78f02f76f03 (create_root_interval, balance_possible_root_interval, delete_interval): Use
Karl Heuer <kwzh@gnu.org>
parents: 9072
diff changeset
1282 else if (STRINGP (owner))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1283 XSTRING (owner)->intervals = parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1284 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1285 abort ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1286
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1287 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1288 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1289
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1290 parent = INTERVAL_PARENT (i);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1291 if (AM_LEFT_CHILD (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1292 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1293 parent->left = delete_node (i);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1294 if (! NULL_INTERVAL_P (parent->left))
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1295 SET_INTERVAL_PARENT (parent->left, parent);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1296 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1297 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1298 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1299 parent->right = delete_node (i);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1300 if (! NULL_INTERVAL_P (parent->right))
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1301 SET_INTERVAL_PARENT (parent->right, parent);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1302 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1303 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1304
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1305 /* Find the interval in TREE corresponding to the relative position
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1306 FROM and delete as much as possible of AMOUNT from that interval.
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1307 Return the amount actually deleted, and if the interval was
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1308 zeroed-out, delete that interval node from the tree.
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1309
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1310 Note that FROM is actually origin zero, aka relative to the
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1311 leftmost edge of tree. This is appropriate since we call ourselves
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1312 recursively on subtrees.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1313
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1314 Do this by recursing down TREE to the interval in question, and
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1315 deleting the appropriate amount of text. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1316
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1317 static int
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1318 interval_deletion_adjustment (tree, from, amount)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1319 register INTERVAL tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1320 register int from, amount;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1321 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1322 register int relative_position = from;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1323
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1324 if (NULL_INTERVAL_P (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1325 return 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1326
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1327 /* Left branch */
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1328 if (relative_position < LEFT_TOTAL_LENGTH (tree))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1329 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1330 int subtract = interval_deletion_adjustment (tree->left,
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1331 relative_position,
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1332 amount);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1333 tree->total_length -= subtract;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1334 return subtract;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1335 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1336 /* Right branch */
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1337 else if (relative_position >= (TOTAL_LENGTH (tree)
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1338 - RIGHT_TOTAL_LENGTH (tree)))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1339 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1340 int subtract;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1341
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1342 relative_position -= (tree->total_length
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1343 - RIGHT_TOTAL_LENGTH (tree));
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1344 subtract = interval_deletion_adjustment (tree->right,
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1345 relative_position,
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1346 amount);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1347 tree->total_length -= subtract;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1348 return subtract;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1349 }
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1350 /* Here -- this node. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1351 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1352 {
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1353 /* How much can we delete from this interval? */
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1354 int my_amount = ((tree->total_length
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1355 - RIGHT_TOTAL_LENGTH (tree))
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1356 - relative_position);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1357
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1358 if (amount > my_amount)
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1359 amount = my_amount;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1360
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1361 tree->total_length -= amount;
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1362 if (LENGTH (tree) == 0)
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1363 delete_interval (tree);
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1364
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1365 return amount;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1366 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1367
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1368 /* Never reach here. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1369 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1370
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1371 /* Effect the adjustments necessary to the interval tree of BUFFER to
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1372 correspond to the deletion of LENGTH characters from that buffer
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1373 text. The deletion is effected at position START (which is a
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1374 buffer position, i.e. origin 1). */
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1375
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1376 static void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1377 adjust_intervals_for_deletion (buffer, start, length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1378 struct buffer *buffer;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1379 int start, length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1380 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1381 register int left_to_delete = length;
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1382 register INTERVAL tree = BUF_INTERVALS (buffer);
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1383 Lisp_Object parent;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1384 int offset;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1385
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1386 GET_INTERVAL_OBJECT (parent, tree);
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1387 offset = (BUFFERP (parent) ? BUF_BEG (XBUFFER (parent)) : 0);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1388
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1389 if (NULL_INTERVAL_P (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1390 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1391
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1392 if (start > offset + TOTAL_LENGTH (tree)
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1393 || start + length > offset + TOTAL_LENGTH (tree))
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1394 abort ();
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1395
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1396 if (length == TOTAL_LENGTH (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1397 {
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1398 BUF_INTERVALS (buffer) = NULL_INTERVAL;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1399 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1400 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1401
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1402 if (ONLY_INTERVAL_P (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1403 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1404 tree->total_length -= length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1405 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1406 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1407
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1408 if (start > offset + TOTAL_LENGTH (tree))
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1409 start = offset + TOTAL_LENGTH (tree);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1410 while (left_to_delete > 0)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1411 {
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1412 left_to_delete -= interval_deletion_adjustment (tree, start - offset,
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1413 left_to_delete);
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1414 tree = BUF_INTERVALS (buffer);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1415 if (left_to_delete == tree->total_length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1416 {
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1417 BUF_INTERVALS (buffer) = NULL_INTERVAL;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1418 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1419 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1420 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1421 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1422
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 3490
diff changeset
1423 /* Make the adjustments necessary to the interval tree of BUFFER to
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1424 represent an addition or deletion of LENGTH characters starting
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1425 at position START. Addition or deletion is indicated by the sign
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1426 of LENGTH. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1427
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1428 INLINE void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1429 offset_intervals (buffer, start, length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1430 struct buffer *buffer;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1431 int start, length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1432 {
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1433 if (NULL_INTERVAL_P (BUF_INTERVALS (buffer)) || length == 0)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1434 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1435
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1436 if (length > 0)
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1437 adjust_intervals_for_insertion (BUF_INTERVALS (buffer), start, length);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1438 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1439 adjust_intervals_for_deletion (buffer, start, -length);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1440 }
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1441
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1442 /* Merge interval I with its lexicographic successor. The resulting
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1443 interval is returned, and has the properties of the original
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1444 successor. The properties of I are lost. I is removed from the
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1445 interval tree.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1446
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1447 IMPORTANT:
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1448 The caller must verify that this is not the last (rightmost)
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1449 interval. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1450
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1451 INTERVAL
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1452 merge_interval_right (i)
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1453 register INTERVAL i;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1454 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1455 register int absorb = LENGTH (i);
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1456 register INTERVAL successor;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1457
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1458 /* Zero out this interval. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1459 i->total_length -= absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1460
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1461 /* Find the succeeding interval. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1462 if (! NULL_RIGHT_CHILD (i)) /* It's below us. Add absorb
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1463 as we descend. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1464 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1465 successor = i->right;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1466 while (! NULL_LEFT_CHILD (successor))
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1467 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1468 successor->total_length += absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1469 successor = successor->left;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1470 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1471
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1472 successor->total_length += absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1473 delete_interval (i);
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1474 return successor;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1475 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1476
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1477 successor = i;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1478 while (! NULL_PARENT (successor)) /* It's above us. Subtract as
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1479 we ascend. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1480 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1481 if (AM_LEFT_CHILD (successor))
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1482 {
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1483 successor = INTERVAL_PARENT (successor);
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1484 delete_interval (i);
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1485 return successor;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1486 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1487
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1488 successor = INTERVAL_PARENT (successor);
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1489 successor->total_length -= absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1490 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1491
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1492 /* This must be the rightmost or last interval and cannot
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1493 be merged right. The caller should have known. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1494 abort ();
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1495 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1496
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1497 /* Merge interval I with its lexicographic predecessor. The resulting
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1498 interval is returned, and has the properties of the original predecessor.
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1499 The properties of I are lost. Interval node I is removed from the tree.
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1500
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1501 IMPORTANT:
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1502 The caller must verify that this is not the first (leftmost) interval. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1503
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1504 INTERVAL
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1505 merge_interval_left (i)
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1506 register INTERVAL i;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1507 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1508 register int absorb = LENGTH (i);
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1509 register INTERVAL predecessor;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1510
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1511 /* Zero out this interval. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1512 i->total_length -= absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1513
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1514 /* Find the preceding interval. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1515 if (! NULL_LEFT_CHILD (i)) /* It's below us. Go down,
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1516 adding ABSORB as we go. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1517 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1518 predecessor = i->left;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1519 while (! NULL_RIGHT_CHILD (predecessor))
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1520 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1521 predecessor->total_length += absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1522 predecessor = predecessor->right;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1523 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1524
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1525 predecessor->total_length += absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1526 delete_interval (i);
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1527 return predecessor;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1528 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1529
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1530 predecessor = i;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1531 while (! NULL_PARENT (predecessor)) /* It's above us. Go up,
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1532 subtracting ABSORB. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1533 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1534 if (AM_RIGHT_CHILD (predecessor))
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1535 {
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1536 predecessor = INTERVAL_PARENT (predecessor);
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1537 delete_interval (i);
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1538 return predecessor;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1539 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1540
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1541 predecessor = INTERVAL_PARENT (predecessor);
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1542 predecessor->total_length -= absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1543 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1544
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1545 /* This must be the leftmost or first interval and cannot
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1546 be merged left. The caller should have known. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1547 abort ();
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1548 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1549
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1550 /* Make an exact copy of interval tree SOURCE which descends from
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1551 PARENT. This is done by recursing through SOURCE, copying
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1552 the current interval and its properties, and then adjusting
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1553 the pointers of the copy. */
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1554
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1555 static INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1556 reproduce_tree (source, parent)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1557 INTERVAL source, parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1558 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1559 register INTERVAL t = make_interval ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1560
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1561 bcopy (source, t, INTERVAL_SIZE);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1562 copy_properties (source, t);
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1563 SET_INTERVAL_PARENT (t, parent);
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1564 if (! NULL_LEFT_CHILD (source))
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1565 t->left = reproduce_tree (source->left, t);
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1566 if (! NULL_RIGHT_CHILD (source))
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1567 t->right = reproduce_tree (source->right, t);
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1568
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1569 return t;
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1570 }
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1571
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1572 static INTERVAL
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1573 reproduce_tree_obj (source, parent)
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1574 INTERVAL source;
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1575 Lisp_Object parent;
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1576 {
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1577 register INTERVAL t = make_interval ();
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1578
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1579 bcopy (source, t, INTERVAL_SIZE);
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1580 copy_properties (source, t);
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1581 SET_INTERVAL_OBJECT (t, parent);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1582 if (! NULL_LEFT_CHILD (source))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1583 t->left = reproduce_tree (source->left, t);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1584 if (! NULL_RIGHT_CHILD (source))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1585 t->right = reproduce_tree (source->right, t);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1586
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1587 return t;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1588 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1589
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1590 #if 0
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1591 /* Nobody calls this. Perhaps it's a vestige of an earlier design. */
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1592
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1593 /* Make a new interval of length LENGTH starting at START in the
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1594 group of intervals INTERVALS, which is actually an interval tree.
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1595 Returns the new interval.
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1596
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1597 Generate an error if the new positions would overlap an existing
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1598 interval. */
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1599
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1600 static INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1601 make_new_interval (intervals, start, length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1602 INTERVAL intervals;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1603 int start, length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1604 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1605 INTERVAL slot;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1606
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1607 slot = find_interval (intervals, start);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1608 if (start + length > slot->position + LENGTH (slot))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1609 error ("Interval would overlap");
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1610
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1611 if (start == slot->position && length == LENGTH (slot))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1612 return slot;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1613
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1614 if (slot->position == start)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1615 {
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1616 /* New right node. */
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1617 split_interval_right (slot, length);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1618 return slot;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1619 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1620
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1621 if (slot->position + LENGTH (slot) == start + length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1622 {
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1623 /* New left node. */
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1624 split_interval_left (slot, LENGTH (slot) - length);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1625 return slot;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1626 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1627
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1628 /* Convert interval SLOT into three intervals. */
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1629 split_interval_left (slot, start - slot->position);
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1630 split_interval_right (slot, length);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1631 return slot;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1632 }
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1633 #endif
2052
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
1634
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1635 /* Insert the intervals of SOURCE into BUFFER at POSITION.
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1636 LENGTH is the length of the text in SOURCE.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1637
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1638 The `position' field of the SOURCE intervals is assumed to be
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1639 consistent with its parent; therefore, SOURCE must be an
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1640 interval tree made with copy_interval or must be the whole
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1641 tree of a buffer or a string.
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1642
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1643 This is used in insdel.c when inserting Lisp_Strings into the
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1644 buffer. The text corresponding to SOURCE is already in the buffer
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1645 when this is called. The intervals of new tree are a copy of those
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1646 belonging to the string being inserted; intervals are never
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1647 shared.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1648
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1649 If the inserted text had no intervals associated, and we don't
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1650 want to inherit the surrounding text's properties, this function
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1651 simply returns -- offset_intervals should handle placing the
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1652 text in the correct interval, depending on the sticky bits.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1653
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1654 If the inserted text had properties (intervals), then there are two
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1655 cases -- either insertion happened in the middle of some interval,
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1656 or between two intervals.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1657
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1658 If the text goes into the middle of an interval, then new
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1659 intervals are created in the middle with only the properties of
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1660 the new text, *unless* the macro MERGE_INSERTIONS is true, in
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1661 which case the new text has the union of its properties and those
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1662 of the text into which it was inserted.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1663
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1664 If the text goes between two intervals, then if neither interval
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1665 had its appropriate sticky property set (front_sticky, rear_sticky),
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1666 the new text has only its properties. If one of the sticky properties
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1667 is set, then the new text "sticks" to that region and its properties
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 3490
diff changeset
1668 depend on merging as above. If both the preceding and succeeding
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1669 intervals to the new text are "sticky", then the new text retains
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1670 only its properties, as if neither sticky property were set. Perhaps
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1671 we should consider merging all three sets of properties onto the new
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1672 text... */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1673
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1674 void
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1675 graft_intervals_into_buffer (source, position, length, buffer, inherit)
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1676 INTERVAL source;
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1677 int position, length;
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1678 struct buffer *buffer;
4718
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1679 int inherit;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1680 {
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1681 register INTERVAL under, over, this, prev;
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1682 register INTERVAL tree;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1683
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1684 tree = BUF_INTERVALS (buffer);
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1685
40920
eb5f176de735 (graft_intervals_into_buffer):
Richard M. Stallman <rms@gnu.org>
parents: 40798
diff changeset
1686 /* If the new text has no properties, then with inheritance it
eb5f176de735 (graft_intervals_into_buffer):
Richard M. Stallman <rms@gnu.org>
parents: 40798
diff changeset
1687 becomes part of whatever interval it was inserted into.
eb5f176de735 (graft_intervals_into_buffer):
Richard M. Stallman <rms@gnu.org>
parents: 40798
diff changeset
1688 To prevent inheritance, we must clear out the properties
eb5f176de735 (graft_intervals_into_buffer):
Richard M. Stallman <rms@gnu.org>
parents: 40798
diff changeset
1689 of the newly inserted text. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1690 if (NULL_INTERVAL_P (source))
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1691 {
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1692 Lisp_Object buf;
41531
960d5d2165b3 (graft_intervals_into_buffer):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 40920
diff changeset
1693 if (!inherit && !NULL_INTERVAL_P (tree) && length > 0)
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1694 {
9271
1971a6a8cdc0 (graft_intervals_into_buffer): Use new accessor macros instead of calling XSET
Karl Heuer <kwzh@gnu.org>
parents: 9125
diff changeset
1695 XSETBUFFER (buf, buffer);
40920
eb5f176de735 (graft_intervals_into_buffer):
Richard M. Stallman <rms@gnu.org>
parents: 40798
diff changeset
1696 set_text_properties_1 (make_number (position),
eb5f176de735 (graft_intervals_into_buffer):
Richard M. Stallman <rms@gnu.org>
parents: 40798
diff changeset
1697 make_number (position + length),
eb5f176de735 (graft_intervals_into_buffer):
Richard M. Stallman <rms@gnu.org>
parents: 40798
diff changeset
1698 Qnil, buf, 0);
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1699 }
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1700 if (! NULL_INTERVAL_P (BUF_INTERVALS (buffer)))
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1701 BUF_INTERVALS (buffer) = balance_an_interval (BUF_INTERVALS (buffer));
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1702 return;
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1703 }
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1704
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1705 if (NULL_INTERVAL_P (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1706 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1707 /* The inserted text constitutes the whole buffer, so
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1708 simply copy over the interval structure. */
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1709 if ((BUF_Z (buffer) - BUF_BEG (buffer)) == TOTAL_LENGTH (source))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1710 {
4223
b044f6d3c4cb (graft_intervals_into_buffer): When TREE is null,
Richard M. Stallman <rms@gnu.org>
parents: 4135
diff changeset
1711 Lisp_Object buf;
9271
1971a6a8cdc0 (graft_intervals_into_buffer): Use new accessor macros instead of calling XSET
Karl Heuer <kwzh@gnu.org>
parents: 9125
diff changeset
1712 XSETBUFFER (buf, buffer);
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1713 BUF_INTERVALS (buffer) = reproduce_tree_obj (source, buf);
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1714 BUF_INTERVALS (buffer)->position = 1;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1715
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1716 /* Explicitly free the old tree here? */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1717
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1718 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1719 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1720
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1721 /* Create an interval tree in which to place a copy
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1722 of the intervals of the inserted string. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1723 {
1307
b469633740b3 Fixed typos.
Joseph Arceneaux <jla@gnu.org>
parents: 1303
diff changeset
1724 Lisp_Object buf;
9271
1971a6a8cdc0 (graft_intervals_into_buffer): Use new accessor macros instead of calling XSET
Karl Heuer <kwzh@gnu.org>
parents: 9125
diff changeset
1725 XSETBUFFER (buf, buffer);
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1726 tree = create_root_interval (buf);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1727 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1728 }
4718
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1729 else if (TOTAL_LENGTH (tree) == TOTAL_LENGTH (source))
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1730 /* If the buffer contains only the new string, but
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1731 there was already some interval tree there, then it may be
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1732 some zero length intervals. Eventually, do something clever
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1733 about inserting properly. For now, just waste the old intervals. */
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1734 {
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
1735 BUF_INTERVALS (buffer) = reproduce_tree (source, INTERVAL_PARENT (tree));
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1736 BUF_INTERVALS (buffer)->position = 1;
4718
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1737 /* Explicitly free the old tree here. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1738
4718
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1739 return;
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1740 }
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1741 /* Paranoia -- the text has already been added, so this buffer
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1742 should be of non-zero length. */
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1743 else if (TOTAL_LENGTH (tree) == 0)
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1744 abort ();
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1745
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1746 this = under = find_interval (tree, position);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1747 if (NULL_INTERVAL_P (under)) /* Paranoia */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1748 abort ();
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1749 over = find_interval (source, interval_start_pos (source));
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1750
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1751 /* Here for insertion in the middle of an interval.
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1752 Split off an equivalent interval to the right,
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1753 then don't bother with it any more. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1754
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1755 if (position > under->position)
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1756 {
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1757 INTERVAL end_unchanged
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1758 = split_interval_left (this, position - under->position);
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1759 copy_properties (under, end_unchanged);
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1760 under->position = position;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1761 }
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1762 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1763 {
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1764 /* This call may have some effect because previous_interval may
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1765 update `position' fields of intervals. Thus, don't ignore it
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1766 for the moment. Someone please tell me the truth (K.Handa). */
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1767 prev = previous_interval (under);
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1768 #if 0
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1769 /* But, this code surely has no effect. And, anyway,
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1770 END_NONSTICKY_P is unreliable now. */
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1771 if (prev && !END_NONSTICKY_P (prev))
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1772 prev = 0;
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
1773 #endif /* 0 */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1774 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1775
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1776 /* Insertion is now at beginning of UNDER. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1777
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1778 /* The inserted text "sticks" to the interval `under',
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1779 which means it gets those properties.
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1780 The properties of under are the result of
14036
621a575db6f7 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 13028
diff changeset
1781 adjust_intervals_for_insertion, so stickiness has
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1782 already been taken care of. */
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1783
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1784 while (! NULL_INTERVAL_P (over))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1785 {
5666
ceed2e32b303 (graft_intervals_into_buffer): Fix one-off
Richard M. Stallman <rms@gnu.org>
parents: 5415
diff changeset
1786 if (LENGTH (over) < LENGTH (under))
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1787 {
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1788 this = split_interval_left (under, LENGTH (over));
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1789 copy_properties (under, this);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1790 }
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1791 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1792 this = under;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1793 copy_properties (over, this);
4718
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1794 if (inherit)
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1795 merge_properties (over, this);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1796 else
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1797 copy_properties (over, this);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1798 over = next_interval (over);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1799 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1800
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1801 if (! NULL_INTERVAL_P (BUF_INTERVALS (buffer)))
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1802 BUF_INTERVALS (buffer) = balance_an_interval (BUF_INTERVALS (buffer));
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1803 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1804 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1805
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
1806 /* Get the value of property PROP from PLIST,
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
1807 which is the plist of an interval.
10927
7d02d12082ff (textget): Check default_properties vbl too.
Boris Goldowsky <boris@gnu.org>
parents: 10563
diff changeset
1808 We check for direct properties, for categories with property PROP,
11133
119880025e8f (Vdefault_text_properties): name changed from Vdefault_properties.
Boris Goldowsky <boris@gnu.org>
parents: 10927
diff changeset
1809 and for PROP appearing on the default-text-properties list. */
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
1810
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
1811 Lisp_Object
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1812 textget (plist, prop)
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1813 Lisp_Object plist;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1814 register Lisp_Object prop;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1815 {
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
1816 register Lisp_Object tail, fallback;
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
1817 fallback = Qnil;
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1818
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1819 for (tail = plist; !NILP (tail); tail = Fcdr (Fcdr (tail)))
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1820 {
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1821 register Lisp_Object tem;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1822 tem = Fcar (tail);
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1823 if (EQ (prop, tem))
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1824 return Fcar (Fcdr (tail));
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
1825 if (EQ (tem, Qcategory))
8611
65a058371675 (textget): Ignore category prop if not a symbol.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
1826 {
65a058371675 (textget): Ignore category prop if not a symbol.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
1827 tem = Fcar (Fcdr (tail));
65a058371675 (textget): Ignore category prop if not a symbol.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
1828 if (SYMBOLP (tem))
65a058371675 (textget): Ignore category prop if not a symbol.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
1829 fallback = Fget (tem, prop);
65a058371675 (textget): Ignore category prop if not a symbol.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
1830 }
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1831 }
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
1832
10927
7d02d12082ff (textget): Check default_properties vbl too.
Boris Goldowsky <boris@gnu.org>
parents: 10563
diff changeset
1833 if (! NILP (fallback))
7d02d12082ff (textget): Check default_properties vbl too.
Boris Goldowsky <boris@gnu.org>
parents: 10563
diff changeset
1834 return fallback;
11133
119880025e8f (Vdefault_text_properties): name changed from Vdefault_properties.
Boris Goldowsky <boris@gnu.org>
parents: 10927
diff changeset
1835 if (CONSP (Vdefault_text_properties))
119880025e8f (Vdefault_text_properties): name changed from Vdefault_properties.
Boris Goldowsky <boris@gnu.org>
parents: 10927
diff changeset
1836 return Fplist_get (Vdefault_text_properties, prop);
10927
7d02d12082ff (textget): Check default_properties vbl too.
Boris Goldowsky <boris@gnu.org>
parents: 10563
diff changeset
1837 return Qnil;
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1838 }
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1839
2052
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
1840
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1841 /* Set point "temporarily", without checking any text properties. */
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1842
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1843 INLINE void
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1844 temp_set_point (buffer, charpos)
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1845 struct buffer *buffer;
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1846 int charpos;
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1847 {
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1848 temp_set_point_both (buffer, charpos,
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1849 buf_charpos_to_bytepos (buffer, charpos));
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1850 }
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1851
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1852 /* Set point in BUFFER "temporarily" to CHARPOS, which corresponds to
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1853 byte position BYTEPOS. */
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1854
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1855 INLINE void
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1856 temp_set_point_both (buffer, charpos, bytepos)
20936
5c60cd16452b (temp_set_point_both): Declare arg BYTEPOS as int.
Kenichi Handa <handa@m17n.org>
parents: 20908
diff changeset
1857 int charpos, bytepos;
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1858 struct buffer *buffer;
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1859 {
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1860 /* In a single-byte buffer, the two positions must be equal. */
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1861 if (BUF_ZV (buffer) == BUF_ZV_BYTE (buffer)
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1862 && charpos != bytepos)
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1863 abort ();
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1864
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1865 if (charpos > bytepos)
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1866 abort ();
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1867
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1868 if (charpos > BUF_ZV (buffer) || charpos < BUF_BEGV (buffer))
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1869 abort ();
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1870
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1871 BUF_PT_BYTE (buffer) = bytepos;
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1872 BUF_PT (buffer) = charpos;
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1873 }
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1874
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1875 /* Set point in BUFFER to CHARPOS. If the target position is
7104
9c99683eb6f0 Fix comment.
Karl Heuer <kwzh@gnu.org>
parents: 6753
diff changeset
1876 before an intangible character, move to an ok place. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1877
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1878 void
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1879 set_point (buffer, charpos)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1880 register struct buffer *buffer;
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1881 register int charpos;
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1882 {
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1883 set_point_both (buffer, charpos, buf_charpos_to_bytepos (buffer, charpos));
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1884 }
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1885
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1886 /* Set point in BUFFER to CHARPOS, which corresponds to byte
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1887 position BYTEPOS. If the target position is
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1888 before an intangible character, move to an ok place. */
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1889
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1890 void
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1891 set_point_both (buffer, charpos, bytepos)
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1892 register struct buffer *buffer;
20936
5c60cd16452b (temp_set_point_both): Declare arg BYTEPOS as int.
Kenichi Handa <handa@m17n.org>
parents: 20908
diff changeset
1893 register int charpos, bytepos;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1894 {
25747
062f4c69ff56 (rotate_right, rotate_left): Add braces to avoid
Gerd Moellmann <gerd@gnu.org>
parents: 25662
diff changeset
1895 register INTERVAL to, from, toprev, fromprev;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1896 int buffer_point;
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1897 int old_position = BUF_PT (buffer);
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1898 int backwards = (charpos < old_position ? 1 : 0);
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1899 int have_overlays;
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1900 int original_position;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1901
10563
d35f5eca6dd5 (set_point): Set point_before_scroll to nil.
Richard M. Stallman <rms@gnu.org>
parents: 10313
diff changeset
1902 buffer->point_before_scroll = Qnil;
d35f5eca6dd5 (set_point): Set point_before_scroll to nil.
Richard M. Stallman <rms@gnu.org>
parents: 10313
diff changeset
1903
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1904 if (charpos == BUF_PT (buffer))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1905 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1906
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1907 /* In a single-byte buffer, the two positions must be equal. */
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1908 if (BUF_ZV (buffer) == BUF_ZV_BYTE (buffer)
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1909 && charpos != bytepos)
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1910 abort ();
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1911
2779
857bb0f59668 * intervals.c (set_point): Check for point out of bounds before
Jim Blandy <jimb@redhat.com>
parents: 2090
diff changeset
1912 /* Check this now, before checking if the buffer has any intervals.
857bb0f59668 * intervals.c (set_point): Check for point out of bounds before
Jim Blandy <jimb@redhat.com>
parents: 2090
diff changeset
1913 That way, we can catch conditions which break this sanity check
857bb0f59668 * intervals.c (set_point): Check for point out of bounds before
Jim Blandy <jimb@redhat.com>
parents: 2090
diff changeset
1914 whether or not there are intervals in the buffer. */
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1915 if (charpos > BUF_ZV (buffer) || charpos < BUF_BEGV (buffer))
2779
857bb0f59668 * intervals.c (set_point): Check for point out of bounds before
Jim Blandy <jimb@redhat.com>
parents: 2090
diff changeset
1916 abort ();
857bb0f59668 * intervals.c (set_point): Check for point out of bounds before
Jim Blandy <jimb@redhat.com>
parents: 2090
diff changeset
1917
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1918 have_overlays = (! NILP (buffer->overlays_before)
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1919 || ! NILP (buffer->overlays_after));
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1920
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1921 /* If we have no text properties and overlays,
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1922 then we can do it quickly. */
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1923 if (NULL_INTERVAL_P (BUF_INTERVALS (buffer)) && ! have_overlays)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1924 {
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1925 temp_set_point_both (buffer, charpos, bytepos);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1926 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1927 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1928
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1929 /* Set TO to the interval containing the char after CHARPOS,
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1930 and TOPREV to the interval containing the char before CHARPOS.
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1931 Either one may be null. They may be equal. */
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1932 to = find_interval (BUF_INTERVALS (buffer), charpos);
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1933 if (charpos == BUF_BEGV (buffer))
2052
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
1934 toprev = 0;
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1935 else if (to && to->position == charpos)
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1936 toprev = previous_interval (to);
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1937 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1938 toprev = to;
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1939
2052
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
1940 buffer_point = (BUF_PT (buffer) == BUF_ZV (buffer)
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
1941 ? BUF_ZV (buffer) - 1
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1942 : BUF_PT (buffer));
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1943
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1944 /* Set FROM to the interval containing the char after PT,
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1945 and FROMPREV to the interval containing the char before PT.
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1946 Either one may be null. They may be equal. */
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1947 /* We could cache this and save time. */
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1948 from = find_interval (BUF_INTERVALS (buffer), buffer_point);
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1949 if (buffer_point == BUF_BEGV (buffer))
2052
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
1950 fromprev = 0;
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1951 else if (from && from->position == BUF_PT (buffer))
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1952 fromprev = previous_interval (from);
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1953 else if (buffer_point != BUF_PT (buffer))
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1954 fromprev = from, from = 0;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1955 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1956 fromprev = from;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1957
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1958 /* Moving within an interval. */
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1959 if (to == from && toprev == fromprev && INTERVAL_VISIBLE_P (to)
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1960 && ! have_overlays)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1961 {
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1962 temp_set_point_both (buffer, charpos, bytepos);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1963 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1964 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1965
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1966 original_position = charpos;
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1967
11327
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1968 /* If the new position is between two intangible characters
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1969 with the same intangible property value,
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1970 move forward or backward until a change in that property. */
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1971 if (NILP (Vinhibit_point_motion_hooks)
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1972 && ((! NULL_INTERVAL_P (to) && ! NULL_INTERVAL_P (toprev))
16716
2ecf4bb329a8 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16708
diff changeset
1973 || have_overlays)
2ecf4bb329a8 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16708
diff changeset
1974 /* Intangibility never stops us from positioning at the beginning
2ecf4bb329a8 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16708
diff changeset
1975 or end of the buffer, so don't bother checking in that case. */
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1976 && charpos != BEGV && charpos != ZV)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1977 {
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1978 Lisp_Object intangible_propval;
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1979 Lisp_Object pos;
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1980
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1981 XSETINT (pos, charpos);
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1982
9072
21517199cfae (set_point): If Vinhibit_point_motion_hooks, ignore intangible properties.
Richard M. Stallman <rms@gnu.org>
parents: 8897
diff changeset
1983 if (backwards)
21517199cfae (set_point): If Vinhibit_point_motion_hooks, ignore intangible properties.
Richard M. Stallman <rms@gnu.org>
parents: 8897
diff changeset
1984 {
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1985 intangible_propval = Fget_char_property (make_number (charpos),
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1986 Qintangible, Qnil);
11327
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1987
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1988 /* If following char is intangible,
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1989 skip back over all chars with matching intangible property. */
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1990 if (! NILP (intangible_propval))
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1991 while (XINT (pos) > BUF_BEGV (buffer)
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1992 && EQ (Fget_char_property (make_number (XINT (pos) - 1),
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1993 Qintangible, Qnil),
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1994 intangible_propval))
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1995 pos = Fprevious_char_property_change (pos, Qnil);
9072
21517199cfae (set_point): If Vinhibit_point_motion_hooks, ignore intangible properties.
Richard M. Stallman <rms@gnu.org>
parents: 8897
diff changeset
1996 }
3734
5ada670e1fd8 (set_point): When moving over invis chars,
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
1997 else
9072
21517199cfae (set_point): If Vinhibit_point_motion_hooks, ignore intangible properties.
Richard M. Stallman <rms@gnu.org>
parents: 8897
diff changeset
1998 {
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1999 intangible_propval = Fget_char_property (make_number (charpos - 1),
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2000 Qintangible, Qnil);
11327
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
2001
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2002 /* If following char is intangible,
24910
b991eeca9d59 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 24565
diff changeset
2003 skip forward over all chars with matching intangible property. */
11327
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
2004 if (! NILP (intangible_propval))
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2005 while (XINT (pos) < BUF_ZV (buffer)
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2006 && EQ (Fget_char_property (pos, Qintangible, Qnil),
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2007 intangible_propval))
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2008 pos = Fnext_char_property_change (pos, Qnil);
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2009
9072
21517199cfae (set_point): If Vinhibit_point_motion_hooks, ignore intangible properties.
Richard M. Stallman <rms@gnu.org>
parents: 8897
diff changeset
2010 }
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2011
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2012 charpos = XINT (pos);
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2013 bytepos = buf_charpos_to_bytepos (buffer, charpos);
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2014 }
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2015
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2016 if (charpos != original_position)
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2017 {
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2018 /* Set TO to the interval containing the char after CHARPOS,
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2019 and TOPREV to the interval containing the char before CHARPOS.
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2020 Either one may be null. They may be equal. */
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2021 to = find_interval (BUF_INTERVALS (buffer), charpos);
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2022 if (charpos == BUF_BEGV (buffer))
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2023 toprev = 0;
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2024 else if (to && to->position == charpos)
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2025 toprev = previous_interval (to);
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2026 else
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
2027 toprev = to;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2028 }
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2029
11327
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
2030 /* Here TO is the interval after the stopping point
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
2031 and TOPREV is the interval before the stopping point.
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
2032 One or the other may be null. */
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
2033
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2034 temp_set_point_both (buffer, charpos, bytepos);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2035
1288
b05982e82d93 Various comment changes.
Joseph Arceneaux <jla@gnu.org>
parents: 1211
diff changeset
2036 /* We run point-left and point-entered hooks here, iff the
b05982e82d93 Various comment changes.
Joseph Arceneaux <jla@gnu.org>
parents: 1211
diff changeset
2037 two intervals are not equivalent. These hooks take
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2038 (old_point, new_point) as arguments. */
4243
23fe7f6c9ae4 (set_point): Test Vinhibit_point_motion_hooks.
Richard M. Stallman <rms@gnu.org>
parents: 4223
diff changeset
2039 if (NILP (Vinhibit_point_motion_hooks)
23fe7f6c9ae4 (set_point): Test Vinhibit_point_motion_hooks.
Richard M. Stallman <rms@gnu.org>
parents: 4223
diff changeset
2040 && (! intervals_equal (from, to)
23fe7f6c9ae4 (set_point): Test Vinhibit_point_motion_hooks.
Richard M. Stallman <rms@gnu.org>
parents: 4223
diff changeset
2041 || ! intervals_equal (fromprev, toprev)))
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
2042 {
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2043 Lisp_Object leave_after, leave_before, enter_after, enter_before;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2044
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2045 if (fromprev)
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2046 leave_after = textget (fromprev->plist, Qpoint_left);
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2047 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2048 leave_after = Qnil;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2049 if (from)
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2050 leave_before = textget (from->plist, Qpoint_left);
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2051 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2052 leave_before = Qnil;
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
2053
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2054 if (toprev)
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2055 enter_after = textget (toprev->plist, Qpoint_entered);
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2056 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2057 enter_after = Qnil;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2058 if (to)
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2059 enter_before = textget (to->plist, Qpoint_entered);
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2060 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2061 enter_before = Qnil;
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
2062
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2063 if (! EQ (leave_before, enter_before) && !NILP (leave_before))
18743
1c1a002339a5 (set_point): Convert call2 arguments to Lisp_Integer.
Richard M. Stallman <rms@gnu.org>
parents: 18613
diff changeset
2064 call2 (leave_before, make_number (old_position),
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2065 make_number (charpos));
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2066 if (! EQ (leave_after, enter_after) && !NILP (leave_after))
18743
1c1a002339a5 (set_point): Convert call2 arguments to Lisp_Integer.
Richard M. Stallman <rms@gnu.org>
parents: 18613
diff changeset
2067 call2 (leave_after, make_number (old_position),
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2068 make_number (charpos));
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2069
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2070 if (! EQ (enter_before, leave_before) && !NILP (enter_before))
18743
1c1a002339a5 (set_point): Convert call2 arguments to Lisp_Integer.
Richard M. Stallman <rms@gnu.org>
parents: 18613
diff changeset
2071 call2 (enter_before, make_number (old_position),
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2072 make_number (charpos));
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
2073 if (! EQ (enter_after, leave_after) && !NILP (enter_after))
18743
1c1a002339a5 (set_point): Convert call2 arguments to Lisp_Integer.
Richard M. Stallman <rms@gnu.org>
parents: 18613
diff changeset
2074 call2 (enter_after, make_number (old_position),
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2075 make_number (charpos));
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
2076 }
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2077 }
2052
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
2078
18076
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2079 /* Move point to POSITION, unless POSITION is inside an intangible
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2080 segment that reaches all the way to point. */
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2081
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2082 void
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2083 move_if_not_intangible (position)
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2084 int position;
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2085 {
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2086 Lisp_Object pos;
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2087 Lisp_Object intangible_propval;
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2088
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2089 XSETINT (pos, position);
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2090
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2091 if (! NILP (Vinhibit_point_motion_hooks))
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2092 /* If intangible is inhibited, always move point to POSITION. */
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2093 ;
18613
614b916ff5bf Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents: 18125
diff changeset
2094 else if (PT < position && XINT (pos) < ZV)
18076
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2095 {
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2096 /* We want to move forward, so check the text before POSITION. */
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2097
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2098 intangible_propval = Fget_char_property (pos,
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2099 Qintangible, Qnil);
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2100
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2101 /* If following char is intangible,
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2102 skip back over all chars with matching intangible property. */
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2103 if (! NILP (intangible_propval))
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2104 while (XINT (pos) > BEGV
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2105 && EQ (Fget_char_property (make_number (XINT (pos) - 1),
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2106 Qintangible, Qnil),
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2107 intangible_propval))
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2108 pos = Fprevious_char_property_change (pos, Qnil);
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2109 }
18613
614b916ff5bf Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents: 18125
diff changeset
2110 else if (XINT (pos) > BEGV)
18076
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2111 {
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2112 /* We want to move backward, so check the text after POSITION. */
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2113
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2114 intangible_propval = Fget_char_property (make_number (XINT (pos) - 1),
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2115 Qintangible, Qnil);
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2116
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2117 /* If following char is intangible,
24910
b991eeca9d59 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 24565
diff changeset
2118 skip forward over all chars with matching intangible property. */
18076
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2119 if (! NILP (intangible_propval))
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2120 while (XINT (pos) < ZV
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2121 && EQ (Fget_char_property (pos, Qintangible, Qnil),
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2122 intangible_propval))
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2123 pos = Fnext_char_property_change (pos, Qnil);
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2124
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2125 }
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2126
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2127 /* If the whole stretch between PT and POSITION isn't intangible,
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2128 try moving to POSITION (which means we actually move farther
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2129 if POSITION is inside of intangible text). */
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2130
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2131 if (XINT (pos) != PT)
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2132 SET_PT (position);
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2133 }
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2134
26862
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2135 /* If text at position POS has property PROP, set *VAL to the property
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2136 value, *START and *END to the beginning and end of a region that
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2137 has the same property, and return 1. Otherwise return 0.
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2138
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2139 OBJECT is the string or buffer to look for the property in;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2140 nil means the current buffer. */
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2141
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2142 int
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2143 get_property_and_range (pos, prop, val, start, end, object)
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2144 int pos;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2145 Lisp_Object prop, *val;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2146 int *start, *end;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2147 Lisp_Object object;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2148 {
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2149 INTERVAL i, prev, next;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2150
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2151 if (NILP (object))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2152 i = find_interval (BUF_INTERVALS (current_buffer), pos);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2153 else if (BUFFERP (object))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2154 i = find_interval (BUF_INTERVALS (XBUFFER (object)), pos);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2155 else if (STRINGP (object))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2156 i = find_interval (XSTRING (object)->intervals, pos);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2157 else
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2158 abort ();
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2159
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2160 if (NULL_INTERVAL_P (i) || (i->position + LENGTH (i) <= pos))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2161 return 0;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2162 *val = textget (i->plist, prop);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2163 if (NILP (*val))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2164 return 0;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2165
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2166 next = i; /* remember it in advance */
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2167 prev = previous_interval (i);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2168 while (! NULL_INTERVAL_P (prev)
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2169 && EQ (*val, textget (prev->plist, prop)))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2170 i = prev, prev = previous_interval (prev);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2171 *start = i->position;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2172
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2173 next = next_interval (i);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2174 while (! NULL_INTERVAL_P (next)
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2175 && EQ (*val, textget (next->plist, prop)))
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2176 i = next, next = next_interval (next);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2177 *end = i->position + LENGTH (i);
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2178
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2179 return 1;
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2180 }
abfcde8428cb (adjust_intervals_for_insertion): To check stickines
Kenichi Handa <handa@m17n.org>
parents: 26404
diff changeset
2181
35256
f39ff8270082 (get_local_map): Change TYPE to Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents: 34959
diff changeset
2182 /* Return the proper local keymap TYPE for position POSITION in
f39ff8270082 (get_local_map): Change TYPE to Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents: 34959
diff changeset
2183 BUFFER; TYPE should be one of `keymap' or `local-map'. Use the map
f39ff8270082 (get_local_map): Change TYPE to Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents: 34959
diff changeset
2184 specified by the PROP property, if any. Otherwise, if TYPE is
f39ff8270082 (get_local_map): Change TYPE to Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents: 34959
diff changeset
2185 `local-map' use BUFFER's local map. */
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2186
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2187 Lisp_Object
29278
fcb030c7708e (get_local_map): Extra arg to allow looking for `keymap' too.
Dave Love <fx@gnu.org>
parents: 28406
diff changeset
2188 get_local_map (position, buffer, type)
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2189 register int position;
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2190 register struct buffer *buffer;
35256
f39ff8270082 (get_local_map): Change TYPE to Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents: 34959
diff changeset
2191 Lisp_Object type;
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2192 {
34959
b96af6cd903d (get_local_map): Remove unused variable `tem'.
Eli Zaretskii <eliz@gnu.org>
parents: 32988
diff changeset
2193 Lisp_Object prop, lispy_position, lispy_buffer;
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2194 int old_begv, old_zv, old_begv_byte, old_zv_byte;
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2195
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
2196 /* Perhaps we should just change `position' to the limit. */
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2197 if (position > BUF_Z (buffer) || position < BUF_BEG (buffer))
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2198 abort ();
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2199
11660
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2200 /* Ignore narrowing, so that a local map continues to be valid even if
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2201 the visible region contains no characters and hence no properties. */
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2202 old_begv = BUF_BEGV (buffer);
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2203 old_zv = BUF_ZV (buffer);
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2204 old_begv_byte = BUF_BEGV_BYTE (buffer);
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2205 old_zv_byte = BUF_ZV_BYTE (buffer);
11660
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2206 BUF_BEGV (buffer) = BUF_BEG (buffer);
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2207 BUF_ZV (buffer) = BUF_Z (buffer);
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2208 BUF_BEGV_BYTE (buffer) = BUF_BEG_BYTE (buffer);
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2209 BUF_ZV_BYTE (buffer) = BUF_Z_BYTE (buffer);
11660
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2210
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2211 /* There are no properties at the end of the buffer, so in that case
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2212 check for a local map on the last character of the buffer instead. */
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2213 if (position == BUF_Z (buffer) && BUF_Z (buffer) > BUF_BEG (buffer))
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2214 --position;
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2215 XSETFASTINT (lispy_position, position);
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2216 XSETBUFFER (lispy_buffer, buffer);
35256
f39ff8270082 (get_local_map): Change TYPE to Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents: 34959
diff changeset
2217 prop = Fget_char_property (lispy_position, type, lispy_buffer);
11660
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2218
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2219 BUF_BEGV (buffer) = old_begv;
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2220 BUF_ZV (buffer) = old_zv;
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2221 BUF_BEGV_BYTE (buffer) = old_begv_byte;
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2222 BUF_ZV_BYTE (buffer) = old_zv_byte;
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2223
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2224 /* Use the local map only if it is valid. */
32988
c3435dc00ed7 * lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29278
diff changeset
2225 prop = get_keymap (prop, 0, 0);
c3435dc00ed7 * lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29278
diff changeset
2226 if (CONSP (prop))
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2227 return prop;
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2228
35256
f39ff8270082 (get_local_map): Change TYPE to Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents: 34959
diff changeset
2229 if (EQ (type, Qkeymap))
29278
fcb030c7708e (get_local_map): Extra arg to allow looking for `keymap' too.
Dave Love <fx@gnu.org>
parents: 28406
diff changeset
2230 return Qnil;
fcb030c7708e (get_local_map): Extra arg to allow looking for `keymap' too.
Dave Love <fx@gnu.org>
parents: 28406
diff changeset
2231 else
fcb030c7708e (get_local_map): Extra arg to allow looking for `keymap' too.
Dave Love <fx@gnu.org>
parents: 28406
diff changeset
2232 return buffer->keymap;
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2233 }
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2234
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
2235 /* Produce an interval tree reflecting the intervals in
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2236 TREE from START to START + LENGTH.
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2237 The new interval tree has no parent and has a starting-position of 0. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2238
1316
f09c5c6563b8 * intervals.c: `copy_intervals()' no longer static.
Joseph Arceneaux <jla@gnu.org>
parents: 1307
diff changeset
2239 INTERVAL
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2240 copy_intervals (tree, start, length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2241 INTERVAL tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2242 int start, length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2243 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2244 register INTERVAL i, new, t;
3490
07b454ddc666 (copy_intervals): Don't adjust total_length at the end.
Richard M. Stallman <rms@gnu.org>
parents: 3333
diff changeset
2245 register int got, prevlen;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2246
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2247 if (NULL_INTERVAL_P (tree) || length <= 0)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2248 return NULL_INTERVAL;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2249
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2250 i = find_interval (tree, start);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2251 if (NULL_INTERVAL_P (i) || LENGTH (i) == 0)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2252 abort ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2253
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
2254 /* If there is only one interval and it's the default, return nil. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2255 if ((start - i->position + 1 + length) < LENGTH (i)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2256 && DEFAULT_INTERVAL_P (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2257 return NULL_INTERVAL;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2258
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2259 new = make_interval ();
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2260 new->position = 0;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2261 got = (LENGTH (i) - (start - i->position));
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
2262 new->total_length = length;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2263 copy_properties (i, new);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2264
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2265 t = new;
3490
07b454ddc666 (copy_intervals): Don't adjust total_length at the end.
Richard M. Stallman <rms@gnu.org>
parents: 3333
diff changeset
2266 prevlen = got;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2267 while (got < length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2268 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2269 i = next_interval (i);
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
2270 t = split_interval_right (t, prevlen);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2271 copy_properties (i, t);
3490
07b454ddc666 (copy_intervals): Don't adjust total_length at the end.
Richard M. Stallman <rms@gnu.org>
parents: 3333
diff changeset
2272 prevlen = LENGTH (i);
07b454ddc666 (copy_intervals): Don't adjust total_length at the end.
Richard M. Stallman <rms@gnu.org>
parents: 3333
diff changeset
2273 got += prevlen;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2274 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2275
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
2276 return balance_an_interval (new);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2277 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2278
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
2279 /* Give STRING the properties of BUFFER from POSITION to LENGTH. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2280
1288
b05982e82d93 Various comment changes.
Joseph Arceneaux <jla@gnu.org>
parents: 1211
diff changeset
2281 INLINE void
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2282 copy_intervals_to_string (string, buffer, position, length)
16110
4b672131c37f (copy_intervals_to_string): Take arg as buffer.
Richard M. Stallman <rms@gnu.org>
parents: 15734
diff changeset
2283 Lisp_Object string;
4b672131c37f (copy_intervals_to_string): Take arg as buffer.
Richard M. Stallman <rms@gnu.org>
parents: 15734
diff changeset
2284 struct buffer *buffer;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2285 int position, length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2286 {
16110
4b672131c37f (copy_intervals_to_string): Take arg as buffer.
Richard M. Stallman <rms@gnu.org>
parents: 15734
diff changeset
2287 INTERVAL interval_copy = copy_intervals (BUF_INTERVALS (buffer),
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2288 position, length);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2289 if (NULL_INTERVAL_P (interval_copy))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2290 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2291
28269
fd13be8ae190 Changes towards better type safety regarding intervals, primarily
Ken Raeburn <raeburn@raeburn.org>
parents: 26862
diff changeset
2292 SET_INTERVAL_OBJECT (interval_copy, string);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2293 XSTRING (string)->intervals = interval_copy;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2294 }
10113
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2295
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2296 /* Return 1 if strings S1 and S2 have identical properties; 0 otherwise.
10113
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2297 Assume they have identical characters. */
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2298
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2299 int
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2300 compare_string_intervals (s1, s2)
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2301 Lisp_Object s1, s2;
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2302 {
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2303 INTERVAL i1, i2;
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2304 int pos = 0;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2305 int end = XSTRING (s1)->size;
10113
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2306
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2307 i1 = find_interval (XSTRING (s1)->intervals, 0);
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2308 i2 = find_interval (XSTRING (s2)->intervals, 0);
10113
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2309
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2310 while (pos < end)
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2311 {
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2312 /* Determine how far we can go before we reach the end of I1 or I2. */
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2313 int len1 = (i1 != 0 ? INTERVAL_LAST_POS (i1) : end) - pos;
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2314 int len2 = (i2 != 0 ? INTERVAL_LAST_POS (i2) : end) - pos;
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2315 int distance = min (len1, len2);
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2316
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2317 /* If we ever find a mismatch between the strings,
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2318 they differ. */
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2319 if (! intervals_equal (i1, i2))
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2320 return 0;
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2321
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2322 /* Advance POS till the end of the shorter interval,
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2323 and advance one or both interval pointers for the new position. */
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2324 pos += distance;
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2325 if (len1 == distance)
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2326 i1 = next_interval (i1);
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2327 if (len2 == distance)
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2328 i2 = next_interval (i2);
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2329 }
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2330 return 1;
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2331 }
20677
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2332
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2333 /* Recursively adjust interval I in the current buffer
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2334 for setting enable_multibyte_characters to MULTI_FLAG.
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2335 The range of interval I is START ... END in characters,
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2336 START_BYTE ... END_BYTE in bytes. */
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2337
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2338 static void
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2339 set_intervals_multibyte_1 (i, multi_flag, start, start_byte, end, end_byte)
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2340 INTERVAL i;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2341 int multi_flag;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2342 int start, start_byte, end, end_byte;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2343 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2344 /* Fix the length of this interval. */
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2345 if (multi_flag)
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2346 i->total_length = end - start;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2347 else
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2348 i->total_length = end_byte - start_byte;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2349
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2350 /* Recursively fix the length of the subintervals. */
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2351 if (i->left)
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2352 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2353 int left_end, left_end_byte;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2354
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2355 if (multi_flag)
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2356 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2357 left_end_byte = start_byte + LEFT_TOTAL_LENGTH (i);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2358 left_end = BYTE_TO_CHAR (left_end_byte);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2359 }
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2360 else
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2361 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2362 left_end = start + LEFT_TOTAL_LENGTH (i);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2363 left_end_byte = CHAR_TO_BYTE (left_end);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2364 }
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2365
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2366 set_intervals_multibyte_1 (i->left, multi_flag, start, start_byte,
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2367 left_end, left_end_byte);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2368 }
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2369 if (i->right)
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2370 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2371 int right_start_byte, right_start;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2372
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2373 if (multi_flag)
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2374 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2375 right_start_byte = end_byte - RIGHT_TOTAL_LENGTH (i);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2376 right_start = BYTE_TO_CHAR (right_start_byte);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2377 }
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2378 else
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2379 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2380 right_start = end - RIGHT_TOTAL_LENGTH (i);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2381 right_start_byte = CHAR_TO_BYTE (right_start);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2382 }
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2383
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2384 set_intervals_multibyte_1 (i->right, multi_flag,
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2385 right_start, right_start_byte,
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2386 end, end_byte);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2387 }
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2388 }
1301
5a27062b8b7f * intervals.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents: 1288
diff changeset
2389
21351
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2390 /* Update the intervals of the current buffer
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2391 to fit the contents as multibyte (if MULTI_FLAG is 1)
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2392 or to fit them as non-multibyte (if MULTI_FLAG is 0). */
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2393
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2394 void
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2395 set_intervals_multibyte (multi_flag)
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2396 int multi_flag;
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2397 {
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2398 if (BUF_INTERVALS (current_buffer))
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2399 set_intervals_multibyte_1 (BUF_INTERVALS (current_buffer), multi_flag,
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2400 BEG, BEG_BYTE, Z, Z_BYTE);
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2401 }