diff options
| author | Stefan Monnier | 2022-11-03 23:16:12 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2022-11-03 23:16:12 -0400 |
| commit | 5e7d08ae1378771f44f1e3a6840bd81a3bbb7fa7 (patch) | |
| tree | 3fee58cf8e3a827a0fa9638fa4374cc4ae74c09e /src | |
| parent | ff679e16f8bf8a9876fc1a980c372d4e55f3745d (diff) | |
| download | emacs-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.c | 23 |
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. */ |
| 261 | static struct itree_iterator *iter; | 261 | static struct itree_iterator *iter = NULL; |
| 262 | 262 | ||
| 263 | static int | 263 | static int |
| 264 | interval_tree_max_height (const struct itree_tree *tree) | 264 | interval_tree_max_height (const struct itree_tree *tree) |
| @@ -290,6 +290,7 @@ itree_iterator_create (struct itree_tree *tree) | |||
| 290 | void | 290 | void |
| 291 | init_itree (void) | 291 | init_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 | ||
| 1278 | void | 1283 | void |
| 1279 | itree_delete_gap (struct itree_tree *tree, | 1284 | itree_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; |