]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Deletion case 2c can shift the root; case 3b is not the only case that
authorSimon Tatham <anakin@pobox.com>
Mon, 2 Oct 2000 11:47:30 +0000 (11:47 +0000)
committerSimon Tatham <anakin@pobox.com>
Mon, 2 Oct 2000 11:47:30 +0000 (11:47 +0000)
can do that. The bad case happens when you have a root node containing
only one actual element, and its two child nodes have only one element
each, and you try to delete the element in the root.

[originally from svn r660]

tree234.c

index 8101c78b92a7e1f936ec0c5ef1592c90aec4b81c..f97837a1b1d06063d076589cd8a72836c40e47f3 100644 (file)
--- a/tree234.c
+++ b/tree234.c
@@ -569,6 +569,17 @@ void del234(tree234 *t, void *e) {
            }
            n->elems[j] = NULL;
            n->kids[j+1] = NULL;
+            /*
+             * It's possible, in this case, that we've just removed
+             * the only element in the root of the tree. If so,
+             * shift the root.
+             */
+            if (n->elems[0] == NULL) {
+                LOG(("  shifting root!\n"));
+                t->root = a;
+                a->parent = NULL;
+                sfree(n);
+            }
            /*
             * Now go round the deletion process again, with n
             * pointing at the new big node and e still the same.