diff options
author | Warren Dukes <warren.dukes@gmail.com> | 2006-08-01 03:29:13 +0000 |
---|---|---|
committer | Warren Dukes <warren.dukes@gmail.com> | 2006-08-01 03:29:13 +0000 |
commit | 42390c5e3b90d9fd32fe227f4eb8501eafc27a23 (patch) | |
tree | 623d1587630a12b43a7a9f83e8367f7989544866 /src | |
parent | 6f695b8d74d6be4266d6631d1e3650ef2f8e7851 (diff) | |
download | mpd-42390c5e3b90d9fd32fe227f4eb8501eafc27a23.tar.gz mpd-42390c5e3b90d9fd32fe227f4eb8501eafc27a23.tar.xz mpd-42390c5e3b90d9fd32fe227f4eb8501eafc27a23.zip |
fix a bug when deleting songs and CHILDREN_PER_NODE > 3
git-svn-id: https://svn.musicpd.org/mpd/trunk@4507 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to 'src')
-rw-r--r-- | src/tree.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/src/tree.c b/src/tree.c index 52fb2c88a..c3b2bdd71 100644 --- a/src/tree.c +++ b/src/tree.c @@ -384,12 +384,10 @@ _DeleteAt(TreeIterator * iter) void * dataToFree = *data; { - TreeNode * child = NULL; - // find the least greater than data to fill the whole! if (node->children[pos+1]) { - child = node->children[++pos]; + TreeNode * child = node->children[++pos]; while (child->children[0]) { pos = 0; @@ -403,7 +401,7 @@ _DeleteAt(TreeIterator * iter) // or the greatest lesser than data to fill the whole! else if (node->children[pos]) { - child = node->children[pos]; + TreeNode * child = node->children[pos]; while (child->children[child->dataCount]) { pos = child->dataCount; @@ -427,12 +425,12 @@ _DeleteAt(TreeIterator * iter) // move data nodes over, we're at a leaf node, so we can ignore // children - int i = --node->dataCount; - for (; data != &(node->data[i]); i--) + int i = data - node->data;; + for (; i < node->dataCount-1; i++) { - node->data[i-1] = node->data[i]; + node->data[i] = node->data[i+1]; } - node->data[node->dataCount] = NULL; + node->data[--node->dataCount] = NULL; // merge the nodes from the bottom up which have too few data while (node->dataCount < (CHILDREN_PER_NODE/2)) |