51#include "magick/studio.h"
52#include "magick/exception.h"
53#include "magick/exception-private.h"
54#include "magick/locale_.h"
55#include "magick/log.h"
56#include "magick/memory_.h"
57#include "magick/splay-tree.h"
58#include "magick/semaphore.h"
59#include "magick/string_.h"
64#define MaxSplayTreeDepth 1024
88 (*compare)(
const void *,
const void *);
91 *(*relinquish_key)(
void *),
92 *(*relinquish_value)(
void *);
153MagickExport MagickBooleanType AddValueToSplayTree(
SplayTreeInfo *splay_tree,
154 const void *key,
const void *value)
162 LockSemaphoreInfo(splay_tree->semaphore);
163 SplaySplayTree(splay_tree,key);
165 if (splay_tree->root != (
NodeInfo *) NULL)
167 if (splay_tree->compare != (int (*)(
const void *,
const void *)) NULL)
168 compare=splay_tree->compare(splay_tree->root->key,key);
170 compare=(splay_tree->root->key > key) ? 1 :
171 ((splay_tree->root->key < key) ? -1 : 0);
174 if ((splay_tree->relinquish_value != (
void *(*)(
void *)) NULL) &&
175 (splay_tree->root->value != (
void *) NULL))
176 splay_tree->root->value=splay_tree->relinquish_value(
177 splay_tree->root->value);
178 if ((splay_tree->relinquish_key != (
void *(*)(
void *)) NULL) &&
179 (splay_tree->root->key != (
void *) NULL))
180 splay_tree->root->key=splay_tree->relinquish_key(
181 splay_tree->root->key);
182 splay_tree->root->key=(
void *) key;
183 splay_tree->root->value=(
void *) value;
184 UnlockSemaphoreInfo(splay_tree->semaphore);
188 node=(
NodeInfo *) AcquireMagickMemory(
sizeof(*node));
191 UnlockSemaphoreInfo(splay_tree->semaphore);
194 node->key=(
void *) key;
195 node->value=(
void *) value;
196 if (splay_tree->root == (
NodeInfo *) NULL)
204 node->left=splay_tree->root;
205 node->right=node->left->right;
206 node->left->right=(
NodeInfo *) NULL;
210 node->right=splay_tree->root;
211 node->left=node->right->left;
212 node->right->left=(
NodeInfo *) NULL;
214 splay_tree->root=node;
215 splay_tree->key=(
void *) NULL;
217 UnlockSemaphoreInfo(splay_tree->semaphore);
255 bisect=low+(high-low)/2;
257 if ((low+1) > bisect)
260 node->left=LinkSplayTreeNodes(nodes,low,bisect-1);
261 if ((bisect+1) > high)
264 node->right=LinkSplayTreeNodes(nodes,bisect+1,high);
268static inline int SplayTreeToNodeArray(
NodeInfo *node,
const void *nodes)
285 if (splay_tree->nodes <= 2)
287 splay_tree->balance=MagickFalse;
290 nodes=(
NodeInfo **) AcquireQuantumMemory((
size_t) splay_tree->nodes,
293 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
295 (void) IterateOverSplayTree(splay_tree,SplayTreeToNodeArray,(
const void *)
297 splay_tree->root=LinkSplayTreeNodes(nodes,0,splay_tree->nodes-1);
298 splay_tree->balance=MagickFalse;
299 nodes=(
NodeInfo **) RelinquishMagickMemory(nodes);
332static inline void *GetFirstSplayTreeNode(
SplayTreeInfo *splay_tree)
337 node=splay_tree->root;
338 if (splay_tree->root == (
NodeInfo *) NULL)
340 while (node->left != (
NodeInfo *) NULL)
346 void *(*clone_key)(
void *),
void *(*clone_value)(
void *))
356 assert(splay_tree->signature == MagickCoreSignature);
357 if (IsEventLogging() != MagickFalse)
358 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
359 clone_tree=NewSplayTree(splay_tree->compare,splay_tree->relinquish_key,
360 splay_tree->relinquish_value);
361 LockSemaphoreInfo(splay_tree->semaphore);
362 if (splay_tree->root == (
NodeInfo *) NULL)
364 UnlockSemaphoreInfo(splay_tree->semaphore);
367 next=(
NodeInfo *) GetFirstSplayTreeNode(splay_tree);
370 SplaySplayTree(splay_tree,next);
371 (void) AddValueToSplayTree(clone_tree,clone_key(splay_tree->root->key),
372 clone_value(splay_tree->root->value));
374 node=splay_tree->root->right;
377 while (node->left != (
NodeInfo *) NULL)
382 UnlockSemaphoreInfo(splay_tree->semaphore);
411MagickExport
int CompareSplayTreeString(
const void *target,
const void *source)
417 p=(
const char *) target;
418 q=(
const char *) source;
419 return(LocaleCompare(p,q));
447MagickExport
int CompareSplayTreeStringInfo(
const void *target,
456 return(CompareStringInfo(p,q));
485MagickExport MagickBooleanType DeleteNodeByValueFromSplayTree(
493 assert(splay_tree->signature == MagickCoreSignature);
494 if (IsEventLogging() != MagickFalse)
495 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
496 LockSemaphoreInfo(splay_tree->semaphore);
497 if (splay_tree->root == (
NodeInfo *) NULL)
499 UnlockSemaphoreInfo(splay_tree->semaphore);
502 next=(
NodeInfo *) GetFirstSplayTreeNode(splay_tree);
505 SplaySplayTree(splay_tree,next);
507 node=splay_tree->root->right;
510 while (node->left != (
NodeInfo *) NULL)
514 if (splay_tree->root->value == value)
529 key=splay_tree->root->key;
530 SplaySplayTree(splay_tree,key);
531 splay_tree->key=(
void *) NULL;
532 if (splay_tree->compare != (int (*)(
const void *,
const void *)) NULL)
533 compare=splay_tree->compare(splay_tree->root->key,key);
535 compare=(splay_tree->root->key > key) ? 1 :
536 ((splay_tree->root->key < key) ? -1 : 0);
539 UnlockSemaphoreInfo(splay_tree->semaphore);
542 left=splay_tree->root->left;
543 right=splay_tree->root->right;
544 if ((splay_tree->relinquish_value != (
void *(*)(
void *)) NULL) &&
545 (splay_tree->root->value != (
void *) NULL))
546 splay_tree->root->value=splay_tree->relinquish_value(
547 splay_tree->root->value);
548 if ((splay_tree->relinquish_key != (
void *(*)(
void *)) NULL) &&
549 (splay_tree->root->key != (
void *) NULL))
550 splay_tree->root->key=splay_tree->relinquish_key(
551 splay_tree->root->key);
552 splay_tree->root=(
NodeInfo *) RelinquishMagickMemory(splay_tree->root);
556 splay_tree->root=right;
557 UnlockSemaphoreInfo(splay_tree->semaphore);
560 splay_tree->root=left;
563 while (left->right != (
NodeInfo *) NULL)
567 UnlockSemaphoreInfo(splay_tree->semaphore);
571 UnlockSemaphoreInfo(splay_tree->semaphore);
602MagickExport MagickBooleanType DeleteNodeFromSplayTree(
613 assert(splay_tree->signature == MagickCoreSignature);
614 if (IsEventLogging() != MagickFalse)
615 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
616 if (splay_tree->root == (
NodeInfo *) NULL)
618 LockSemaphoreInfo(splay_tree->semaphore);
619 SplaySplayTree(splay_tree,key);
620 splay_tree->key=(
void *) NULL;
621 if (splay_tree->compare != (int (*)(
const void *,
const void *)) NULL)
622 compare=splay_tree->compare(splay_tree->root->key,key);
624 compare=(splay_tree->root->key > key) ? 1 :
625 ((splay_tree->root->key < key) ? -1 : 0);
628 UnlockSemaphoreInfo(splay_tree->semaphore);
631 left=splay_tree->root->left;
632 right=splay_tree->root->right;
633 if ((splay_tree->relinquish_value != (
void *(*)(
void *)) NULL) &&
634 (splay_tree->root->value != (
void *) NULL))
635 splay_tree->root->value=splay_tree->relinquish_value(
636 splay_tree->root->value);
637 if ((splay_tree->relinquish_key != (
void *(*)(
void *)) NULL) &&
638 (splay_tree->root->key != (
void *) NULL))
639 splay_tree->root->key=splay_tree->relinquish_key(splay_tree->root->key);
640 splay_tree->root=(
NodeInfo *) RelinquishMagickMemory(splay_tree->root);
644 splay_tree->root=right;
645 UnlockSemaphoreInfo(splay_tree->semaphore);
648 splay_tree->root=left;
651 while (left->right != (
NodeInfo *) NULL)
655 UnlockSemaphoreInfo(splay_tree->semaphore);
688 LockSemaphoreInfo(splay_tree->semaphore);
689 if (splay_tree->root != (
NodeInfo *) NULL)
691 if ((splay_tree->relinquish_value != (
void *(*)(
void *)) NULL) &&
692 (splay_tree->root->value != (
void *) NULL))
693 splay_tree->root->value=splay_tree->relinquish_value(
694 splay_tree->root->value);
695 if ((splay_tree->relinquish_key != (
void *(*)(
void *)) NULL) &&
696 (splay_tree->root->key != (
void *) NULL))
697 splay_tree->root->key=splay_tree->relinquish_key(splay_tree->root->key);
698 splay_tree->root->key=(
void *) NULL;
699 for (pend=splay_tree->root; pend != (
NodeInfo *) NULL; )
704 if (active->left != (
NodeInfo *) NULL)
706 if ((splay_tree->relinquish_value != (
void *(*)(
void *)) NULL) &&
707 (active->left->value != (
void *) NULL))
708 active->left->value=splay_tree->relinquish_value(
709 active->left->value);
710 if ((splay_tree->relinquish_key != (
void *(*)(
void *)) NULL) &&
711 (active->left->key != (
void *) NULL))
712 active->left->key=splay_tree->relinquish_key(active->left->key);
713 active->left->key=(
void *) pend;
716 if (active->right != (
NodeInfo *) NULL)
718 if ((splay_tree->relinquish_value != (
void *(*)(
void *)) NULL) &&
719 (active->right->value != (
void *) NULL))
720 active->right->value=splay_tree->relinquish_value(
721 active->right->value);
722 if ((splay_tree->relinquish_key != (
void *(*)(
void *)) NULL) &&
723 (active->right->key != (
void *) NULL))
724 active->right->key=splay_tree->relinquish_key(
726 active->right->key=(
void *) pend;
731 node=(
NodeInfo *) RelinquishMagickMemory(node);
735 splay_tree->signature=(~MagickCoreSignature);
736 UnlockSemaphoreInfo(splay_tree->semaphore);
737 DestroySemaphoreInfo(&splay_tree->semaphore);
738 splay_tree=(
SplayTreeInfo *) RelinquishMagickMemory(splay_tree);
766MagickExport
const void *GetNextKeyInSplayTree(
SplayTreeInfo *splay_tree)
775 assert(splay_tree->signature == MagickCoreSignature);
776 if (IsEventLogging() != MagickFalse)
777 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
778 if ((splay_tree->root == (
NodeInfo *) NULL) ||
779 (splay_tree->next == (
void *) NULL))
780 return((
void *) NULL);
781 LockSemaphoreInfo(splay_tree->semaphore);
782 SplaySplayTree(splay_tree,splay_tree->next);
783 splay_tree->next=(
void *) NULL;
784 node=splay_tree->root->right;
787 while (node->left != (
NodeInfo *) NULL)
789 splay_tree->next=node->key;
791 key=splay_tree->root->key;
792 UnlockSemaphoreInfo(splay_tree->semaphore);
820MagickExport
const void *GetNextValueInSplayTree(
SplayTreeInfo *splay_tree)
829 assert(splay_tree->signature == MagickCoreSignature);
830 if (IsEventLogging() != MagickFalse)
831 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
832 if ((splay_tree->root == (
NodeInfo *) NULL) ||
833 (splay_tree->next == (
void *) NULL))
834 return((
void *) NULL);
835 LockSemaphoreInfo(splay_tree->semaphore);
836 SplaySplayTree(splay_tree,splay_tree->next);
837 splay_tree->next=(
void *) NULL;
838 node=splay_tree->root->right;
841 while (node->left != (
NodeInfo *) NULL)
843 splay_tree->next=node->key;
845 value=splay_tree->root->value;
846 UnlockSemaphoreInfo(splay_tree->semaphore);
874MagickExport
const void *GetRootValueFromSplayTree(
SplayTreeInfo *splay_tree)
880 assert(splay_tree->signature == MagickCoreSignature);
881 if (IsEventLogging() != MagickFalse)
882 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
883 value=(
const void *) NULL;
884 LockSemaphoreInfo(splay_tree->semaphore);
885 if (splay_tree->root != (
NodeInfo *) NULL)
886 value=splay_tree->root->value;
887 UnlockSemaphoreInfo(splay_tree->semaphore);
918MagickExport
const void *GetValueFromSplayTree(
SplayTreeInfo *splay_tree,
928 assert(splay_tree->signature == MagickCoreSignature);
929 if (IsEventLogging() != MagickFalse)
930 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
931 if (splay_tree->root == (
NodeInfo *) NULL)
932 return((
void *) NULL);
933 LockSemaphoreInfo(splay_tree->semaphore);
934 SplaySplayTree(splay_tree,key);
935 if (splay_tree->compare != (int (*)(
const void *,
const void *)) NULL)
936 compare=splay_tree->compare(splay_tree->root->key,key);
938 compare=(splay_tree->root->key > key) ? 1 :
939 ((splay_tree->root->key < key) ? -1 : 0);
942 UnlockSemaphoreInfo(splay_tree->semaphore);
943 return((
void *) NULL);
945 value=splay_tree->root->value;
946 UnlockSemaphoreInfo(splay_tree->semaphore);
973MagickExport
size_t GetNumberOfNodesInSplayTree(
977 assert(splay_tree->signature == MagickCoreSignature);
978 if (IsEventLogging() != MagickFalse)
979 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
980 return(splay_tree->nodes);
1011 int (*method)(
NodeInfo *,
const void *),
const void *value)
1040 if (splay_tree->root == (
NodeInfo *) NULL)
1042 nodes=(
NodeInfo **) AcquireQuantumMemory((
size_t) splay_tree->nodes,
1044 transitions=(
unsigned char *) AcquireQuantumMemory((
size_t) splay_tree->nodes,
1045 sizeof(*transitions));
1046 if ((nodes == (
NodeInfo **) NULL) || (transitions == (
unsigned char *) NULL))
1047 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1049 final_transition=MagickFalse;
1050 nodes[0]=splay_tree->root;
1051 transitions[0]=(
unsigned char) LeftTransition;
1052 for (i=0; final_transition == MagickFalse; )
1055 transition=(TransitionType) transitions[i];
1058 case LeftTransition:
1060 transitions[i]=(
unsigned char) DownTransition;
1061 if (node->left == (
NodeInfo *) NULL)
1064 nodes[i]=node->left;
1065 transitions[i]=(
unsigned char) LeftTransition;
1068 case RightTransition:
1070 transitions[i]=(
unsigned char) UpTransition;
1071 if (node->right == (
NodeInfo *) NULL)
1074 nodes[i]=node->right;
1075 transitions[i]=(
unsigned char) LeftTransition;
1078 case DownTransition:
1081 transitions[i]=(
unsigned char) RightTransition;
1082 status=(*method)(node,value);
1084 final_transition=MagickTrue;
1091 final_transition=MagickTrue;
1099 nodes=(
NodeInfo **) RelinquishMagickMemory(nodes);
1100 transitions=(
unsigned char *) RelinquishMagickMemory(transitions);
1137 int (*compare)(
const void *,
const void *),
void *(*relinquish_key)(
void *),
1138 void *(*relinquish_value)(
void *))
1143 splay_tree=(
SplayTreeInfo *) AcquireMagickMemory(
sizeof(*splay_tree));
1145 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1146 (void) memset(splay_tree,0,
sizeof(*splay_tree));
1147 splay_tree->root=(
NodeInfo *) NULL;
1148 splay_tree->compare=compare;
1149 splay_tree->relinquish_key=relinquish_key;
1150 splay_tree->relinquish_value=relinquish_value;
1151 splay_tree->balance=MagickFalse;
1152 splay_tree->key=(
void *) NULL;
1153 splay_tree->next=(
void *) NULL;
1154 splay_tree->nodes=0;
1155 splay_tree->debug=IsEventLogging();
1156 splay_tree->semaphore=AllocateSemaphoreInfo();
1157 splay_tree->signature=MagickCoreSignature;
1187MagickExport
void *RemoveNodeByValueFromSplayTree(
SplayTreeInfo *splay_tree,
1198 assert(splay_tree->signature == MagickCoreSignature);
1199 if (IsEventLogging() != MagickFalse)
1200 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1202 if (splay_tree->root == (
NodeInfo *) NULL)
1204 LockSemaphoreInfo(splay_tree->semaphore);
1205 next=(
NodeInfo *) GetFirstSplayTreeNode(splay_tree);
1208 SplaySplayTree(splay_tree,next);
1210 node=splay_tree->root->right;
1213 while (node->left != (
NodeInfo *) NULL)
1217 if (splay_tree->root->value == value)
1229 key=splay_tree->root->key;
1230 SplaySplayTree(splay_tree,key);
1231 splay_tree->key=(
void *) NULL;
1232 if (splay_tree->compare != (int (*)(
const void *,
const void *)) NULL)
1233 compare=splay_tree->compare(splay_tree->root->key,key);
1235 compare=(splay_tree->root->key > key) ? 1 :
1236 ((splay_tree->root->key < key) ? -1 : 0);
1239 UnlockSemaphoreInfo(splay_tree->semaphore);
1242 left=splay_tree->root->left;
1243 right=splay_tree->root->right;
1244 if ((splay_tree->relinquish_value != (
void *(*)(
void *)) NULL) &&
1245 (splay_tree->root->value != (
void *) NULL))
1246 splay_tree->root->value=splay_tree->relinquish_value(
1247 splay_tree->root->value);
1248 splay_tree->root=(
NodeInfo *) RelinquishMagickMemory(splay_tree->root);
1249 splay_tree->nodes--;
1252 splay_tree->root=right;
1253 UnlockSemaphoreInfo(splay_tree->semaphore);
1256 splay_tree->root=left;
1259 while (left->right != (
NodeInfo *) NULL)
1263 UnlockSemaphoreInfo(splay_tree->semaphore);
1267 UnlockSemaphoreInfo(splay_tree->semaphore);
1296MagickExport
void *RemoveNodeFromSplayTree(
SplayTreeInfo *splay_tree,
1310 assert(splay_tree->signature == MagickCoreSignature);
1311 if (IsEventLogging() != MagickFalse)
1312 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1313 value=(
void *) NULL;
1314 if (splay_tree->root == (
NodeInfo *) NULL)
1316 LockSemaphoreInfo(splay_tree->semaphore);
1317 SplaySplayTree(splay_tree,key);
1318 splay_tree->key=(
void *) NULL;
1319 if (splay_tree->compare != (int (*)(
const void *,
const void *)) NULL)
1320 compare=splay_tree->compare(splay_tree->root->key,key);
1322 compare=(splay_tree->root->key > key) ? 1 :
1323 ((splay_tree->root->key < key) ? -1 : 0);
1326 UnlockSemaphoreInfo(splay_tree->semaphore);
1329 left=splay_tree->root->left;
1330 right=splay_tree->root->right;
1331 value=splay_tree->root->value;
1332 if ((splay_tree->relinquish_key != (
void *(*)(
void *)) NULL) &&
1333 (splay_tree->root->key != (
void *) NULL))
1334 splay_tree->root->key=splay_tree->relinquish_key(splay_tree->root->key);
1335 splay_tree->root=(
NodeInfo *) RelinquishMagickMemory(splay_tree->root);
1336 splay_tree->nodes--;
1339 splay_tree->root=right;
1340 UnlockSemaphoreInfo(splay_tree->semaphore);
1343 splay_tree->root=left;
1346 while (left->right != (
NodeInfo *) NULL)
1350 UnlockSemaphoreInfo(splay_tree->semaphore);
1385 assert(splay_tree->signature == MagickCoreSignature);
1386 if (IsEventLogging() != MagickFalse)
1387 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1388 LockSemaphoreInfo(splay_tree->semaphore);
1389 if (splay_tree->root != (
NodeInfo *) NULL)
1391 if ((splay_tree->relinquish_value != (
void *(*)(
void *)) NULL) &&
1392 (splay_tree->root->value != (
void *) NULL))
1393 splay_tree->root->value=splay_tree->relinquish_value(
1394 splay_tree->root->value);
1395 if ((splay_tree->relinquish_key != (
void *(*)(
void *)) NULL) &&
1396 (splay_tree->root->key != (
void *) NULL))
1397 splay_tree->root->key=splay_tree->relinquish_key(splay_tree->root->key);
1398 splay_tree->root->key=(
void *) NULL;
1399 for (pend=splay_tree->root; pend != (
NodeInfo *) NULL; )
1404 if (active->left != (
NodeInfo *) NULL)
1406 if ((splay_tree->relinquish_value != (
void *(*)(
void *)) NULL) &&
1407 (active->left->value != (
void *) NULL))
1408 active->left->value=splay_tree->relinquish_value(
1409 active->left->value);
1410 if ((splay_tree->relinquish_key != (
void *(*)(
void *)) NULL) &&
1411 (active->left->key != (
void *) NULL))
1412 active->left->key=splay_tree->relinquish_key(active->left->key);
1413 active->left->key=(
void *) pend;
1416 if (active->right != (
NodeInfo *) NULL)
1418 if ((splay_tree->relinquish_value != (
void *(*)(
void *)) NULL) &&
1419 (active->right->value != (
void *) NULL))
1420 active->right->value=splay_tree->relinquish_value(
1421 active->right->value);
1422 if ((splay_tree->relinquish_key != (
void *(*)(
void *)) NULL) &&
1423 (active->right->key != (
void *) NULL))
1424 active->right->key=splay_tree->relinquish_key(
1425 active->right->key);
1426 active->right->key=(
void *) pend;
1431 node=(
NodeInfo *) RelinquishMagickMemory(node);
1435 splay_tree->root=(
NodeInfo *) NULL;
1436 splay_tree->key=(
void *) NULL;
1437 splay_tree->next=(
void *) NULL;
1438 splay_tree->nodes=0;
1439 splay_tree->balance=MagickFalse;
1440 UnlockSemaphoreInfo(splay_tree->semaphore);
1467MagickExport
void ResetSplayTreeIterator(
SplayTreeInfo *splay_tree)
1470 assert(splay_tree->signature == MagickCoreSignature);
1471 if (IsEventLogging() != MagickFalse)
1472 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1473 LockSemaphoreInfo(splay_tree->semaphore);
1474 splay_tree->next=GetFirstSplayTreeNode(splay_tree);
1475 UnlockSemaphoreInfo(splay_tree->semaphore);
1529 if (splay_tree->compare != (int (*)(
const void *,
const void *)) NULL)
1530 compare=splay_tree->compare(n->key,key);
1532 compare=(n->key > key) ? 1 : ((n->key < key) ? -1 : 0);
1541 if (depth >= MaxSplayTreeDepth)
1543 splay_tree->balance=MagickTrue;
1546 n=Splay(splay_tree,depth+1,key,next,node,parent);
1547 if ((n != *node) || (splay_tree->balance != MagickFalse))
1552 if (grandparent == (
NodeInfo **) NULL)
1554 if (n == (*parent)->left)
1567 if ((n == (*parent)->left) && (*parent == (*grandparent)->left))
1570 (*grandparent)->left=p->right;
1571 p->right=(*grandparent);
1577 if ((n == (*parent)->right) && (*parent == (*grandparent)->right))
1580 (*grandparent)->right=p->left;
1581 p->left=(*grandparent);
1587 if (n == (*parent)->left)
1589 (*parent)->left=n->right;
1591 (*grandparent)->right=n->left;
1592 n->left=(*grandparent);
1596 (*parent)->right=n->left;
1598 (*grandparent)->left=n->right;
1599 n->right=(*grandparent);
1604static void SplaySplayTree(
SplayTreeInfo *splay_tree,
const void *key)
1606 if (splay_tree->root == (
NodeInfo *) NULL)
1608 if (splay_tree->key != (
void *) NULL)
1613 if (splay_tree->compare != (int (*)(
const void *,
const void *)) NULL)
1614 compare=splay_tree->compare(splay_tree->root->key,key);
1616 compare=(splay_tree->key > key) ? 1 :
1617 ((splay_tree->key < key) ? -1 : 0);
1621 (void) Splay(splay_tree,0UL,key,&splay_tree->root,(
NodeInfo **) NULL,
1623 if (splay_tree->balance != MagickFalse)
1625 BalanceSplayTree(splay_tree);
1626 (void) Splay(splay_tree,0UL,key,&splay_tree->root,(
NodeInfo **) NULL,
1628 if (splay_tree->balance != MagickFalse)
1629 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1631 splay_tree->key=(
void *) key;