aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorStefan Monnier2022-11-03 23:16:12 -0400
committerStefan Monnier2022-11-03 23:16:12 -0400
commit5e7d08ae1378771f44f1e3a6840bd81a3bbb7fa7 (patch)
tree3fee58cf8e3a827a0fa9638fa4374cc4ae74c09e /src
parentff679e16f8bf8a9876fc1a980c372d4e55f3745d (diff)
downloademacs-5e7d08ae1378771f44f1e3a6840bd81a3bbb7fa7.tar.gz
emacs-5e7d08ae1378771f44f1e3a6840bd81a3bbb7fa7.zip
itree.c: Minor tightening
* src/itree.c (iter): Initialize to NULL. (init_itree): Make sure it's not allocated before we overwrite it. (itree_insert_gap): Tweak the end-loop.
Diffstat (limited to 'src')
-rw-r--r--src/itree.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/itree.c b/src/itree.c
index 611f6d46845..cd37da18b89 100644
--- a/src/itree.c
+++ b/src/itree.c
@@ -258,7 +258,7 @@ struct itree_iterator
258 are limited by the fact we don't allow modifying the tree at the same 258 are limited by the fact we don't allow modifying the tree at the same
259 time, making the use of nested iterations quite rare anyway. 259 time, making the use of nested iterations quite rare anyway.
260 So we just use a single global iterator instead for now. */ 260 So we just use a single global iterator instead for now. */
261static struct itree_iterator *iter; 261static struct itree_iterator *iter = NULL;
262 262
263static int 263static int
264interval_tree_max_height (const struct itree_tree *tree) 264interval_tree_max_height (const struct itree_tree *tree)
@@ -290,6 +290,7 @@ itree_iterator_create (struct itree_tree *tree)
290void 290void
291init_itree (void) 291init_itree (void)
292{ 292{
293 eassert (!iter);
293 iter = itree_iterator_create (NULL); 294 iter = itree_iterator_create (NULL);
294} 295}
295 296
@@ -1205,6 +1206,9 @@ itree_insert_gap (struct itree_tree *tree,
1205 ITREE_FOREACH (node, tree, pos, pos + 1, PRE_ORDER) 1206 ITREE_FOREACH (node, tree, pos, pos + 1, PRE_ORDER)
1206 { 1207 {
1207 if (node->begin == pos && node->front_advance 1208 if (node->begin == pos && node->front_advance
1209 /* If we have front_advance and !rear_advance and
1210 the overlay is empty, make sure we don't move
1211 begin past end by pretending it's !front_advance. */
1208 && (node->begin != node->end || node->rear_advance)) 1212 && (node->begin != node->end || node->rear_advance))
1209 interval_stack_push (saved, node); 1213 interval_stack_push (saved, node);
1210 } 1214 }
@@ -1213,7 +1217,7 @@ itree_insert_gap (struct itree_tree *tree,
1213 itree_remove (tree, nav_nodeptr (saved->nodes[i])); 1217 itree_remove (tree, nav_nodeptr (saved->nodes[i]));
1214 1218
1215 /* We can't use an iterator here, because we can't effectively 1219 /* We can't use an iterator here, because we can't effectively
1216 narrow AND shift some subtree at the same time. */ 1220 narrow AND shift some subtree at the same time. */
1217 if (tree->root != NULL) 1221 if (tree->root != NULL)
1218 { 1222 {
1219 const int size = interval_tree_max_height (tree) + 1; 1223 const int size = interval_tree_max_height (tree) + 1;
@@ -1229,7 +1233,7 @@ itree_insert_gap (struct itree_tree *tree,
1229 { 1233 {
1230 if (node->begin > pos) 1234 if (node->begin > pos)
1231 { 1235 {
1232 /* All nodes in this subtree are shifted by length. */ 1236 /* All nodes in this subtree are shifted by length. */
1233 node->right->offset += length; 1237 node->right->offset += length;
1234 ++tree->otick; 1238 ++tree->otick;
1235 } 1239 }
@@ -1255,16 +1259,17 @@ itree_insert_gap (struct itree_tree *tree,
1255 interval_stack_destroy (stack); 1259 interval_stack_destroy (stack);
1256 } 1260 }
1257 1261
1258 /* Reinsert nodes starting at POS having front-advance. */ 1262 /* Reinsert nodes starting at POS having front-advance. */
1259 uintmax_t notick = tree->otick; 1263 uintmax_t notick = tree->otick;
1260 nodeptr_and_flag nav; 1264 nodeptr_and_flag nav;
1261 while ((nav = interval_stack_pop (saved), 1265 while ((nav = interval_stack_pop (saved),
1262 node = nav_nodeptr (nav))) 1266 node = nav_nodeptr (nav)))
1263 { 1267 {
1264 eassert (node->otick == ootick); 1268 eassert (node->otick == ootick);
1269 eassert (node->begin == pos);
1270 eassert (node->end > pos || node->rear_advance);
1265 node->begin += length; 1271 node->begin += length;
1266 if (node->end != pos || node->rear_advance) 1272 node->end += length;
1267 node->end += length;
1268 node->otick = notick; 1273 node->otick = notick;
1269 interval_tree_insert (tree, node); 1274 interval_tree_insert (tree, node);
1270 } 1275 }
@@ -1273,7 +1278,7 @@ itree_insert_gap (struct itree_tree *tree,
1273} 1278}
1274 1279
1275/* Delete a gap at POS of length LENGTH, contracting all intervals 1280/* Delete a gap at POS of length LENGTH, contracting all intervals
1276 intersecting it. */ 1281 intersecting it. */
1277 1282
1278void 1283void
1279itree_delete_gap (struct itree_tree *tree, 1284itree_delete_gap (struct itree_tree *tree,
@@ -1282,10 +1287,10 @@ itree_delete_gap (struct itree_tree *tree,
1282 if (!tree || length <= 0 || tree->root == NULL) 1287 if (!tree || length <= 0 || tree->root == NULL)
1283 return; 1288 return;
1284 1289
1285 /* FIXME: Don't allocate stack anew every time. */ 1290 /* FIXME: Don't allocate stack anew every time. */
1286 1291
1287 /* Can't use the iterator here, because by decrementing begin, we 1292 /* Can't use the iterator here, because by decrementing begin, we
1288 might unintentionally bring shifted nodes back into our search space. */ 1293 might unintentionally bring shifted nodes back into our search space. */
1289 const int size = interval_tree_max_height (tree) + 1; 1294 const int size = interval_tree_max_height (tree) + 1;
1290 struct interval_stack *stack = interval_stack_create (size); 1295 struct interval_stack *stack = interval_stack_create (size);
1291 struct itree_node *node; 1296 struct itree_node *node;