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