X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=magick%2Fsplay-tree.c;h=3b22b8ccf0781493801afda5b2856857e1e0c150;hb=7959f82310c4ff55f8c91f7b477e8ca1e49f8544;hp=125f3f16a200db8c9a05679bc0f3e415f37df21d;hpb=63fed270c402a8127899cee58faa69f85f5443fa;p=imagemagick diff --git a/magick/splay-tree.c b/magick/splay-tree.c index 125f3f16a..3b22b8ccf 100644 --- a/magick/splay-tree.c +++ b/magick/splay-tree.c @@ -325,9 +325,27 @@ static void BalanceSplayTree(SplayTreeInfo *splay_tree) % whenever a value object is added to the splay-tree. % */ + +static void *GetFirstSplayTreeNode(SplayTreeInfo *splay_tree) +{ + register NodeInfo + *node; + + node=splay_tree->root; + if (splay_tree->root == (NodeInfo *) NULL) + return((NodeInfo *) NULL); + while (node->left != (NodeInfo *) NULL) + node=node->left; + return(node->key); +} + MagickExport SplayTreeInfo *CloneSplayTree(SplayTreeInfo *splay_tree, void *(*clone_key)(void *),void *(*clone_value)(void *)) { + register NodeInfo + *next, + *node; + SplayTreeInfo *clone_tree; @@ -338,62 +356,26 @@ MagickExport SplayTreeInfo *CloneSplayTree(SplayTreeInfo *splay_tree, clone_tree=NewSplayTree(splay_tree->compare,splay_tree->relinquish_key, splay_tree->relinquish_value); LockSemaphoreInfo(splay_tree->semaphore); - if (splay_tree->root != (NodeInfo *) NULL) + if (splay_tree->root == (NodeInfo *) NULL) { - register NodeInfo - *active, - *next, - *node; - - void - *key, - *value; - - key=splay_tree->root->key; - if ((clone_key != (void *(*)(void *)) NULL) && (key != (void *) NULL)) - key=clone_key(key); - value=splay_tree->root->value; - if ((clone_value != (void *(*)(void *)) NULL) && (value != (void *) NULL)) - value=clone_value(value); - (void) AddValueToSplayTree(clone_tree,key,value); - for (node=splay_tree->root; node != (NodeInfo *) NULL; ) + UnlockSemaphoreInfo(splay_tree->semaphore); + return(clone_tree); + } + next=(NodeInfo *) GetFirstSplayTreeNode(splay_tree); + while (next != (NodeInfo *) NULL) + { + SplaySplayTree(splay_tree,next); + (void) AddValueToSplayTree(clone_tree,clone_key(splay_tree->root->key), + clone_value(splay_tree->root->value)); + next=(NodeInfo *) NULL; + node=splay_tree->root->right; + if (node != (NodeInfo *) NULL) { - active=node; - for (node=(NodeInfo *) NULL; active != (NodeInfo *) NULL; ) - { - next=(NodeInfo *) NULL; - if (active->left != (NodeInfo *) NULL) - { - next=node; - key=active->left->key; - if ((clone_key != (void *(*)(void *)) NULL) && - (key != (void *) NULL)) - key=clone_key(key); - value=active->left->value; - if ((clone_value != (void *(*)(void *)) NULL) && - (value != (void *) NULL)) - value=clone_value(value); - (void) AddValueToSplayTree(clone_tree,key,value); - node=active->left; - } - if (active->right != (NodeInfo *) NULL) - { - next=node; - key=active->right->key; - if ((clone_key != (void *(*)(void *)) NULL) && - (key != (void *) NULL)) - key=clone_key(key); - value=active->right->value; - if ((clone_value != (void *(*)(void *)) NULL) && - (value != (void *) NULL)) - value=clone_value(value); - (void) AddValueToSplayTree(clone_tree,key,value); - node=active->right; - } - active=next; - } + while (node->left != (NodeInfo *) NULL) + node=node->left; + next=(NodeInfo *) node->key; } - } + } UnlockSemaphoreInfo(splay_tree->semaphore); return(clone_tree); } @@ -497,20 +479,6 @@ MagickExport int CompareSplayTreeStringInfo(const void *target, % o value: the value. % */ - -static void *GetFirstSplayTreeNode(SplayTreeInfo *splay_tree) -{ - register NodeInfo - *node; - - node=splay_tree->root; - if (splay_tree->root == (NodeInfo *) NULL) - return((NodeInfo *) NULL); - while (node->left != (NodeInfo *) NULL) - node=node->left; - return(node->key); -} - MagickExport MagickBooleanType DeleteNodeByValueFromSplayTree( SplayTreeInfo *splay_tree,const void *value) {