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 *);
118 IterateOverSplayTree(SplayTreeInfo *,
int (*)(NodeInfo *,
const void *),
122 SplaySplayTree(SplayTreeInfo *,
const 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));
189 if (node == (NodeInfo *) NULL)
191 UnlockSemaphoreInfo(splay_tree->semaphore);
194 node->key=(
void *) key;
195 node->value=(
void *) value;
196 if (splay_tree->root == (NodeInfo *) NULL)
198 node->left=(NodeInfo *) NULL;
199 node->right=(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);
246static NodeInfo *LinkSplayTreeNodes(NodeInfo **nodes,
const size_t low,
255 bisect=low+(high-low)/2;
257 if ((low+1) > bisect)
258 node->left=(NodeInfo *) NULL;
260 node->left=LinkSplayTreeNodes(nodes,low,bisect-1);
261 if ((bisect+1) > high)
262 node->right=(NodeInfo *) NULL;
264 node->right=LinkSplayTreeNodes(nodes,bisect+1,high);
268static inline int SplayTreeToNodeArray(NodeInfo *node,
const void *nodes)
273 p=(
const NodeInfo ***) nodes;
279static void BalanceSplayTree(SplayTreeInfo *splay_tree)
285 if (splay_tree->nodes <= 2)
287 splay_tree->balance=MagickFalse;
290 nodes=(NodeInfo **) AcquireQuantumMemory((
size_t) splay_tree->nodes,
292 if (nodes == (NodeInfo **) NULL)
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)
339 return((NodeInfo *) NULL);
340 while (node->left != (NodeInfo *) NULL)
345MagickExport SplayTreeInfo *CloneSplayTree(SplayTreeInfo *splay_tree,
346 void *(*clone_key)(
void *),
void *(*clone_value)(
void *))
355 assert(splay_tree != (SplayTreeInfo *) NULL);
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);
368 while (next != (NodeInfo *) NULL)
370 SplaySplayTree(splay_tree,next);
371 (void) AddValueToSplayTree(clone_tree,clone_key(splay_tree->root->key),
372 clone_value(splay_tree->root->value));
373 next=(NodeInfo *) NULL;
374 node=splay_tree->root->right;
375 if (node != (NodeInfo *) NULL)
377 while (node->left != (NodeInfo *) NULL)
379 next=(NodeInfo *) node->key;
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,
454 p=(
const StringInfo *) target;
455 q=(
const StringInfo *) source;
456 return(CompareStringInfo(p,q));
485MagickExport MagickBooleanType DeleteNodeByValueFromSplayTree(
486 SplayTreeInfo *splay_tree,
const void *value)
492 assert(splay_tree != (SplayTreeInfo *) NULL);
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);
503 while (next != (NodeInfo *) NULL)
505 SplaySplayTree(splay_tree,next);
506 next=(NodeInfo *) NULL;
507 node=splay_tree->root->right;
508 if (node != (NodeInfo *) NULL)
510 while (node->left != (NodeInfo *) NULL)
512 next=(NodeInfo *) node->key;
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);
554 if (left == (NodeInfo *) NULL)
556 splay_tree->root=right;
557 UnlockSemaphoreInfo(splay_tree->semaphore);
560 splay_tree->root=left;
561 if (right != (NodeInfo *) NULL)
563 while (left->right != (NodeInfo *) NULL)
567 UnlockSemaphoreInfo(splay_tree->semaphore);
571 UnlockSemaphoreInfo(splay_tree->semaphore);
602MagickExport MagickBooleanType DeleteNodeFromSplayTree(
603 SplayTreeInfo *splay_tree,
const void *key)
612 assert(splay_tree != (SplayTreeInfo *) NULL);
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);
642 if (left == (NodeInfo *) NULL)
644 splay_tree->root=right;
645 UnlockSemaphoreInfo(splay_tree->semaphore);
648 splay_tree->root=left;
649 if (right != (NodeInfo *) NULL)
651 while (left->right != (NodeInfo *) NULL)
655 UnlockSemaphoreInfo(splay_tree->semaphore);
681MagickExport SplayTreeInfo *DestroySplayTree(SplayTreeInfo *splay_tree)
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; )
702 for (pend=(NodeInfo *) NULL; active != (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;
730 active=(NodeInfo *) node->key;
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)
774 assert(splay_tree != (SplayTreeInfo *) NULL);
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;
785 if (node != (NodeInfo *) NULL)
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)
828 assert(splay_tree != (SplayTreeInfo *) NULL);
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;
839 if (node != (NodeInfo *) NULL)
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)
879 assert(splay_tree != (SplayTreeInfo *) NULL);
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,
927 assert(splay_tree != (SplayTreeInfo *) NULL);
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(
974 const SplayTreeInfo *splay_tree)
976 assert(splay_tree != (SplayTreeInfo *) NULL);
977 assert(splay_tree->signature == MagickCoreSignature);
978 if (IsEventLogging() != MagickFalse)
979 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
980 return(splay_tree->nodes);
1010static int IterateOverSplayTree(SplayTreeInfo *splay_tree,
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);
1136MagickExport SplayTreeInfo *NewSplayTree(
1137 int (*compare)(
const void *,
const void *),
void *(*relinquish_key)(
void *),
1138 void *(*relinquish_value)(
void *))
1143 splay_tree=(SplayTreeInfo *) AcquireMagickMemory(
sizeof(*splay_tree));
1144 if (splay_tree == (SplayTreeInfo *) NULL)
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,
1197 assert(splay_tree != (SplayTreeInfo *) NULL);
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);
1206 while (next != (NodeInfo *) NULL)
1208 SplaySplayTree(splay_tree,next);
1209 next=(NodeInfo *) NULL;
1210 node=splay_tree->root->right;
1211 if (node != (NodeInfo *) NULL)
1213 while (node->left != (NodeInfo *) NULL)
1215 next=(NodeInfo *) node->key;
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--;
1250 if (left == (NodeInfo *) NULL)
1252 splay_tree->root=right;
1253 UnlockSemaphoreInfo(splay_tree->semaphore);
1256 splay_tree->root=left;
1257 if (right != (NodeInfo *) NULL)
1259 while (left->right != (NodeInfo *) NULL)
1263 UnlockSemaphoreInfo(splay_tree->semaphore);
1267 UnlockSemaphoreInfo(splay_tree->semaphore);
1296MagickExport
void *RemoveNodeFromSplayTree(SplayTreeInfo *splay_tree,
1309 assert(splay_tree != (SplayTreeInfo *) NULL);
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--;
1337 if (left == (NodeInfo *) NULL)
1339 splay_tree->root=right;
1340 UnlockSemaphoreInfo(splay_tree->semaphore);
1343 splay_tree->root=left;
1344 if (right != (NodeInfo *) NULL)
1346 while (left->right != (NodeInfo *) NULL)
1350 UnlockSemaphoreInfo(splay_tree->semaphore);
1377MagickExport
void ResetSplayTree(SplayTreeInfo *splay_tree)
1384 assert(splay_tree != (SplayTreeInfo *) NULL);
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; )
1402 for (pend=(NodeInfo *) NULL; active != (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;
1430 active=(NodeInfo *) node->key;
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)
1469 assert(splay_tree != (SplayTreeInfo *) NULL);
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);
1510static NodeInfo *Splay(SplayTreeInfo *splay_tree,
const size_t depth,
1511 const void *key,NodeInfo **node,NodeInfo **parent,NodeInfo **grandparent)
1522 if (n == (NodeInfo *) NULL)
1524 if (parent != (NodeInfo **) NULL)
1527 return((NodeInfo *) NULL);
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);
1533 next=(NodeInfo **) NULL;
1539 if (next != (NodeInfo **) NULL)
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))
1550 if (parent == (NodeInfo **) NULL)
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,
1622 (NodeInfo **) NULL);
1623 if (splay_tree->balance != MagickFalse)
1625 BalanceSplayTree(splay_tree);
1626 (void) Splay(splay_tree,0UL,key,&splay_tree->root,(NodeInfo **) NULL,
1627 (NodeInfo **) NULL);
1628 if (splay_tree->balance != MagickFalse)
1629 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1631 splay_tree->key=(
void *) key;