1abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 2abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 4abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 5abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 6abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% L IIIII N N K K EEEEE DDDD L IIIII SSSSS TTTTT % 7abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% L I NN N K K E D D L I SS T % 8abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% L I N N N KKK EEE D D = L I SSS T % 9abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% L I N NN K K E D D L I SS T % 10abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% LLLLL IIIII N N K K EEEEE DDDD LLLLL IIIII SSSSS T % 11abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 12abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 13abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% MagickCore Linked-list Methods % 14abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 15abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% Software Design % 16abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% Cristy % 17abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% December 2002 % 18abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 19abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 20abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization % 21abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% dedicated to making software imaging solutions freely available. % 22abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 23abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% You may not use this file except in compliance with the License. You may % 24abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% obtain a copy of the License at % 25abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 26abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% http://www.imagemagick.org/script/license.php % 27abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 28abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% Unless required by applicable law or agreed to in writing, software % 29abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% distributed under the License is distributed on an "AS IS" BASIS, % 30abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % 31abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% See the License for the specific language governing permissions and % 32abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% limitations under the License. % 33abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 34abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 35abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 36abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% This module implements the standard handy hash and linked-list methods for 37abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% storing and retrieving large numbers of data elements. It is loosely based 38abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% on the Java implementation of these algorithms. 39abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 40abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 41abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 42abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 43abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk Include declarations. 44abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 45abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/studio.h" 46abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/exception.h" 47abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/exception-private.h" 48abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/linked-list.h" 49abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/locale_.h" 50abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/memory_.h" 51abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/semaphore.h" 52abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/signature-private.h" 53abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/string_.h" 54abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 55abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 56abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk Typedef declarations. 57abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 58abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirktypedef struct _ElementInfo 59abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 60abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk void 61abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *value; 62abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 63abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk struct _ElementInfo 64abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *next; 65abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} ElementInfo; 66abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 67abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkstruct _LinkedListInfo 68abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 69abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk size_t 70abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk capacity, 71abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk elements; 72abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 73abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk ElementInfo 74abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *head, 75abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *tail, 76abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *next; 77abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 78abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk SemaphoreInfo 79abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *semaphore; 80abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 81abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk size_t 82abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk signature; 83abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk}; 84abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 85abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 86abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 87abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 88abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 89abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 90abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A p p e n d V a l u e T o L i n k e d L i s t % 91abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 92abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 93abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 94abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 95abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 96abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% AppendValueToLinkedList() appends a value to the end of the linked-list. 97abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 98abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the AppendValueToLinkedList method is: 99abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 100abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% MagickBooleanType AppendValueToLinkedList(LinkedListInfo *list_info, 101abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% const void *value) 102abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 103abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 104abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 105abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the linked-list info. 106abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 107abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o value: the value. 108abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 109abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 110abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport MagickBooleanType AppendValueToLinkedList( 111abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LinkedListInfo *list_info,const void *value) 112abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 113abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk register ElementInfo 114abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *next; 115abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 116abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 117abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 118abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->elements == list_info->capacity) 119abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(MagickFalse); 120abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=(ElementInfo *) AcquireMagickMemory(sizeof(*next)); 121abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (next == (ElementInfo *) NULL) 122abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(MagickFalse); 123abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->value=(void *) value; 124abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->next=(ElementInfo *) NULL; 125abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LockSemaphoreInfo(list_info->semaphore); 126abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->next == (ElementInfo *) NULL) 127abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=next; 128abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->elements == 0) 129abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->head=next; 130abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk else 131abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->tail->next=next; 132abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->tail=next; 133abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->elements++; 134abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 135abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(MagickTrue); 136abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 137abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 138abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 139abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 140abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 141abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 142abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 143abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% C l e a r L i n k e d L i s t % 144abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 145abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 146abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 147abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 148abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 149abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% ClearLinkedList() clears all the elements from the linked-list. 150abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 151abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the ClearLinkedList method is: 152abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 153abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% void ClearLinkedList(LinkedListInfo *list_info, 154abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% void *(*relinquish_value)(void *)) 155abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 156abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 157abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 158abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the linked-list info. 159abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 160abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o relinquish_value: the value deallocation method; typically 161abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% RelinquishMagickMemory(). 162abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 163abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 164abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport void ClearLinkedList(LinkedListInfo *list_info, 165abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk void *(*relinquish_value)(void *)) 166abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 167abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk ElementInfo 168abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *element; 169abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 170abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk register ElementInfo 171abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *next; 172abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 173abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 174abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 175abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LockSemaphoreInfo(list_info->semaphore); 176abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=list_info->head; 177abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk while (next != (ElementInfo *) NULL) 178abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 179abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (relinquish_value != (void *(*)(void *)) NULL) 180abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->value=relinquish_value(next->value); 181abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element=next; 182abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=next->next; 183abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element=(ElementInfo *) RelinquishMagickMemory(element); 184abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 185abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->head=(ElementInfo *) NULL; 186abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->tail=(ElementInfo *) NULL; 187abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=(ElementInfo *) NULL; 188abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->elements=0; 189abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 190abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 191abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 192abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 193abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 194abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 195abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 196abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 197abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% D e s t r o y L i n k e d L i s t % 198abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 199abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 200abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 201abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 202abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 203abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% DestroyLinkedList() frees the linked-list and all associated resources. 204abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 205abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the DestroyLinkedList method is: 206abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 207abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% LinkedListInfo *DestroyLinkedList(LinkedListInfo *list_info, 208abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% void *(*relinquish_value)(void *)) 209abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 210abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 211abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 212abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the linked-list info. 213abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 214abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o relinquish_value: the value deallocation method; typically 215abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% RelinquishMagickMemory(). 216abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 217abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 218abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport LinkedListInfo *DestroyLinkedList(LinkedListInfo *list_info, 219abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk void *(*relinquish_value)(void *)) 220abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 221abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk ElementInfo 222abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *entry; 223abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 224abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk register ElementInfo 225abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *next; 226abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 227abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 228abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 229abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LockSemaphoreInfo(list_info->semaphore); 230abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk for (next=list_info->head; next != (ElementInfo *) NULL; ) 231abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 232abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (relinquish_value != (void *(*)(void *)) NULL) 233abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->value=relinquish_value(next->value); 234abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk entry=next; 235abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=next->next; 236abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk entry=(ElementInfo *) RelinquishMagickMemory(entry); 237abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 238abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->signature=(~MagickCoreSignature); 239abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 240abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk RelinquishSemaphoreInfo(&list_info->semaphore); 241abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info=(LinkedListInfo *) RelinquishMagickMemory(list_info); 242abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(list_info); 243abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 244abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 245abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 246abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 247abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 248abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 249abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 250abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% G e t L a s t V a l u e I n L i n k e d L i s t % 251abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 252abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 253abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 254abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 255abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 256abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% GetLastValueInLinkedList() gets the last value in the linked-list. 257abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 258abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the GetLastValueInLinkedList method is: 259abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 260abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% void *GetLastValueInLinkedList(LinkedListInfo *list_info) 261abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 262abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 263abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 264abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the linked_list info. 265abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 266abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 267abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport void *GetLastValueInLinkedList(LinkedListInfo *list_info) 268abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 269abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk void 270abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *value; 271abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 272abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 273abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 274abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->elements == 0) 275abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return((void *) NULL); 276abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LockSemaphoreInfo(list_info->semaphore); 277abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk value=list_info->tail->value; 278abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 279abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(value); 280abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 281abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 282abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 283abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 284abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 285abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 286abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 287abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% G e t N e x t V a l u e I n L i n k e d L i s t % 288abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 289abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 290abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 291abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 292abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 293abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% GetNextValueInLinkedList() gets the next value in the linked-list. 294abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 295abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the GetNextValueInLinkedList method is: 296abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 297abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% void *GetNextValueInLinkedList(LinkedListInfo *list_info) 298abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 299abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 300abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 301abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the linked-list info. 302abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 303abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 304abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport void *GetNextValueInLinkedList(LinkedListInfo *list_info) 305abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 306abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk void 307abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *value; 308abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 309abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 310abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 311abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LockSemaphoreInfo(list_info->semaphore); 312abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->next == (ElementInfo *) NULL) 313abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 314abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 315abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return((void *) NULL); 316abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 317abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk value=list_info->next->value; 318abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=list_info->next->next; 319abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 320abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(value); 321abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 322abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 323abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 324abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 325abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 326abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 327abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 328abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% G e t N u m b e r O f E l e m e n t s I n L i n k e d L i s t % 329abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 330abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 331abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 332abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 333abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 334abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% GetNumberOfElementsInLinkedList() returns the number of entries in the 335abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% linked-list. 336abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 337abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the GetNumberOfElementsInLinkedList method is: 338abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 339abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% size_t GetNumberOfElementsInLinkedList( 340abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% const LinkedListInfo *list_info) 341abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 342abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 343abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 344abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the linked-list info. 345abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 346abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 347abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport size_t GetNumberOfElementsInLinkedList( 348abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk const LinkedListInfo *list_info) 349abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 350abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 351abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 352abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(list_info->elements); 353abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 354abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 355abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 356abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 357abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 358abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 359abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 360abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% G e t V a l u e F r o m L i n k e d L i s t % 361abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 362abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 363abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 364abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 365abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 366abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% GetValueFromLinkedList() gets a value from the linked-list at the specified 367abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% location. 368abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 369abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the GetValueFromLinkedList method is: 370abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 371abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% void *GetValueFromLinkedList(LinkedListInfo *list_info, 372abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% const size_t index) 373abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 374abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 375abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 376abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the linked_list info. 377abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 378abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o index: the list index. 379abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 380abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 381abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport void *GetValueFromLinkedList(LinkedListInfo *list_info, 382abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk const size_t index) 383abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 384abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk register ElementInfo 385abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *next; 386abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 387abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk register ssize_t 388abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk i; 389abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 390abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk void 391abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *value; 392abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 393abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 394abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 395abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (index >= list_info->elements) 396abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return((void *) NULL); 397abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LockSemaphoreInfo(list_info->semaphore); 398abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (index == 0) 399abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 400abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk value=list_info->head->value; 401abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 402abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(value); 403abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 404abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (index == (list_info->elements-1)) 405abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 406abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk value=list_info->tail->value; 407abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 408abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(value); 409abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 410abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=list_info->head; 411abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk for (i=0; i < (ssize_t) index; i++) 412abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=next->next; 413abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk value=next->value; 414abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 415abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(value); 416abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 417abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 418abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 419abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 420abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 421abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 422abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 423abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% I n s e r t V a l u e I n L i n k e d L i s t % 424abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 425abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 426abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 427abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 428abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 429abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% InsertValueInLinkedList() inserts an element in the linked-list at the 430abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% specified location. 431abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 432abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the InsertValueInLinkedList method is: 433abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 434abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% MagickBooleanType InsertValueInLinkedList(ListInfo *list_info, 435abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% const size_t index,const void *value) 436abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 437abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 438abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 439abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the hashmap info. 440abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 441abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o index: the index. 442abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 443abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o value: the value. 444abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 445abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 446abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport MagickBooleanType InsertValueInLinkedList( 447abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LinkedListInfo *list_info,const size_t index,const void *value) 448abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 449abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk register ElementInfo 450abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *next; 451abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 452abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk register ssize_t 453abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk i; 454abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 455abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 456abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 457abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (value == (const void *) NULL) 458abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(MagickFalse); 459abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if ((index > list_info->elements) || 460abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk (list_info->elements == list_info->capacity)) 461abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(MagickFalse); 462abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=(ElementInfo *) AcquireMagickMemory(sizeof(*next)); 463abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (next == (ElementInfo *) NULL) 464abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(MagickFalse); 465abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->value=(void *) value; 466abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->next=(ElementInfo *) NULL; 467abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LockSemaphoreInfo(list_info->semaphore); 468abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->elements == 0) 469abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 470abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->next == (ElementInfo *) NULL) 471abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=next; 472abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->head=next; 473abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->tail=next; 474abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 475abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk else 476abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 477abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (index == 0) 478abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 479abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->next == list_info->head) 480abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=next; 481abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->next=list_info->head; 482abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->head=next; 483abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 484abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk else 485abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (index == list_info->elements) 486abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 487abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->next == (ElementInfo *) NULL) 488abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=next; 489abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->tail->next=next; 490abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->tail=next; 491abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 492abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk else 493abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 494abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk ElementInfo 495abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *element; 496abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 497abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element=list_info->head; 498abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->next=element->next; 499abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk for (i=1; i < (ssize_t) index; i++) 500abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 501abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element=element->next; 502abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->next=element->next; 503abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 504abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=next->next; 505abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element->next=next; 506abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->next == next->next) 507abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=next; 508abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 509abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 510abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->elements++; 511abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 512abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(MagickTrue); 513abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 514abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 515abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 516abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 517abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 518abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 519abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 520abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% I n s e r t V a l u e I n S o r t e d L i n k e d L i s t % 521abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 522abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 523abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 524abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 525abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 526abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% InsertValueInSortedLinkedList() inserts a value in the sorted linked-list. 527abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 528abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the InsertValueInSortedLinkedList method is: 529abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 530abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% MagickBooleanType InsertValueInSortedLinkedList(ListInfo *list_info, 531abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% int (*compare)(const void *,const void *),void **replace, 532abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% const void *value) 533abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 534abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 535abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 536abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the hashmap info. 537abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 538abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o index: the index. 539abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 540abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o compare: the compare method. 541abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 542abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o replace: return previous element here. 543abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 544abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o value: the value. 545abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 546abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 547abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport MagickBooleanType InsertValueInSortedLinkedList( 548abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LinkedListInfo *list_info,int (*compare)(const void *,const void *), 549abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk void **replace,const void *value) 550abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 551abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk ElementInfo 552abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *element; 553abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 554abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk register ElementInfo 555abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *next; 556abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 557abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk register ssize_t 558abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk i; 559abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 560abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 561abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 562abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if ((compare == (int (*)(const void *,const void *)) NULL) || 563abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk (value == (const void *) NULL)) 564abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(MagickFalse); 565abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->elements == list_info->capacity) 566abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(MagickFalse); 567abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=(ElementInfo *) AcquireMagickMemory(sizeof(*next)); 568abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (next == (ElementInfo *) NULL) 569abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(MagickFalse); 570abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->value=(void *) value; 571abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element=(ElementInfo *) NULL; 572abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LockSemaphoreInfo(list_info->semaphore); 573abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->next=list_info->head; 574abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk while (next->next != (ElementInfo *) NULL) 575abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 576abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk i=(ssize_t) compare(value,next->next->value); 577abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if ((i < 0) || ((replace != (void **) NULL) && (i == 0))) 578abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 579abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (i == 0) 580abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 581abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *replace=next->next->value; 582abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->next=next->next->next; 583abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (element != (ElementInfo *) NULL) 584abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element->next=(ElementInfo *) RelinquishMagickMemory( 585abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element->next); 586abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->elements--; 587abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 588abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (element != (ElementInfo *) NULL) 589abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element->next=next; 590abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk else 591abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->head=next; 592abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk break; 593abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 594abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element=next->next; 595abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->next=next->next->next; 596abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 597abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (next->next == (ElementInfo *) NULL) 598abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 599abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (element != (ElementInfo *) NULL) 600abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element->next=next; 601abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk else 602abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->head=next; 603abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->tail=next; 604abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 605abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->elements++; 606abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 607abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(MagickTrue); 608abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 609abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 610abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 611abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 612abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 613abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 614abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 615abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% I s L i n k e d L i s t E m p t y % 616abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 617abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 618abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 619abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 620abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 621abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% IsLinkedListEmpty() returns MagickTrue if the linked-list is empty. 622abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 623abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the IsLinkedListEmpty method is: 624abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 625abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% MagickBooleanType IsLinkedListEmpty(LinkedListInfo *list_info) 626abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 627abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 628abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 629abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the linked-list info. 630abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 631abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 632abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport MagickBooleanType IsLinkedListEmpty( 633abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk const LinkedListInfo *list_info) 634abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 635abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 636abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 637abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(list_info->elements == 0 ? MagickTrue : MagickFalse); 638abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 639abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 640abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 641abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 642abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 643abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 644abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 645abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% L i n k e d L i s t T o A r r a y % 646abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 647abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 648abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 649abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 650abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 651abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% LinkedListToArray() converts the linked-list to an array. 652abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 653abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the LinkedListToArray method is: 654abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 655abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% MagickBooleanType LinkedListToArray(LinkedListInfo *list_info, 656abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% void **array) 657abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 658abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 659abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 660abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the linked-list info. 661abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 662abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o array: the array. 663abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 664abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 665abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport MagickBooleanType LinkedListToArray(LinkedListInfo *list_info, 666abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk void **array) 667abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 668abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk register ElementInfo 669abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *next; 670abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 671abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk register ssize_t 672abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk i; 673abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 674abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 675abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 676abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (array == (void **) NULL) 677abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(MagickFalse); 678abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LockSemaphoreInfo(list_info->semaphore); 679abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=list_info->head; 680abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk for (i=0; next != (ElementInfo *) NULL; i++) 681abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 682abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk array[i]=next->value; 683abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=next->next; 684abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 685abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 686abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(MagickTrue); 687abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 688abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 689abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 690abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 691abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 692abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 693abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 694abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% N e w L i n k e d L i s t I n f o % 695abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 696abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 697abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 698abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 699abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 700abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% NewLinkedList() returns a pointer to a LinkedListInfo structure 701abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% initialized to default values. 702abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 703abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the NewLinkedList method is: 704abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 705abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% LinkedListInfo *NewLinkedList(const size_t capacity) 706abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 707abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 708abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 709abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o capacity: the maximum number of elements in the list. 710abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 711abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 712abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport LinkedListInfo *NewLinkedList(const size_t capacity) 713abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 714abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LinkedListInfo 715abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *list_info; 716abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 717abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info=(LinkedListInfo *) AcquireMagickMemory(sizeof(*list_info)); 718abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info == (LinkedListInfo *) NULL) 719abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); 720abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk (void) ResetMagickMemory(list_info,0,sizeof(*list_info)); 721abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->capacity=capacity == 0 ? (size_t) (~0) : capacity; 722abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->elements=0; 723abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->head=(ElementInfo *) NULL; 724abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->tail=(ElementInfo *) NULL; 725abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=(ElementInfo *) NULL; 726abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->semaphore=AcquireSemaphoreInfo(); 727abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->signature=MagickCoreSignature; 728abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(list_info); 729abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 730abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 731abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 732abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 733abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 734abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 735abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 736abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% R e m o v e E l e m e n t B y V a l u e F r o m L i n k e d L i s t % 737abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 738abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 739abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 740abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 741abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 742abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% RemoveElementByValueFromLinkedList() removes an element from the linked-list 743abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% by value. 744abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 745abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the RemoveElementByValueFromLinkedList method is: 746abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 747abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% void *RemoveElementByValueFromLinkedList(LinkedListInfo *list_info, 748abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% const void *value) 749abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 750abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 751abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 752abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the list info. 753abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 754abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o value: the value. 755abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 756abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 757abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport void *RemoveElementByValueFromLinkedList(LinkedListInfo *list_info, 758abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk const void *value) 759abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 760abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk ElementInfo 761abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *next; 762abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 763abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 764abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 765abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if ((list_info->elements == 0) || (value == (const void *) NULL)) 766abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return((void *) NULL); 767abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LockSemaphoreInfo(list_info->semaphore); 768abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (value == list_info->head->value) 769abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 770abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->next == list_info->head) 771abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=list_info->head->next; 772abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=list_info->head; 773abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->head=list_info->head->next; 774abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=(ElementInfo *) RelinquishMagickMemory(next); 775abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 776abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk else 777abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 778abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk ElementInfo 779abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *element; 780abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 781abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=list_info->head; 782abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk while ((next->next != (ElementInfo *) NULL) && 783abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk (next->next->value != value)) 784abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=next->next; 785abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (next->next == (ElementInfo *) NULL) 786abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 787abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 788abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return((void *) NULL); 789abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 790abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element=next->next; 791abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->next=element->next; 792abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (element == list_info->tail) 793abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->tail=next; 794abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->next == element) 795abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=element->next; 796abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element=(ElementInfo *) RelinquishMagickMemory(element); 797abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 798abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->elements--; 799abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 800abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return((void *) value); 801abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 802abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 803abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 804abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 805abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 806abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 807abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 808abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% R e m o v e E l e m e n t F r o m L i n k e d L i s t % 809abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 810abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 811abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 812abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 813abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 814abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% RemoveElementFromLinkedList() removes an element from the linked-list at the 815abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% specified location. 816abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 817abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the RemoveElementFromLinkedList method is: 818abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 819abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% void *RemoveElementFromLinkedList(LinkedListInfo *list_info, 820abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% const size_t index) 821abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 822abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 823abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 824abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the linked-list info. 825abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 826abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o index: the index. 827abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 828abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 829abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport void *RemoveElementFromLinkedList(LinkedListInfo *list_info, 830abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk const size_t index) 831abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 832abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk ElementInfo 833abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *next; 834abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 835abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk register ssize_t 836abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk i; 837abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 838abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk void 839abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *value; 840abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 841abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 842abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 843abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (index >= list_info->elements) 844abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return((void *) NULL); 845abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LockSemaphoreInfo(list_info->semaphore); 846abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (index == 0) 847abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 848abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->next == list_info->head) 849abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=list_info->head->next; 850abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk value=list_info->head->value; 851abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=list_info->head; 852abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->head=list_info->head->next; 853abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=(ElementInfo *) RelinquishMagickMemory(next); 854abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 855abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk else 856abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 857abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk ElementInfo 858abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *element; 859abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 860abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=list_info->head; 861abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk for (i=1; i < (ssize_t) index; i++) 862abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=next->next; 863abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element=next->next; 864abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->next=element->next; 865abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (element == list_info->tail) 866abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->tail=next; 867abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->next == element) 868abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=element->next; 869abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk value=element->value; 870abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk element=(ElementInfo *) RelinquishMagickMemory(element); 871abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 872abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->elements--; 873abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 874abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(value); 875abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 876abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 877abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 878abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 879abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 880abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 881abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 882abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% R e m o v e L a s t E l e m e n t F r o m L i n k e d L i s t % 883abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 884abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 885abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 886abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 887abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 888abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% RemoveLastElementFromLinkedList() removes the last element from the 889abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% linked-list. 890abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 891abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the RemoveLastElementFromLinkedList method is: 892abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 893abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% void *RemoveLastElementFromLinkedList(LinkedListInfo *list_info) 894abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 895abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 896abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 897abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the linked-list info. 898abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 899abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 900abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport void *RemoveLastElementFromLinkedList(LinkedListInfo *list_info) 901abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 902abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk void 903abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *value; 904abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 905abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 906abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 907abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->elements == 0) 908abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return((void *) NULL); 909abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LockSemaphoreInfo(list_info->semaphore); 910abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->next == list_info->tail) 911abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=(ElementInfo *) NULL; 912abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk if (list_info->elements == 1UL) 913abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 914abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk value=list_info->head->value; 915abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->head=(ElementInfo *) NULL; 916abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->tail=(ElementInfo *) RelinquishMagickMemory(list_info->tail); 917abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 918abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk else 919abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk { 920abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk ElementInfo 921abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk *next; 922abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 923abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk value=list_info->tail->value; 924abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=list_info->head; 925abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk while (next->next != list_info->tail) 926abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next=next->next; 927abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->tail=(ElementInfo *) RelinquishMagickMemory(list_info->tail); 928abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->tail=next; 929abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk next->next=(ElementInfo *) NULL; 930abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk } 931abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->elements--; 932abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 933abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk return(value); 934abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 935abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk 936abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk/* 937abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 938abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 939abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 940abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 941abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% R e s e t L i n k e d L i s t I t e r a t o r % 942abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 943abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 944abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% % 945abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 946abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 947abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% ResetLinkedListIterator() resets the lined-list iterator. Use it in 948abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% conjunction with GetNextValueInLinkedList() to iterate over all the values 949abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% in the linked-list. 950abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 951abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% The format of the ResetLinkedListIterator method is: 952abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 953abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% ResetLinkedListIterator(LinkedListInfo *list_info) 954abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 955abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% A description of each parameter follows: 956abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 957abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% o list_info: the linked-list info. 958abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk% 959abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk*/ 960abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirkMagickExport void ResetLinkedListIterator(LinkedListInfo *list_info) 961abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk{ 962abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info != (LinkedListInfo *) NULL); 963abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk assert(list_info->signature == MagickCoreSignature); 964abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk LockSemaphoreInfo(list_info->semaphore); 965abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk list_info->next=list_info->head; 966abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk UnlockSemaphoreInfo(list_info->semaphore); 967abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk} 968