annotate src/intervals.c @ 23323:0800a4f84757

(underlying_strftime): Set the buffer to a nonzero value before calling strftime, and check to see whether strftime has set the buffer to zero. This lets us distinguish between an empty buffer and an error. I'm installing this patch by hand now; it will be superseded whenever the glibc sources are propagated back to fsf.org.
author Paul Eggert <eggert@twinsun.com>
date Fri, 25 Sep 1998 21:40:23 +0000
parents 542ccfb606c3
children 6a5e69bcf530
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"
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
48
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
49 /* The rest of the file is within this conditional. */
1301
5a27062b8b7f * intervals.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents: 1288
diff changeset
50 #ifdef USE_TEXT_PROPERTIES
5a27062b8b7f * intervals.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents: 1288
diff changeset
51
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
52 /* 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
53 universal set. */
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
54
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
55 #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
56
10113
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
57 #define min(x, y) ((x) < (y) ? (x) : (y))
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
58
5173
d48ba25b35bf (merge_properties_sticky): Declared.
Richard M. Stallman <rms@gnu.org>
parents: 5169
diff changeset
59 Lisp_Object merge_properties_sticky ();
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
60
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
61 /* Utility functions for intervals. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
62
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
63
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
64 /* Create the root interval of some object, a buffer or string. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
65
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
66 INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
67 create_root_interval (parent)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
68 Lisp_Object parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
69 {
4962
99edf052bfa0 Include puresize.h.
Richard M. Stallman <rms@gnu.org>
parents: 4718
diff changeset
70 INTERVAL new;
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 CHECK_IMPURE (parent);
99edf052bfa0 Include puresize.h.
Richard M. Stallman <rms@gnu.org>
parents: 4718
diff changeset
73
99edf052bfa0 Include puresize.h.
Richard M. Stallman <rms@gnu.org>
parents: 4718
diff changeset
74 new = make_interval ();
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
75
9125
a78f02f76f03 (create_root_interval, balance_possible_root_interval, delete_interval): Use
Karl Heuer <kwzh@gnu.org>
parents: 9072
diff changeset
76 if (BUFFERP (parent))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
77 {
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
78 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
79 - BUF_BEG (XBUFFER (parent)));
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
80 BUF_INTERVALS (XBUFFER (parent)) = new;
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
81 new->position = 1;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
82 }
9125
a78f02f76f03 (create_root_interval, balance_possible_root_interval, delete_interval): Use
Karl Heuer <kwzh@gnu.org>
parents: 9072
diff changeset
83 else if (STRINGP (parent))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
84 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
85 new->total_length = XSTRING (parent)->size;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
86 XSTRING (parent)->intervals = new;
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
87 new->position = 0;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
88 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
89
18613
614b916ff5bf Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents: 18125
diff changeset
90 new->parent = (INTERVAL) XFASTINT (parent);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
91
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
92 return new;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
93 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
94
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
95 /* Make the interval TARGET have exactly the properties of SOURCE */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
96
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
97 void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
98 copy_properties (source, target)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
99 register INTERVAL source, target;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
100 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
101 if (DEFAULT_INTERVAL_P (source) && DEFAULT_INTERVAL_P (target))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
102 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
103
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
104 COPY_INTERVAL_CACHE (source, target);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
105 target->plist = Fcopy_sequence (source->plist);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
106 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
107
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
108 /* 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
109 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
110 is added to TARGET if TARGET has no such property as yet. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
111
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
112 static void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
113 merge_properties (source, target)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
114 register INTERVAL source, target;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
115 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
116 register Lisp_Object o, sym, val;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
117
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
118 if (DEFAULT_INTERVAL_P (source) && DEFAULT_INTERVAL_P (target))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
119 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
120
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
121 MERGE_INTERVAL_CACHE (source, target);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
122
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
123 o = source->plist;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
124 while (! EQ (o, Qnil))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
125 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
126 sym = Fcar (o);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
127 val = Fmemq (sym, target->plist);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
128
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
129 if (NILP (val))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
130 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
131 o = Fcdr (o);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
132 val = Fcar (o);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
133 target->plist = Fcons (sym, Fcons (val, target->plist));
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
134 o = Fcdr (o);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
135 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
136 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
137 o = Fcdr (Fcdr (o));
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
138 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
139 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
140
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
141 /* 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
142 0 otherwise. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
143
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
144 int
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
145 intervals_equal (i0, i1)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
146 INTERVAL i0, i1;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
147 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
148 register Lisp_Object i0_cdr, i0_sym, i1_val;
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21351
diff changeset
149 register int i1_len;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
150
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
151 if (DEFAULT_INTERVAL_P (i0) && DEFAULT_INTERVAL_P (i1))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
152 return 1;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
153
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
154 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
155 return 0;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
156
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
157 i1_len = XFASTINT (Flength (i1->plist));
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
158 if (i1_len & 0x1) /* Paranoia -- plists are always even */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
159 abort ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
160 i1_len /= 2;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
161 i0_cdr = i0->plist;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
162 while (!NILP (i0_cdr))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
163 {
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
164 /* Lengths of the two plists were unequal. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
165 if (i1_len == 0)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
166 return 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
167
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
168 i0_sym = Fcar (i0_cdr);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
169 i1_val = Fmemq (i0_sym, i1->plist);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
170
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
171 /* i0 has something i1 doesn't. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
172 if (EQ (i1_val, Qnil))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
173 return 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
174
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
175 /* 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
176 i0_cdr = Fcdr (i0_cdr);
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
177 if (! EQ (Fcar (Fcdr (i1_val)), Fcar (i0_cdr)))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
178 return 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
179
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
180 i0_cdr = Fcdr (i0_cdr);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
181 i1_len--;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
182 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
183
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
184 /* Lengths of the two plists were unequal. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
185 if (i1_len > 0)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
186 return 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
187
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
188 return 1;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
189 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
190
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
191 static int icount;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
192 static int idepth;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
193 static int zero_length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
194
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
195 /* 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
196 Pass FUNCTION two args: an interval, and ARG. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
197
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
198 void
1958
8bc716df45e3 (traverse_intervals): New arg ARG.
Richard M. Stallman <rms@gnu.org>
parents: 1412
diff changeset
199 traverse_intervals (tree, position, depth, function, arg)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
200 INTERVAL tree;
1412
6097878fbd46 * intervals.c (traverse_intervals): New parameter `depth'.
Joseph Arceneaux <jla@gnu.org>
parents: 1316
diff changeset
201 int position, depth;
20317
f62a4f83537e (traverse_intervals): Protoize parameter.
Andreas Schwab <schwab@suse.de>
parents: 18743
diff changeset
202 void (* function) P_ ((INTERVAL, Lisp_Object));
1958
8bc716df45e3 (traverse_intervals): New arg ARG.
Richard M. Stallman <rms@gnu.org>
parents: 1412
diff changeset
203 Lisp_Object arg;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
204 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
205 if (NULL_INTERVAL_P (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
206 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
207
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
208 traverse_intervals (tree->left, position, depth + 1, function, arg);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
209 position += LEFT_TOTAL_LENGTH (tree);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
210 tree->position = position;
1958
8bc716df45e3 (traverse_intervals): New arg ARG.
Richard M. Stallman <rms@gnu.org>
parents: 1412
diff changeset
211 (*function) (tree, arg);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
212 position += LENGTH (tree);
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
213 traverse_intervals (tree->right, position, depth + 1, function, arg);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
214 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
215
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
216 #if 0
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
217 /* These functions are temporary, for debugging purposes only. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
218
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
219 INTERVAL search_interval, found_interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
220
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
221 void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
222 check_for_interval (i)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
223 register INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
224 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
225 if (i == search_interval)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
226 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
227 found_interval = i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
228 icount++;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
229 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
230 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
231
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
232 INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
233 search_for_interval (i, tree)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
234 register INTERVAL i, tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
235 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
236 icount = 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
237 search_interval = i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
238 found_interval = NULL_INTERVAL;
1958
8bc716df45e3 (traverse_intervals): New arg ARG.
Richard M. Stallman <rms@gnu.org>
parents: 1412
diff changeset
239 traverse_intervals (tree, 1, 0, &check_for_interval, Qnil);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
240 return found_interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
241 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
242
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
243 static void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
244 inc_interval_count (i)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
245 INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
246 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
247 icount++;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
248 if (LENGTH (i) == 0)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
249 zero_length++;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
250 if (depth > idepth)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
251 idepth = depth;
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 int
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
255 count_intervals (i)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
256 register INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
257 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
258 icount = 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
259 idepth = 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
260 zero_length = 0;
1958
8bc716df45e3 (traverse_intervals): New arg ARG.
Richard M. Stallman <rms@gnu.org>
parents: 1412
diff changeset
261 traverse_intervals (i, 1, 0, &inc_interval_count, Qnil);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
262
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
263 return icount;
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 INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
267 root_interval (interval)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
268 INTERVAL interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
269 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
270 register INTERVAL i = interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
271
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
272 while (! ROOT_INTERVAL_P (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
273 i = i->parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
274
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
275 return i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
276 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
277 #endif
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
278
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
279 /* Assuming that a left child exists, perform the following operation:
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
280
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
281 A B
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
282 / \ / \
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
283 B => A
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
284 / \ / \
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
285 c c
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
286 */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
287
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
288 static INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
289 rotate_right (interval)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
290 INTERVAL interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
291 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
292 INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
293 INTERVAL B = interval->left;
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
294 int old_total = interval->total_length;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
295
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
296 /* Deal with any Parent of A; make it point to B. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
297 if (! ROOT_INTERVAL_P (interval))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
298 if (AM_LEFT_CHILD (interval))
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
299 interval->parent->left = B;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
300 else
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
301 interval->parent->right = B;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
302 B->parent = interval->parent;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
303
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
304 /* Make B the parent of A */
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
305 i = B->right;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
306 B->right = interval;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
307 interval->parent = B;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
308
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
309 /* Make A point to c */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
310 interval->left = i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
311 if (! NULL_INTERVAL_P (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
312 i->parent = interval;
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
313
5760
ffe89784cef2 (merge_properties_sticky): Preserve original order of properties.
Karl Heuer <kwzh@gnu.org>
parents: 5666
diff changeset
314 /* 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
315 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
316
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
317 /* 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
318 B->total_length = old_total;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
319
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
320 return B;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
321 }
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
322
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
323 /* Assuming that a right child exists, perform the following operation:
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
324
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
325 A B
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
326 / \ / \
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
327 B => A
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
328 / \ / \
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
329 c c
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
330 */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
331
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
332 static INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
333 rotate_left (interval)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
334 INTERVAL interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
335 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
336 INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
337 INTERVAL B = interval->right;
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
338 int old_total = interval->total_length;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
339
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
340 /* Deal with any parent of A; make it point to B. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
341 if (! ROOT_INTERVAL_P (interval))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
342 if (AM_LEFT_CHILD (interval))
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
343 interval->parent->left = B;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
344 else
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
345 interval->parent->right = B;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
346 B->parent = interval->parent;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
347
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
348 /* Make B the parent of A */
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
349 i = B->left;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
350 B->left = interval;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
351 interval->parent = B;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
352
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
353 /* Make A point to c */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
354 interval->right = i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
355 if (! NULL_INTERVAL_P (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
356 i->parent = interval;
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
357
5760
ffe89784cef2 (merge_properties_sticky): Preserve original order of properties.
Karl Heuer <kwzh@gnu.org>
parents: 5666
diff changeset
358 /* 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
359 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
360
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
361 /* 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
362 B->total_length = old_total;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
363
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
364 return B;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
365 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
366
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
367 /* 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
368 themselves are already balanced. */
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
369
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
370 static INTERVAL
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
371 balance_an_interval (i)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
372 INTERVAL i;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
373 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
374 register int old_diff, new_diff;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
375
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
376 while (1)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
377 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
378 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
379 if (old_diff > 0)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
380 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
381 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
382 + 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
383 if (abs (new_diff) >= old_diff)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
384 break;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
385 i = rotate_right (i);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
386 balance_an_interval (i->right);
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 else if (old_diff < 0)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
389 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
390 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
391 + 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
392 if (abs (new_diff) >= -old_diff)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
393 break;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
394 i = rotate_left (i);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
395 balance_an_interval (i->left);
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 else
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
398 break;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
399 }
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
400 return i;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
401 }
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 /* 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
404 Lisp Object. */
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
405
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
406 static INLINE INTERVAL
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
407 balance_possible_root_interval (interval)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
408 register INTERVAL interval;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
409 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
410 Lisp_Object parent;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
411
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
412 if (interval->parent == NULL_INTERVAL)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
413 return interval;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
414
18613
614b916ff5bf Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents: 18125
diff changeset
415 XSETFASTINT (parent, (EMACS_INT) interval->parent);
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
416 interval = balance_an_interval (interval);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
417
9125
a78f02f76f03 (create_root_interval, balance_possible_root_interval, delete_interval): Use
Karl Heuer <kwzh@gnu.org>
parents: 9072
diff changeset
418 if (BUFFERP (parent))
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
419 BUF_INTERVALS (XBUFFER (parent)) = interval;
9125
a78f02f76f03 (create_root_interval, balance_possible_root_interval, delete_interval): Use
Karl Heuer <kwzh@gnu.org>
parents: 9072
diff changeset
420 else if (STRINGP (parent))
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
421 XSTRING (parent)->intervals = interval;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
422
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
423 return interval;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
424 }
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
425
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
426 /* 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
427 (the amount of text). */
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 static INTERVAL
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
430 balance_intervals_internal (tree)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
431 register INTERVAL tree;
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 /* Balance within each side. */
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
434 if (tree->left)
15734
98d8e063fdae (balance_intervals_internal): Recurse directly.
Erik Naggum <erik@naggum.no>
parents: 14186
diff changeset
435 balance_intervals_internal (tree->left);
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
436 if (tree->right)
15734
98d8e063fdae (balance_intervals_internal): Recurse directly.
Erik Naggum <erik@naggum.no>
parents: 14186
diff changeset
437 balance_intervals_internal (tree->right);
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
438 return balance_an_interval (tree);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
439 }
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
440
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
441 /* Advertised interface to balance intervals. */
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
442
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
443 INTERVAL
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
444 balance_intervals (tree)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
445 INTERVAL tree;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
446 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
447 if (tree == NULL_INTERVAL)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
448 return NULL_INTERVAL;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
449
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
450 return balance_intervals_internal (tree);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
451 }
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
452
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
453 /* 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
454 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
455 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
456 (second, lexicographically) is returned.
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
457
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
458 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
459 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
460 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
461 result.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
462
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
463 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
464 it is still a root after this operation. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
465
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
466 INTERVAL
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
467 split_interval_right (interval, offset)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
468 INTERVAL interval;
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
469 int offset;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
470 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
471 INTERVAL new = make_interval ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
472 int position = interval->position;
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
473 int new_length = LENGTH (interval) - offset;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
474
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
475 new->position = position + offset;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
476 new->parent = interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
477
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
478 if (NULL_RIGHT_CHILD (interval))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
479 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
480 interval->right = new;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
481 new->total_length = new_length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
482 }
20908
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
483 else
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
484 {
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
485 /* 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
486 new->right = interval->right;
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
487 interval->right->parent = new;
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
488 interval->right = new;
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
489 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
490 balance_an_interval (new);
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
491 }
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
492
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
493 balance_possible_root_interval (interval);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
494
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
495 return new;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
496 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
497
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
498 /* 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
499 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
500 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
501 (first, lexicographically) is returned.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
502
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
503 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
504 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
505 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
506 result.
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
507
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
508 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
509 it is still a root after this operation. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
510
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
511 INTERVAL
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
512 split_interval_left (interval, offset)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
513 INTERVAL interval;
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
514 int offset;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
515 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
516 INTERVAL new = make_interval ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
517 int position = interval->position;
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
518 int new_length = offset;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
519
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
520 new->position = interval->position;
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
521 interval->position = interval->position + offset;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
522 new->parent = interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
523
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
524 if (NULL_LEFT_CHILD (interval))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
525 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
526 interval->left = new;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
527 new->total_length = new_length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
528 }
20908
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
529 else
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
530 {
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
531 /* 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
532 new->left = interval->left;
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
533 new->left->parent = new;
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
534 interval->left = new;
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
535 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
536 balance_an_interval (new);
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
537 }
516b224be85a (split_interval_right): Make sure to call
Richard M. Stallman <rms@gnu.org>
parents: 20706
diff changeset
538
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
539 balance_possible_root_interval (interval);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
540
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
541 return new;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
542 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
543
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
544 /* 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
545 described by the interval tree SOURCE.
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
546 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
547 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
548
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
549 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
550 of another interval! */
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
551
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
552 int
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
553 interval_start_pos (source)
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
554 INTERVAL source;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
555 {
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
556 Lisp_Object parent;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
557
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
558 if (NULL_INTERVAL_P (source))
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
559 return 0;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
560
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
561 XSETFASTINT (parent, (EMACS_INT) source->parent);
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
562 if (BUFFERP (parent))
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
563 return BUF_BEG (XBUFFER (parent));
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
564 return 0;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
565 }
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
566
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
567 /* 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
568 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
569 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
570 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
571 return the interval containing the last character.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
572
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
573 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
574 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
575 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
576
18125
5b0dfe8c78fb (find_interval): No longer inline.
Richard M. Stallman <rms@gnu.org>
parents: 18078
diff changeset
577 INTERVAL
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
578 find_interval (tree, position)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
579 register INTERVAL tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
580 register int position;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
581 {
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
582 /* 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
583 to POSITION. */
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
584 register int relative_position;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
585 Lisp_Object parent;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
586
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
587 if (NULL_INTERVAL_P (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
588 return NULL_INTERVAL;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
589
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
590 XSETFASTINT (parent, (EMACS_INT) tree->parent);
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
591 relative_position = position;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
592 if (BUFFERP (parent))
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
593 relative_position -= BUF_BEG (XBUFFER (parent));
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
594
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
595 if (relative_position > TOTAL_LENGTH (tree))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
596 abort (); /* Paranoia */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
597
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
598 tree = balance_possible_root_interval (tree);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
599
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
600 while (1)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
601 {
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
602 if (relative_position < LEFT_TOTAL_LENGTH (tree))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
603 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
604 tree = tree->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
605 }
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
606 else if (! NULL_RIGHT_CHILD (tree)
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
607 && relative_position >= (TOTAL_LENGTH (tree)
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
608 - RIGHT_TOTAL_LENGTH (tree)))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
609 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
610 relative_position -= (TOTAL_LENGTH (tree)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
611 - RIGHT_TOTAL_LENGTH (tree));
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
612 tree = tree->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
613 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
614 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
615 {
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
616 tree->position
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
617 = (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
618 + 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
619
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
620 return tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
621 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
622 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
623 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
624
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
625 /* Find the succeeding interval (lexicographically) to INTERVAL.
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
626 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
627 find_interval). */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
628
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
629 INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
630 next_interval (interval)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
631 register INTERVAL interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
632 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
633 register INTERVAL i = interval;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
634 register int next_position;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
635
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
636 if (NULL_INTERVAL_P (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
637 return NULL_INTERVAL;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
638 next_position = interval->position + LENGTH (interval);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
639
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
640 if (! NULL_RIGHT_CHILD (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
641 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
642 i = i->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
643 while (! NULL_LEFT_CHILD (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
644 i = i->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
645
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
646 i->position = next_position;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
647 return i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
648 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
649
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
650 while (! NULL_PARENT (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
651 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
652 if (AM_LEFT_CHILD (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
653 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
654 i = i->parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
655 i->position = next_position;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
656 return i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
657 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
658
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
659 i = i->parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
660 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
661
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
662 return NULL_INTERVAL;
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 preceding 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 previous_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;
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21351
diff changeset
674 register int position_of_previous;
1157
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 (interval))
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
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
679 if (! NULL_LEFT_CHILD (interval))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
680 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
681 i = interval->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
682 while (! NULL_RIGHT_CHILD (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
683 i = i->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
684
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
685 i->position = interval->position - LENGTH (i);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
686 return i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
687 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
688
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
689 i = interval;
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_RIGHT_CHILD (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
693 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
694 i = i->parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
695
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
696 i->position = interval->position - LENGTH (i);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
697 return i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
698 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
699 i = i->parent;
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 }
17461
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
704
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
705 /* 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
706 in the same tree. Note that we need to update interval->position
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
707 if we go down the tree. */
17461
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
708 INTERVAL
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
709 update_interval (i, pos)
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
710 register INTERVAL i;
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
711 int pos;
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
712 {
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
713 if (NULL_INTERVAL_P (i))
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
714 return NULL_INTERVAL;
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
715
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
716 while (1)
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
717 {
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
718 if (pos < i->position)
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
719 {
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
720 /* Move left. */
21012
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
721 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
722 {
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
723 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
724 + 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
725 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
726 }
17461
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
727 else if (NULL_PARENT (i))
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
728 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
729 else
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
730 i = i->parent;
17461
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
731 continue;
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
732 }
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
733 else if (pos >= INTERVAL_LAST_POS (i))
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
734 {
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
735 /* Move right. */
21012
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
736 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
737 {
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
738 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
739 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
740 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
741 }
17461
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
742 else if (NULL_PARENT (i))
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
743 error ("Point after end of properties");
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
744 else
21012
22c48e547cb0 (update_interval): Properly update `position' field of used intervals.
Richard M. Stallman <rms@gnu.org>
parents: 20936
diff changeset
745 i = i->parent;
17461
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
746 continue;
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
747 }
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
748 else
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
749 return i;
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
750 }
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
751 }
156dd2e14452 (update_interval): New function.
Richard M. Stallman <rms@gnu.org>
parents: 16740
diff changeset
752
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
753
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
754 #if 0
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
755 /* Traverse a path down the interval tree TREE to the interval
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
756 containing POSITION, adjusting all nodes on the path for
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
757 an addition of LENGTH characters. Insertion between two intervals
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
758 (i.e., point == i->position, where i is second interval) means
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
759 text goes into second interval.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
760
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
761 Modifications are needed to handle the hungry bits -- after simply
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
762 finding the interval at position (don't add length going down),
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
763 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
764 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
765 to the root. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
766
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
767 static INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
768 adjust_intervals_for_insertion (tree, position, length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
769 INTERVAL tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
770 int position, length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
771 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
772 register int relative_position;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
773 register INTERVAL this;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
774
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
775 if (TOTAL_LENGTH (tree) == 0) /* Paranoia */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
776 abort ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
777
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
778 /* If inserting at point-max of a buffer, that position
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
779 will be out of range */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
780 if (position > TOTAL_LENGTH (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
781 position = TOTAL_LENGTH (tree);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
782 relative_position = position;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
783 this = tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
784
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
785 while (1)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
786 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
787 if (relative_position <= LEFT_TOTAL_LENGTH (this))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
788 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
789 this->total_length += length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
790 this = this->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
791 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
792 else if (relative_position > (TOTAL_LENGTH (this)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
793 - RIGHT_TOTAL_LENGTH (this)))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
794 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
795 relative_position -= (TOTAL_LENGTH (this)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
796 - RIGHT_TOTAL_LENGTH (this));
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
797 this->total_length += length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
798 this = this->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
799 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
800 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
801 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
802 /* 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
803 then this code will have to change. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
804 this->total_length += length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
805 this->position = LEFT_TOTAL_LENGTH (this)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
806 + position - relative_position + 1;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
807 return tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
808 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
809 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
810 }
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
811 #endif
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
812
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
813 /* Effect an adjustment corresponding to the addition of LENGTH characters
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
814 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
815 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
816 LENGTH to them.
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
817
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
818 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
819 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
820 the interval which is "sticky".
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
821
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
822 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
823 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
824 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
825
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
826 static INTERVAL
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
827 adjust_intervals_for_insertion (tree, position, length)
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
828 INTERVAL tree;
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
829 int position, length;
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
830 {
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
831 register INTERVAL i;
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
832 register INTERVAL temp;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
833 int eobp = 0;
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
834 Lisp_Object parent;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
835 int offset;
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
836
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
837 if (TOTAL_LENGTH (tree) == 0) /* Paranoia */
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
838 abort ();
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
839
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
840 XSETFASTINT (parent, (EMACS_INT) tree->parent);
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
841 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
842
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
843 /* 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
844 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
845 if (position >= TOTAL_LENGTH (tree) + offset)
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
846 {
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
847 position = TOTAL_LENGTH (tree) + offset;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
848 eobp = 1;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
849 }
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
850
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
851 i = find_interval (tree, position);
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
852
4638
3872f91770fc (adjust_intervals_for_insertion): If inserting in middle
Richard M. Stallman <rms@gnu.org>
parents: 4383
diff changeset
853 /* 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
854 we must not just give its properties to the insertion.
3872f91770fc (adjust_intervals_for_insertion): If inserting in middle
Richard M. Stallman <rms@gnu.org>
parents: 4383
diff changeset
855 So split this interval at the insertion point. */
3872f91770fc (adjust_intervals_for_insertion): If inserting in middle
Richard M. Stallman <rms@gnu.org>
parents: 4383
diff changeset
856 if (! (position == i->position || eobp)
3872f91770fc (adjust_intervals_for_insertion): If inserting in middle
Richard M. Stallman <rms@gnu.org>
parents: 4383
diff changeset
857 && END_NONSTICKY_P (i)
16740
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
858 && FRONT_NONSTICKY_P (i))
4638
3872f91770fc (adjust_intervals_for_insertion): If inserting in middle
Richard M. Stallman <rms@gnu.org>
parents: 4383
diff changeset
859 {
16740
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
860 Lisp_Object tail;
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
861 Lisp_Object front, rear;
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
862
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
863 front = textget (i->plist, Qfront_sticky);
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
864 rear = textget (i->plist, Qrear_nonsticky);
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
865
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
866 /* Does any actual property pose an actual problem? */
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
867 for (tail = i->plist; ! NILP (tail); tail = Fcdr (Fcdr (tail)))
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
868 {
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
869 Lisp_Object prop;
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
870 prop = XCONS (tail)->car;
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
871
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
872 /* Is this particular property rear-sticky?
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
873 Note, if REAR isn't a cons, it must be non-nil,
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
874 which means that all properties are rear-nonsticky. */
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
875 if (CONSP (rear) && NILP (Fmemq (prop, rear)))
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
876 continue;
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
877
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
878 /* Is this particular property front-sticky?
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
879 Note, if FRONT isn't a cons, it must be nil,
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
880 which means that all properties are front-nonsticky. */
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
881 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
882 continue;
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
883
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
884 /* PROP isn't sticky on either side => it is a real problem. */
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
885 break;
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
886 }
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
887
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
888 /* 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
889 if (! NILP (tail))
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
890 {
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
891 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
892 copy_properties (i, temp);
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
893 i = temp;
202689a911b7 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16716
diff changeset
894 }
4638
3872f91770fc (adjust_intervals_for_insertion): If inserting in middle
Richard M. Stallman <rms@gnu.org>
parents: 4383
diff changeset
895 }
3872f91770fc (adjust_intervals_for_insertion): If inserting in middle
Richard M. Stallman <rms@gnu.org>
parents: 4383
diff changeset
896
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
897 /* 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
898 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
899 if (position == i->position || eobp)
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
900 {
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
901 register INTERVAL prev;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
902
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
903 if (position == BEG)
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
904 prev = 0;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
905 else if (eobp)
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
906 {
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
907 prev = i;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
908 i = 0;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
909 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
910 else
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
911 prev = previous_interval (i);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
912
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
913 /* 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
914 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
915 off a part later, if stickiness demands it. */
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
916 for (temp = prev ? prev : i;! NULL_INTERVAL_P (temp); temp = temp->parent)
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
917 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
918 temp->total_length += length;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
919 temp = balance_possible_root_interval (temp);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
920 }
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
921
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
922 /* If at least one interval has sticky properties,
14036
621a575db6f7 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 13028
diff changeset
923 we check the stickiness property by property. */
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
924 if (END_NONSTICKY_P (prev) || FRONT_STICKY_P (i))
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
925 {
6501
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
926 Lisp_Object pleft, pright;
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
927 struct interval newi;
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
928
6501
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
929 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
930 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
931 newi.plist = merge_properties_sticky (pleft, pright);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
932
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
933 if (! prev) /* i.e. position == BEG */
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
934 {
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
935 if (! intervals_equal (i, &newi))
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
936 {
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
937 i = split_interval_left (i, length);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
938 i->plist = newi.plist;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
939 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
940 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
941 else if (! intervals_equal (prev, &newi))
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
942 {
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
943 prev = split_interval_right (prev,
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
944 position - prev->position);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
945 prev->plist = newi.plist;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
946 if (! NULL_INTERVAL_P (i)
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
947 && intervals_equal (prev, i))
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
948 merge_interval_right (prev);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
949 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
950
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
951 /* 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
952 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
953 else if (! prev && ! NILP (i->plist))
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
954 {
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
955 /* 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
956 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
957 i = split_interval_left (i, length);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
958 }
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
959 }
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
960
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
961 /* Otherwise just extend the interval. */
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
962 else
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
963 {
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
964 for (temp = i; ! NULL_INTERVAL_P (temp); temp = temp->parent)
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
965 {
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
966 temp->total_length += length;
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
967 temp = balance_possible_root_interval (temp);
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
968 }
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
969 }
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
970
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
971 return tree;
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
972 }
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
973
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
974 /* 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
975 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
976 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
977 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
978 _ __ _
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
979 _ FR FR FR FR
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
980 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
981 _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
982 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
983 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
984
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
985 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
986 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
987 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
988 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
989 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
990 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
991 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
992 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
993
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
994 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
995 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
996 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
997 from the left.
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
998
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
999 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
1000 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
1001
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1002 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
1003 rear-nonsticky (p6 pa)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1004 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
1005 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
1006
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1007 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
1008 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
1009 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
1010 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
1011 */
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1012
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1013 Lisp_Object
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1014 merge_properties_sticky (pleft, pright)
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1015 Lisp_Object pleft, pright;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1016 {
6501
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1017 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
1018 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
1019 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
1020 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
1021 int lpresent;
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1022
6501
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1023 props = Qnil;
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1024 front = Qnil;
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1025 rear = Qnil;
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1026 lfront = textget (pleft, Qfront_sticky);
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1027 lrear = textget (pleft, Qrear_nonsticky);
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1028 rfront = textget (pright, Qfront_sticky);
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1029 rrear = textget (pright, Qrear_nonsticky);
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1030
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1031 /* Go through each element of PRIGHT. */
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1032 for (tail1 = pright; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1)))
4383
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 sym = Fcar (tail1);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1035
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1036 /* Sticky properties get special treatment. */
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1037 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
1038 continue;
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1039
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1040 rval = Fcar (Fcdr (tail1));
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1041 for (tail2 = pleft; ! NILP (tail2); tail2 = Fcdr (Fcdr (tail2)))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1042 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
1043 break;
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1044
16708
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1045 /* 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
1046 (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
1047 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
1048 lpresent = ! NILP (tail2);
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1049 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
1050
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1051 use_left = ! TMEM (sym, lrear) && lpresent;
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1052 use_right = TMEM (sym, rfront);
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1053 if (use_left && use_right)
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1054 {
16708
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1055 if (NILP (lval))
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1056 use_left = 0;
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1057 else if (NILP (rval))
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1058 use_right = 0;
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1059 }
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1060 if (use_left)
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1061 {
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1062 /* 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
1063 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
1064 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
1065 if (TMEM (sym, lfront))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1066 front = Fcons (sym, front);
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1067 if (TMEM (sym, lrear))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1068 rear = Fcons (sym, rear);
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1069 }
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1070 else if (use_right)
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1071 {
16708
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1072 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
1073 if (TMEM (sym, rfront))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1074 front = Fcons (sym, front);
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1075 if (TMEM (sym, rrear))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1076 rear = Fcons (sym, rear);
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1077 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1078 }
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1079
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1080 /* Now go through each element of PLEFT. */
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1081 for (tail2 = pleft; ! NILP (tail2); tail2 = Fcdr (Fcdr (tail2)))
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1082 {
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1083 sym = Fcar (tail2);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1084
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1085 /* Sticky properties get special treatment. */
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1086 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
1087 continue;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1088
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1089 /* If sym is in PRIGHT, we've already considered it. */
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1090 for (tail1 = pright; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1)))
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1091 if (EQ (sym, Fcar (tail1)))
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1092 break;
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1093 if (! NILP (tail1))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1094 continue;
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1095
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1096 lval = Fcar (Fcdr (tail2));
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1097
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1098 /* Since rval is known to be nil in this loop, the test simplifies. */
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1099 if (! TMEM (sym, lrear))
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1100 {
16708
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1101 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
1102 if (TMEM (sym, lfront))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1103 front = Fcons (sym, front);
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1104 }
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1105 else if (TMEM (sym, rfront))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1106 {
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1107 /* 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
1108 from the right. */
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1109 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
1110 if (TMEM (sym, rrear))
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1111 rear = Fcons (sym, rear);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1112 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1113 }
5760
ffe89784cef2 (merge_properties_sticky): Preserve original order of properties.
Karl Heuer <kwzh@gnu.org>
parents: 5666
diff changeset
1114 props = Fnreverse (props);
5768
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1115 if (! NILP (rear))
ab11e2af95ef Add comments describing the rules used by the merge algorithm.
Karl Heuer <kwzh@gnu.org>
parents: 5760
diff changeset
1116 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
1117
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1118 cat = textget (props, Qcategory);
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1119 if (! NILP (front)
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1120 &&
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1121 /* 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
1122 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
1123 ! (! NILP (cat) && SYMBOLP (cat)
7b139b59bda4 (merge_properties_sticky): Don't discard explicit nil
Richard M. Stallman <rms@gnu.org>
parents: 16680
diff changeset
1124 && 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
1125 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
1126 return props;
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1127 }
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1128
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1129
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1130 /* 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
1131 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
1132 storing the resulting subtree into its parent. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1133
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1134 static INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1135 delete_node (i)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1136 register INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1137 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1138 register INTERVAL migrate, this;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1139 register int migrate_amt;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1140
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1141 if (NULL_INTERVAL_P (i->left))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1142 return i->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1143 if (NULL_INTERVAL_P (i->right))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1144 return i->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1145
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1146 migrate = i->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1147 migrate_amt = i->left->total_length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1148 this = i->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1149 this->total_length += migrate_amt;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1150 while (! NULL_INTERVAL_P (this->left))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1151 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1152 this = this->left;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1153 this->total_length += migrate_amt;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1154 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1155 this->left = migrate;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1156 migrate->parent = this;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1158 return i->right;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1159 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1160
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1161 /* Delete interval I from its tree by calling `delete_node'
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1162 and properly connecting the resultant subtree.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1163
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1164 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
1165 for the length of I. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1166
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1167 void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1168 delete_interval (i)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1169 register INTERVAL i;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1170 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1171 register INTERVAL parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1172 int amt = LENGTH (i);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1173
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1174 if (amt > 0) /* Only used on zero-length intervals now. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1175 abort ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1176
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1177 if (ROOT_INTERVAL_P (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1178 {
6501
d7ac9a417f87 (adjust_intervals_for_insertion, merge_properties_sticky, delete_interval):
Karl Heuer <kwzh@gnu.org>
parents: 5780
diff changeset
1179 Lisp_Object owner;
18613
614b916ff5bf Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents: 18125
diff changeset
1180 XSETFASTINT (owner, (EMACS_INT) i->parent);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1181 parent = delete_node (i);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1182 if (! NULL_INTERVAL_P (parent))
18613
614b916ff5bf Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents: 18125
diff changeset
1183 parent->parent = (INTERVAL) XFASTINT (owner);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1184
9125
a78f02f76f03 (create_root_interval, balance_possible_root_interval, delete_interval): Use
Karl Heuer <kwzh@gnu.org>
parents: 9072
diff changeset
1185 if (BUFFERP (owner))
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1186 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
1187 else if (STRINGP (owner))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1188 XSTRING (owner)->intervals = parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1189 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1190 abort ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1191
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1192 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1193 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1194
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1195 parent = i->parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1196 if (AM_LEFT_CHILD (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1197 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1198 parent->left = delete_node (i);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1199 if (! NULL_INTERVAL_P (parent->left))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1200 parent->left->parent = parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1201 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1202 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1203 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1204 parent->right = delete_node (i);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1205 if (! NULL_INTERVAL_P (parent->right))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1206 parent->right->parent = parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1207 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1208 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1209
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1210 /* 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
1211 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
1212 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
1213 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
1214
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1215 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
1216 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
1217 recursively on subtrees.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1218
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1219 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
1220 deleting the appropriate amount of text. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1221
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1222 static int
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1223 interval_deletion_adjustment (tree, from, amount)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1224 register INTERVAL tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1225 register int from, amount;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1226 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1227 register int relative_position = from;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1228
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1229 if (NULL_INTERVAL_P (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1230 return 0;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1231
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1232 /* Left branch */
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1233 if (relative_position < LEFT_TOTAL_LENGTH (tree))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1234 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1235 int subtract = interval_deletion_adjustment (tree->left,
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1236 relative_position,
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1237 amount);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1238 tree->total_length -= subtract;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1239 return subtract;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1240 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1241 /* Right branch */
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1242 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
1243 - RIGHT_TOTAL_LENGTH (tree)))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1244 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1245 int subtract;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1246
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1247 relative_position -= (tree->total_length
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1248 - RIGHT_TOTAL_LENGTH (tree));
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1249 subtract = interval_deletion_adjustment (tree->right,
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1250 relative_position,
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1251 amount);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1252 tree->total_length -= subtract;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1253 return subtract;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1254 }
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1255 /* Here -- this node. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1256 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1257 {
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1258 /* 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
1259 int my_amount = ((tree->total_length
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1260 - RIGHT_TOTAL_LENGTH (tree))
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1261 - relative_position);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1262
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1263 if (amount > my_amount)
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1264 amount = my_amount;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1265
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1266 tree->total_length -= amount;
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1267 if (LENGTH (tree) == 0)
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1268 delete_interval (tree);
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1269
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1270 return amount;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1271 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1272
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1273 /* Never reach here. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1274 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1275
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1276 /* 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
1277 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
1278 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
1279 buffer position, i.e. origin 1). */
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1280
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1281 static void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1282 adjust_intervals_for_deletion (buffer, start, length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1283 struct buffer *buffer;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1284 int start, length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1285 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1286 register int left_to_delete = length;
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1287 register INTERVAL tree = BUF_INTERVALS (buffer);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1288 register int deleted;
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1289 Lisp_Object parent;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1290 int offset;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1291
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1292 XSETFASTINT (parent, (EMACS_INT) tree->parent);
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1293 offset = (BUFFERP (parent) ? BUF_BEG (XBUFFER (parent)) : 0);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1294
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1295 if (NULL_INTERVAL_P (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1296 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1297
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1298 if (start > offset + TOTAL_LENGTH (tree)
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1299 || 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
1300 abort ();
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1301
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1302 if (length == TOTAL_LENGTH (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1303 {
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1304 BUF_INTERVALS (buffer) = NULL_INTERVAL;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1305 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1306 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1307
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1308 if (ONLY_INTERVAL_P (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1309 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1310 tree->total_length -= length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1311 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1312 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1313
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1314 if (start > offset + TOTAL_LENGTH (tree))
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1315 start = offset + TOTAL_LENGTH (tree);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1316 while (left_to_delete > 0)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1317 {
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1318 left_to_delete -= interval_deletion_adjustment (tree, start - offset,
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1319 left_to_delete);
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1320 tree = BUF_INTERVALS (buffer);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1321 if (left_to_delete == tree->total_length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1322 {
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1323 BUF_INTERVALS (buffer) = NULL_INTERVAL;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1324 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1325 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1326 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1327 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1328
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 3490
diff changeset
1329 /* Make the adjustments necessary to the interval tree of BUFFER to
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1330 represent an addition or deletion of LENGTH characters starting
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1331 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
1332 of LENGTH. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1333
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1334 INLINE void
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1335 offset_intervals (buffer, start, length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1336 struct buffer *buffer;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1337 int start, length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1338 {
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1339 if (NULL_INTERVAL_P (BUF_INTERVALS (buffer)) || length == 0)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1340 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1341
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1342 if (length > 0)
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1343 adjust_intervals_for_insertion (BUF_INTERVALS (buffer), start, length);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1344 else
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1345 adjust_intervals_for_deletion (buffer, start, -length);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1346 }
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1347
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1348 /* Merge interval I with its lexicographic successor. The resulting
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1349 interval is returned, and has the properties of the original
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1350 successor. The properties of I are lost. I is removed from the
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1351 interval tree.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1352
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1353 IMPORTANT:
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1354 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
1355 interval. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1356
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1357 INTERVAL
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1358 merge_interval_right (i)
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1359 register INTERVAL i;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1360 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1361 register int absorb = LENGTH (i);
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1362 register INTERVAL successor;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1363
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1364 /* Zero out this interval. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1365 i->total_length -= absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1366
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1367 /* Find the succeeding interval. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1368 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
1369 as we descend. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1370 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1371 successor = i->right;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1372 while (! NULL_LEFT_CHILD (successor))
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1373 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1374 successor->total_length += absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1375 successor = successor->left;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1376 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1377
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1378 successor->total_length += absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1379 delete_interval (i);
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1380 return successor;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1381 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1382
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1383 successor = i;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1384 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
1385 we ascend. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1386 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1387 if (AM_LEFT_CHILD (successor))
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1388 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1389 successor = successor->parent;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1390 delete_interval (i);
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1391 return successor;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1392 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1393
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1394 successor = successor->parent;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1395 successor->total_length -= absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1396 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1397
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1398 /* 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
1399 be merged right. The caller should have known. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1400 abort ();
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1401 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1402
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1403 /* Merge interval I with its lexicographic predecessor. The resulting
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1404 interval is returned, and has the properties of the original predecessor.
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1405 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
1406
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1407 IMPORTANT:
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1408 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
1409
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1410 INTERVAL
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1411 merge_interval_left (i)
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1412 register INTERVAL i;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1413 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1414 register int absorb = LENGTH (i);
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1415 register INTERVAL predecessor;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1416
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1417 /* Zero out this interval. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1418 i->total_length -= absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1419
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1420 /* Find the preceding interval. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1421 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
1422 adding ABSORB as we go. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1423 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1424 predecessor = i->left;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1425 while (! NULL_RIGHT_CHILD (predecessor))
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1426 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1427 predecessor->total_length += absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1428 predecessor = predecessor->right;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1429 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1430
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1431 predecessor->total_length += absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1432 delete_interval (i);
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1433 return predecessor;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1434 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1435
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1436 predecessor = i;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1437 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
1438 subtracting ABSORB. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1439 {
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1440 if (AM_RIGHT_CHILD (predecessor))
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 predecessor = predecessor->parent;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1443 delete_interval (i);
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1444 return predecessor;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1445 }
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1446
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1447 predecessor = predecessor->parent;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1448 predecessor->total_length -= absorb;
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1449 }
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 /* 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
1452 be merged left. The caller should have known. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1453 abort ();
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
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1456 /* Make an exact copy of interval tree SOURCE which descends from
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1457 PARENT. This is done by recursing through SOURCE, copying
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1458 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
1459 the pointers of the copy. */
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1460
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1461 static INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1462 reproduce_tree (source, parent)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1463 INTERVAL source, parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1464 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1465 register INTERVAL t = make_interval ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1466
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1467 bcopy (source, t, INTERVAL_SIZE);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1468 copy_properties (source, t);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1469 t->parent = parent;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1470 if (! NULL_LEFT_CHILD (source))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1471 t->left = reproduce_tree (source->left, t);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1472 if (! NULL_RIGHT_CHILD (source))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1473 t->right = reproduce_tree (source->right, t);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1474
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1475 return t;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1476 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1477
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1478 #if 0
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1479 /* 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
1480
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1481 /* Make a new interval of length LENGTH starting at START in the
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1482 group of intervals INTERVALS, which is actually an interval tree.
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1483 Returns the new interval.
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1484
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1485 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
1486 interval. */
1189
164176515d2a comment changes
Joseph Arceneaux <jla@gnu.org>
parents: 1164
diff changeset
1487
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1488 static INTERVAL
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1489 make_new_interval (intervals, start, length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1490 INTERVAL intervals;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1491 int start, length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1492 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1493 INTERVAL slot;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1494
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1495 slot = find_interval (intervals, start);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1496 if (start + length > slot->position + LENGTH (slot))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1497 error ("Interval would overlap");
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1498
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1499 if (start == slot->position && length == LENGTH (slot))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1500 return slot;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1501
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1502 if (slot->position == start)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1503 {
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1504 /* New right node. */
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1505 split_interval_right (slot, length);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1506 return slot;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1507 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1508
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1509 if (slot->position + LENGTH (slot) == start + length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1510 {
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1511 /* New left node. */
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1512 split_interval_left (slot, LENGTH (slot) - length);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1513 return slot;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1514 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1515
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1516 /* 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
1517 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
1518 split_interval_right (slot, length);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1519 return slot;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1520 }
4005
da8962f65741 * intervals.c (find_interval): Doc fixes, computation of
Jim Blandy <jimb@redhat.com>
parents: 3998
diff changeset
1521 #endif
2052
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
1522
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1523 /* 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
1524 LENGTH is the length of the text in SOURCE.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1525
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1526 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
1527 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
1528 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
1529 tree of a buffer or a string.
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1530
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1531 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
1532 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
1533 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
1534 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
1535 shared.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1536
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1537 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
1538 want to inherit the surrounding text's properties, this function
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1539 simply returns -- offset_intervals should handle placing the
1164
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1540 text in the correct interval, depending on the sticky bits.
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1541
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1542 If the inserted text had properties (intervals), then there are two
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1543 cases -- either insertion happened in the middle of some interval,
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1544 or between two intervals.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1545
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1546 If the text goes into the middle of an interval, then new
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1547 intervals are created in the middle with only the properties of
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1548 the new text, *unless* the macro MERGE_INSERTIONS is true, in
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1549 which case the new text has the union of its properties and those
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1550 of the text into which it was inserted.
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1551
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1552 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
1553 had its appropriate sticky property set (front_sticky, rear_sticky),
adfaeccad01d entered into RCS
Joseph Arceneaux <jla@gnu.org>
parents: 1157
diff changeset
1554 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
1555 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
1556 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
1557 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
1558 only its properties, as if neither sticky property were set. Perhaps
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1559 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
1560 text... */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1561
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1562 void
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1563 graft_intervals_into_buffer (source, position, length, buffer, inherit)
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1564 INTERVAL source;
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1565 int position, length;
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1566 struct buffer *buffer;
4718
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1567 int inherit;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1568 {
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1569 register INTERVAL under, over, this, prev;
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1570 register INTERVAL tree;
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1571 int middle;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1572
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1573 tree = BUF_INTERVALS (buffer);
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1574
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1575 /* If the new text has no properties, it becomes part of whatever
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1576 interval it was inserted into. */
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1577 if (NULL_INTERVAL_P (source))
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1578 {
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1579 Lisp_Object buf;
5250
63a865489a1e (graft_intervals_into_buffer): If SOURCE is null
Richard M. Stallman <rms@gnu.org>
parents: 5173
diff changeset
1580 if (!inherit && ! NULL_INTERVAL_P (tree))
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1581 {
9271
1971a6a8cdc0 (graft_intervals_into_buffer): Use new accessor macros instead of calling XSET
Karl Heuer <kwzh@gnu.org>
parents: 9125
diff changeset
1582 XSETBUFFER (buf, buffer);
5169
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1583 Fset_text_properties (make_number (position),
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1584 make_number (position + length),
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1585 Qnil, buf);
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1586 }
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1587 if (! NULL_INTERVAL_P (BUF_INTERVALS (buffer)))
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1588 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
1589 return;
d040c1a8ccbe (graft_intervals_into_buffer): New arg LENGTH.
Richard M. Stallman <rms@gnu.org>
parents: 4962
diff changeset
1590 }
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1591
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1592 if (NULL_INTERVAL_P (tree))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1593 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1594 /* 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
1595 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
1596 if ((BUF_Z (buffer) - BUF_BEG (buffer)) == TOTAL_LENGTH (source))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1597 {
4223
b044f6d3c4cb (graft_intervals_into_buffer): When TREE is null,
Richard M. Stallman <rms@gnu.org>
parents: 4135
diff changeset
1598 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
1599 XSETBUFFER (buf, buffer);
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1600 BUF_INTERVALS (buffer) = reproduce_tree (source, buf);
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1601 BUF_INTERVALS (buffer)->position = 1;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1602
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1603 /* Explicitly free the old tree here? */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1604
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1605 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1606 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1607
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1608 /* 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
1609 of the intervals of the inserted string. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1610 {
1307
b469633740b3 Fixed typos.
Joseph Arceneaux <jla@gnu.org>
parents: 1303
diff changeset
1611 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
1612 XSETBUFFER (buf, buffer);
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1613 tree = create_root_interval (buf);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1614 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1615 }
4718
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1616 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
1617 /* 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
1618 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
1619 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
1620 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
1621 {
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1622 BUF_INTERVALS (buffer) = reproduce_tree (source, tree->parent);
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1623 BUF_INTERVALS (buffer)->position = 1;
4718
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1624 /* Explicitly free the old tree here. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1625
4718
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1626 return;
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1627 }
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1628 /* 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
1629 should be of non-zero length. */
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1630 else if (TOTAL_LENGTH (tree) == 0)
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1631 abort ();
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1632
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1633 this = under = find_interval (tree, position);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1634 if (NULL_INTERVAL_P (under)) /* Paranoia */
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1635 abort ();
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
1636 over = find_interval (source, interval_start_pos (source));
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1637
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1638 /* 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
1639 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
1640 then don't bother with it any more. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1641
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1642 if (position > under->position)
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1643 {
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1644 INTERVAL end_unchanged
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
1645 = 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
1646 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
1647 under->position = position;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1648 prev = 0;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1649 middle = 1;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1650 }
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1651 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1652 {
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1653 prev = previous_interval (under);
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1654 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
1655 prev = 0;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1656 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1657
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1658 /* Insertion is now at beginning of UNDER. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1659
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1660 /* 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
1661 which means it gets those properties.
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1662 The properties of under are the result of
14036
621a575db6f7 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 13028
diff changeset
1663 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
1664 already been taken care of. */
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1665
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1666 while (! NULL_INTERVAL_P (over))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1667 {
5666
ceed2e32b303 (graft_intervals_into_buffer): Fix one-off
Richard M. Stallman <rms@gnu.org>
parents: 5415
diff changeset
1668 if (LENGTH (over) < LENGTH (under))
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1669 {
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1670 this = split_interval_left (under, LENGTH (over));
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1671 copy_properties (under, this);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1672 }
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1673 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1674 this = under;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1675 copy_properties (over, this);
4718
a05b833e61c4 (graft_intervals_into_buffer): New arg INHERIT.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
1676 if (inherit)
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1677 merge_properties (over, this);
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1678 else
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1679 copy_properties (over, this);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1680 over = next_interval (over);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1681 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1682
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1683 if (! NULL_INTERVAL_P (BUF_INTERVALS (buffer)))
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1684 BUF_INTERVALS (buffer) = balance_an_interval (BUF_INTERVALS (buffer));
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1685 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1686 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1687
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
1688 /* 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
1689 which is the plist of an interval.
10927
7d02d12082ff (textget): Check default_properties vbl too.
Boris Goldowsky <boris@gnu.org>
parents: 10563
diff changeset
1690 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
1691 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
1692
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
1693 Lisp_Object
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1694 textget (plist, prop)
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1695 Lisp_Object plist;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1696 register Lisp_Object prop;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1697 {
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
1698 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
1699 fallback = Qnil;
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1700
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1701 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
1702 {
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1703 register Lisp_Object tem;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1704 tem = Fcar (tail);
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1705 if (EQ (prop, tem))
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1706 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
1707 if (EQ (tem, Qcategory))
8611
65a058371675 (textget): Ignore category prop if not a symbol.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
1708 {
65a058371675 (textget): Ignore category prop if not a symbol.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
1709 tem = Fcar (Fcdr (tail));
65a058371675 (textget): Ignore category prop if not a symbol.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
1710 if (SYMBOLP (tem))
65a058371675 (textget): Ignore category prop if not a symbol.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
1711 fallback = Fget (tem, prop);
65a058371675 (textget): Ignore category prop if not a symbol.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
1712 }
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1713 }
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
1714
10927
7d02d12082ff (textget): Check default_properties vbl too.
Boris Goldowsky <boris@gnu.org>
parents: 10563
diff changeset
1715 if (! NILP (fallback))
7d02d12082ff (textget): Check default_properties vbl too.
Boris Goldowsky <boris@gnu.org>
parents: 10563
diff changeset
1716 return fallback;
11133
119880025e8f (Vdefault_text_properties): name changed from Vdefault_properties.
Boris Goldowsky <boris@gnu.org>
parents: 10927
diff changeset
1717 if (CONSP (Vdefault_text_properties))
119880025e8f (Vdefault_text_properties): name changed from Vdefault_properties.
Boris Goldowsky <boris@gnu.org>
parents: 10927
diff changeset
1718 return Fplist_get (Vdefault_text_properties, prop);
10927
7d02d12082ff (textget): Check default_properties vbl too.
Boris Goldowsky <boris@gnu.org>
parents: 10563
diff changeset
1719 return Qnil;
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1720 }
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1721
2052
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
1722
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1723 /* 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
1724
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1725 INLINE void
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1726 temp_set_point (buffer, charpos)
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1727 struct buffer *buffer;
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1728 int charpos;
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1729 {
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1730 temp_set_point_both (buffer, charpos,
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1731 buf_charpos_to_bytepos (buffer, charpos));
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1732 }
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1733
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1734 /* 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
1735 byte position BYTEPOS. */
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1736
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1737 INLINE void
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1738 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
1739 int charpos, bytepos;
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1740 struct buffer *buffer;
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1741 {
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1742 /* 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
1743 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
1744 && charpos != bytepos)
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1745 abort ();
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1746
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1747 if (charpos > bytepos)
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1748 abort ();
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1749
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1750 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
1751 abort ();
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1752
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1753 BUF_PT_BYTE (buffer) = bytepos;
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1754 BUF_PT (buffer) = charpos;
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1755 }
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1756
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1757 /* Set point in BUFFER to CHARPOS. If the target position is
7104
9c99683eb6f0 Fix comment.
Karl Heuer <kwzh@gnu.org>
parents: 6753
diff changeset
1758 before an intangible character, move to an ok place. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1759
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1760 void
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1761 set_point (buffer, charpos)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1762 register struct buffer *buffer;
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1763 register int charpos;
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1764 {
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1765 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
1766 }
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1767
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1768 /* 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
1769 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
1770 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
1771
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1772 void
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1773 set_point_both (buffer, charpos, bytepos)
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1774 register struct buffer *buffer;
20936
5c60cd16452b (temp_set_point_both): Declare arg BYTEPOS as int.
Kenichi Handa <handa@m17n.org>
parents: 20908
diff changeset
1775 register int charpos, bytepos;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1776 {
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1777 register INTERVAL to, from, toprev, fromprev, target;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1778 int buffer_point;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1779 register Lisp_Object obj;
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1780 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
1781 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
1782 int have_overlays;
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1783 int original_position;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1784
10563
d35f5eca6dd5 (set_point): Set point_before_scroll to nil.
Richard M. Stallman <rms@gnu.org>
parents: 10313
diff changeset
1785 buffer->point_before_scroll = Qnil;
d35f5eca6dd5 (set_point): Set point_before_scroll to nil.
Richard M. Stallman <rms@gnu.org>
parents: 10313
diff changeset
1786
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1787 if (charpos == BUF_PT (buffer))
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1788 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1789
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1790 /* 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
1791 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
1792 && charpos != bytepos)
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1793 abort ();
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1794
2779
857bb0f59668 * intervals.c (set_point): Check for point out of bounds before
Jim Blandy <jimb@redhat.com>
parents: 2090
diff changeset
1795 /* 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
1796 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
1797 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
1798 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
1799 abort ();
857bb0f59668 * intervals.c (set_point): Check for point out of bounds before
Jim Blandy <jimb@redhat.com>
parents: 2090
diff changeset
1800
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1801 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
1802 || ! NILP (buffer->overlays_after));
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1803
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1804 /* 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
1805 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
1806 if (NULL_INTERVAL_P (BUF_INTERVALS (buffer)) && ! have_overlays)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1807 {
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1808 temp_set_point_both (buffer, charpos, bytepos);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1809 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1810 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1811
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1812 /* 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
1813 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
1814 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
1815 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
1816 if (charpos == BUF_BEGV (buffer))
2052
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
1817 toprev = 0;
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1818 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
1819 toprev = previous_interval (to);
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1820 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1821 toprev = to;
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1822
2052
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
1823 buffer_point = (BUF_PT (buffer) == BUF_ZV (buffer)
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
1824 ? 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
1825 : BUF_PT (buffer));
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1826
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1827 /* 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
1828 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
1829 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
1830 /* We could cache this and save time. */
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
1831 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
1832 if (buffer_point == BUF_BEGV (buffer))
2052
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
1833 fromprev = 0;
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1834 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
1835 fromprev = previous_interval (from);
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1836 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
1837 fromprev = from, from = 0;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1838 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1839 fromprev = from;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1840
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
1841 /* Moving within an interval. */
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1842 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
1843 && ! have_overlays)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1844 {
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1845 temp_set_point_both (buffer, charpos, bytepos);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1846 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1847 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1848
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1849 original_position = charpos;
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1850
11327
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1851 /* 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
1852 with the same intangible property value,
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1853 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
1854 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
1855 && ((! 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
1856 || have_overlays)
2ecf4bb329a8 (set_point): Use virtual bounds, not real bounds,
Richard M. Stallman <rms@gnu.org>
parents: 16708
diff changeset
1857 /* 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
1858 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
1859 && charpos != BEGV && charpos != ZV)
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1860 {
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1861 Lisp_Object intangible_propval;
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1862 Lisp_Object pos;
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1863
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1864 XSETINT (pos, charpos);
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1865
9072
21517199cfae (set_point): If Vinhibit_point_motion_hooks, ignore intangible properties.
Richard M. Stallman <rms@gnu.org>
parents: 8897
diff changeset
1866 if (backwards)
21517199cfae (set_point): If Vinhibit_point_motion_hooks, ignore intangible properties.
Richard M. Stallman <rms@gnu.org>
parents: 8897
diff changeset
1867 {
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1868 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
1869 Qintangible, Qnil);
11327
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1870
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1871 /* If following char is intangible,
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1872 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
1873 if (! NILP (intangible_propval))
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1874 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
1875 && 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
1876 Qintangible, Qnil),
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1877 intangible_propval))
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1878 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
1879 }
3734
5ada670e1fd8 (set_point): When moving over invis chars,
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
1880 else
9072
21517199cfae (set_point): If Vinhibit_point_motion_hooks, ignore intangible properties.
Richard M. Stallman <rms@gnu.org>
parents: 8897
diff changeset
1881 {
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1882 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
1883 Qintangible, Qnil);
11327
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1884
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1885 /* If following char is intangible,
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1886 skip back 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
1887 if (! NILP (intangible_propval))
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1888 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
1889 && 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
1890 intangible_propval))
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1891 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
1892
9072
21517199cfae (set_point): If Vinhibit_point_motion_hooks, ignore intangible properties.
Richard M. Stallman <rms@gnu.org>
parents: 8897
diff changeset
1893 }
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1894
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1895 charpos = XINT (pos);
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1896 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
1897 }
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1898
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1899 if (charpos != original_position)
16680
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1900 {
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1901 /* 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
1902 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
1903 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
1904 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
1905 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
1906 toprev = 0;
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1907 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
1908 toprev = previous_interval (to);
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1909 else
82898b671633 (set_point): Check for intangible properties on overlays.
Richard M. Stallman <rms@gnu.org>
parents: 16124
diff changeset
1910 toprev = to;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1911 }
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1912
11327
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1913 /* 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
1914 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
1915 One or the other may be null. */
76908dad81a4 (set_point): When skipping intangible text,
Richard M. Stallman <rms@gnu.org>
parents: 11235
diff changeset
1916
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
1917 temp_set_point_both (buffer, charpos, bytepos);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1918
1288
b05982e82d93 Various comment changes.
Joseph Arceneaux <jla@gnu.org>
parents: 1211
diff changeset
1919 /* We run point-left and point-entered hooks here, iff the
b05982e82d93 Various comment changes.
Joseph Arceneaux <jla@gnu.org>
parents: 1211
diff changeset
1920 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
1921 (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
1922 if (NILP (Vinhibit_point_motion_hooks)
23fe7f6c9ae4 (set_point): Test Vinhibit_point_motion_hooks.
Richard M. Stallman <rms@gnu.org>
parents: 4223
diff changeset
1923 && (! intervals_equal (from, to)
23fe7f6c9ae4 (set_point): Test Vinhibit_point_motion_hooks.
Richard M. Stallman <rms@gnu.org>
parents: 4223
diff changeset
1924 || ! intervals_equal (fromprev, toprev)))
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1925 {
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1926 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
1927
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1928 if (fromprev)
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1929 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
1930 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1931 leave_after = Qnil;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1932 if (from)
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1933 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
1934 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1935 leave_before = Qnil;
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1936
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1937 if (toprev)
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1938 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
1939 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1940 enter_after = Qnil;
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1941 if (to)
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1942 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
1943 else
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1944 enter_before = Qnil;
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1945
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1946 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
1947 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
1948 make_number (charpos));
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1949 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
1950 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
1951 make_number (charpos));
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1952
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1953 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
1954 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
1955 make_number (charpos));
1964
e6c49ff3a53c (intervals_equal): Handle one arg null and other not.
Richard M. Stallman <rms@gnu.org>
parents: 1958
diff changeset
1956 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
1957 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
1958 make_number (charpos));
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
1959 }
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1960 }
2052
48c83a34c005 (verify_interval_modification): Handle insertions
Richard M. Stallman <rms@gnu.org>
parents: 1964
diff changeset
1961
18076
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1962 /* 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
1963 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
1964
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1965 void
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1966 move_if_not_intangible (position)
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1967 int position;
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1968 {
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1969 Lisp_Object pos;
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1970 Lisp_Object intangible_propval;
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1971
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1972 XSETINT (pos, position);
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1973
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1974 if (! NILP (Vinhibit_point_motion_hooks))
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1975 /* 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
1976 ;
18613
614b916ff5bf Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents: 18125
diff changeset
1977 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
1978 {
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1979 /* 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
1980
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1981 intangible_propval = Fget_char_property (pos,
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1982 Qintangible, Qnil);
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1983
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1984 /* If following char is intangible,
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1985 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
1986 if (! NILP (intangible_propval))
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1987 while (XINT (pos) > BEGV
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1988 && 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
1989 Qintangible, Qnil),
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1990 intangible_propval))
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1991 pos = Fprevious_char_property_change (pos, Qnil);
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1992 }
18613
614b916ff5bf Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents: 18125
diff changeset
1993 else if (XINT (pos) > BEGV)
18076
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1994 {
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1995 /* 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
1996
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1997 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
1998 Qintangible, Qnil);
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
1999
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2000 /* If following char is intangible,
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2001 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
2002 if (! NILP (intangible_propval))
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2003 while (XINT (pos) < ZV
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2004 && EQ (Fget_char_property (pos, Qintangible, Qnil),
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2005 intangible_propval))
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2006 pos = Fnext_char_property_change (pos, Qnil);
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2007
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2008 }
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2009
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2010 /* 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
2011 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
2012 if POSITION is inside of intangible text). */
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2013
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2014 if (XINT (pos) != PT)
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2015 SET_PT (position);
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2016 }
1a2e6b512688 (move_if_not_intangible): New function.
Richard M. Stallman <rms@gnu.org>
parents: 17466
diff changeset
2017
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2018 /* Return the proper local map for position POSITION in BUFFER.
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2019 Use the map specified by the local-map property, if any.
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2020 Otherwise, use BUFFER's local map. */
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2021
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2022 Lisp_Object
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2023 get_local_map (position, buffer)
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2024 register int position;
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2025 register struct buffer *buffer;
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2026 {
11660
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2027 Lisp_Object prop, tem, lispy_position, lispy_buffer;
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2028 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
2029
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
2030 /* 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
2031 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
2032 abort ();
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2033
11660
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2034 /* 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
2035 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
2036 old_begv = BUF_BEGV (buffer);
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2037 old_zv = BUF_ZV (buffer);
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2038 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
2039 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
2040 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
2041 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
2042 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
2043 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
2044
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2045 /* 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
2046 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
2047 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
2048 --position;
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2049 XSETFASTINT (lispy_position, position);
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2050 XSETBUFFER (lispy_buffer, buffer);
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2051 prop = Fget_char_property (lispy_position, Qlocal_map, lispy_buffer);
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2052
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2053 BUF_BEGV (buffer) = old_begv;
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2054 BUF_ZV (buffer) = old_zv;
20557
b1edf278ca98 (set_point_both): Renamed from set_point;
Richard M. Stallman <rms@gnu.org>
parents: 20317
diff changeset
2055 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
2056 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
2057
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2058 /* Use the local map only if it is valid. */
16124
f38128a8bb2b (get_local_map): Call indirect-function.
Richard M. Stallman <rms@gnu.org>
parents: 16110
diff changeset
2059 /* Do allow symbols that are defined as keymaps. */
f38128a8bb2b (get_local_map): Call indirect-function.
Richard M. Stallman <rms@gnu.org>
parents: 16110
diff changeset
2060 if (SYMBOLP (prop) && !NILP (prop))
f38128a8bb2b (get_local_map): Call indirect-function.
Richard M. Stallman <rms@gnu.org>
parents: 16110
diff changeset
2061 prop = Findirect_function (prop);
11660
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2062 if (!NILP (prop)
7c7519c2a45a (get_local_map): Use Fget_char_property, so that
Karl Heuer <kwzh@gnu.org>
parents: 11327
diff changeset
2063 && (tem = Fkeymapp (prop), !NILP (tem)))
2090
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2064 return prop;
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2065
10313
55ce83f36b30 Use BUF_INTERVALS throughout.
Richard M. Stallman <rms@gnu.org>
parents: 10113
diff changeset
2066 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
2067 }
c7e1308a7184 (set_point): Check invisibility of following character, not previous character.
Richard M. Stallman <rms@gnu.org>
parents: 2052
diff changeset
2068
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
2069 /* 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
2070 TREE from START to START + LENGTH.
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2071 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
2072
1316
f09c5c6563b8 * intervals.c: `copy_intervals()' no longer static.
Joseph Arceneaux <jla@gnu.org>
parents: 1307
diff changeset
2073 INTERVAL
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2074 copy_intervals (tree, start, length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2075 INTERVAL tree;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2076 int start, length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2077 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2078 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
2079 register int got, prevlen;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2080
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2081 if (NULL_INTERVAL_P (tree) || length <= 0)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2082 return NULL_INTERVAL;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2083
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2084 i = find_interval (tree, start);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2085 if (NULL_INTERVAL_P (i) || LENGTH (i) == 0)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2086 abort ();
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2087
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
2088 /* 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
2089 if ((start - i->position + 1 + length) < LENGTH (i)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2090 && DEFAULT_INTERVAL_P (i))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2091 return NULL_INTERVAL;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2092
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2093 new = make_interval ();
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2094 new->position = 0;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2095 got = (LENGTH (i) - (start - i->position));
1211
9f50cccf5963 See ChangeLog
Joseph Arceneaux <jla@gnu.org>
parents: 1189
diff changeset
2096 new->total_length = length;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2097 copy_properties (i, new);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2098
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2099 t = new;
3490
07b454ddc666 (copy_intervals): Don't adjust total_length at the end.
Richard M. Stallman <rms@gnu.org>
parents: 3333
diff changeset
2100 prevlen = got;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2101 while (got < length)
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2102 {
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2103 i = next_interval (i);
4135
84ea8ebc9858 * intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents: 4080
diff changeset
2104 t = split_interval_right (t, prevlen);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2105 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
2106 prevlen = LENGTH (i);
07b454ddc666 (copy_intervals): Don't adjust total_length at the end.
Richard M. Stallman <rms@gnu.org>
parents: 3333
diff changeset
2107 got += prevlen;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2108 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2109
5415
95882472f2da (rotate_right, rotate_left): Simplify
Richard M. Stallman <rms@gnu.org>
parents: 5250
diff changeset
2110 return balance_an_interval (new);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2111 }
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2112
4383
d4a36c1669e6 (adjust_intervals_for_insertion): Handle insertion
Richard M. Stallman <rms@gnu.org>
parents: 4243
diff changeset
2113 /* Give STRING the properties of BUFFER from POSITION to LENGTH. */
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2114
1288
b05982e82d93 Various comment changes.
Joseph Arceneaux <jla@gnu.org>
parents: 1211
diff changeset
2115 INLINE void
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2116 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
2117 Lisp_Object string;
4b672131c37f (copy_intervals_to_string): Take arg as buffer.
Richard M. Stallman <rms@gnu.org>
parents: 15734
diff changeset
2118 struct buffer *buffer;
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2119 int position, length;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2120 {
16110
4b672131c37f (copy_intervals_to_string): Take arg as buffer.
Richard M. Stallman <rms@gnu.org>
parents: 15734
diff changeset
2121 INTERVAL interval_copy = copy_intervals (BUF_INTERVALS (buffer),
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2122 position, length);
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2123 if (NULL_INTERVAL_P (interval_copy))
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2124 return;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2125
18613
614b916ff5bf Fix bugs with inappropriate mixing of Lisp_Object with int.
Richard M. Stallman <rms@gnu.org>
parents: 18125
diff changeset
2126 interval_copy->parent = (INTERVAL) XFASTINT (string);
1157
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2127 XSTRING (string)->intervals = interval_copy;
a4a446feb297 Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2128 }
10113
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2129
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2130 /* 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
2131 Assume they have identical characters. */
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2132
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2133 int
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2134 compare_string_intervals (s1, s2)
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2135 Lisp_Object s1, s2;
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2136 {
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2137 INTERVAL i1, i2;
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2138 int pos = 0;
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2139 int end = XSTRING (s1)->size;
10113
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2140
22343
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2141 i1 = find_interval (XSTRING (s1)->intervals, 0);
542ccfb606c3 (create_root_interval): Initialize position to 0
Karl Heuer <kwzh@gnu.org>
parents: 21514
diff changeset
2142 i2 = find_interval (XSTRING (s2)->intervals, 0);
10113
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2143
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2144 while (pos < end)
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2145 {
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2146 /* 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
2147 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
2148 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
2149 int distance = min (len1, len2);
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2150
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2151 /* 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
2152 they differ. */
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2153 if (! intervals_equal (i1, i2))
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2154 return 0;
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2155
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2156 /* 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
2157 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
2158 pos += distance;
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2159 if (len1 == distance)
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2160 i1 = next_interval (i1);
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2161 if (len2 == distance)
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2162 i2 = next_interval (i2);
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2163 }
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2164 return 1;
9d72d79329c3 (compare_string_intervals): New function.
Richard M. Stallman <rms@gnu.org>
parents: 9461
diff changeset
2165 }
20677
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2166
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2167 /* Recursively adjust interval I in the current buffer
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2168 for setting enable_multibyte_characters to MULTI_FLAG.
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2169 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
2170 START_BYTE ... END_BYTE in bytes. */
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2171
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2172 static void
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2173 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
2174 INTERVAL i;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2175 int multi_flag;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2176 int start, start_byte, end, end_byte;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2177 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2178 INTERVAL left, right;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2179
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2180 /* Fix the length of this interval. */
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2181 if (multi_flag)
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2182 i->total_length = end - start;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2183 else
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2184 i->total_length = end_byte - start_byte;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2185
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2186 /* Recursively fix the length of the subintervals. */
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2187 if (i->left)
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2188 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2189 int left_end, left_end_byte;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2190
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2191 if (multi_flag)
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2192 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2193 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
2194 left_end = BYTE_TO_CHAR (left_end_byte);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2195 }
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2196 else
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2197 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2198 left_end = start + LEFT_TOTAL_LENGTH (i);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2199 left_end_byte = CHAR_TO_BYTE (left_end);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2200 }
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2201
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2202 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
2203 left_end, left_end_byte);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2204 }
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2205 if (i->right)
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2206 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2207 int right_start_byte, right_start;
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2208
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2209 if (multi_flag)
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2210 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2211 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
2212 right_start = BYTE_TO_CHAR (right_start_byte);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2213 }
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2214 else
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2215 {
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2216 right_start = end - RIGHT_TOTAL_LENGTH (i);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2217 right_start_byte = CHAR_TO_BYTE (right_start);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2218 }
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2219
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2220 set_intervals_multibyte_1 (i->right, multi_flag,
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2221 right_start, right_start_byte,
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2222 end, end_byte);
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2223 }
3cb3da7382f5 (set_intervals_multibyte): New function.
Richard M. Stallman <rms@gnu.org>
parents: 20557
diff changeset
2224 }
1301
5a27062b8b7f * intervals.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents: 1288
diff changeset
2225
21351
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2226 /* 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
2227 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
2228 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
2229
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2230 void
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2231 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
2232 int multi_flag;
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2233 {
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2234 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
2235 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
2236 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
2237 }
78203467fc7d (set_intervals_multibyte): Function moved after set_intervals_multibyte_1.
Richard M. Stallman <rms@gnu.org>
parents: 21012
diff changeset
2238
1301
5a27062b8b7f * intervals.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents: 1288
diff changeset
2239 #endif /* USE_TEXT_PROPERTIES */