rendered paste bodyvoid
mowgli_dictionary_retune(mowgli_dictionary_t *dict, const char *key)
{
mowgli_dictionary_elem_t n, *tn, *left, *right, *node;
int ret;
return_if_fail(dict != NULL);
/*
* we initialize n with known values, since it's on stack
* memory. otherwise the dict would become corrupted.
*
* n is used for temporary storage while the tree is retuned.
* -nenolod
*/
n.left = n.right = NULL;
left = right = &n;
/* this for(;;) loop is the main workhorse of the rebalancing */
for (node = dict->root; ; )
{
if ((ret = dict->compare_cb(key, node->key)) == 0)
break;
if (ret < 0)
{
if (node->left == NULL)
break;
if ((ret = dict->compare_cb(key, node->left->key)) < 0)
{
tn = node->left;
node->left = tn->right;
tn->right = node;
node = tn;
if (node->left == NULL)
break;
}
right->left = node;
right = node;
node = node->left;
}
else
{
if (node->right == NULL)
break;
if ((ret = dict->compare_cb(key, node->right->key)) > 0)
{
tn = node->right;
node->right = tn->left;
tn->left = node;
node = tn;
if (node->right == NULL)
break;
}
left->right = node;
left = node;
node = node->right;
}
}
left->right = node->left;
right->left = node->right;
node->left = n.right;
node->right = n.left;
dict->root = node;
}