xref: /inferno-os/libfreetype/ftlist.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1 /***************************************************************************/
2 /*                                                                         */
3 /*  ftlist.c                                                               */
4 /*                                                                         */
5 /*    Generic list support for FreeType (body).                            */
6 /*                                                                         */
7 /*  Copyright 1996-2001, 2002 by                                           */
8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9 /*                                                                         */
10 /*  This file is part of the FreeType project, and may only be used,       */
11 /*  modified, and distributed under the terms of the FreeType project      */
12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13 /*  this file you indicate that you have read the license and              */
14 /*  understand and accept it fully.                                        */
15 /*                                                                         */
16 /***************************************************************************/
17 
18   /*************************************************************************/
19   /*                                                                       */
20   /*  This file implements functions relative to list processing.  Its     */
21   /*  data structures are defined in `freetype/internal/ftlist.h'.         */
22   /*                                                                       */
23   /*************************************************************************/
24 
25 
26 #include <ft2build.h>
27 #include FT_LIST_H
28 #include FT_INTERNAL_DEBUG_H
29 #include FT_INTERNAL_OBJECTS_H
30 
31 
32   /*************************************************************************/
33   /*                                                                       */
34   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
35   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
36   /* messages during execution.                                            */
37   /*                                                                       */
38 #undef  FT_COMPONENT
39 #define FT_COMPONENT  trace_list
40 
41 
42   /* documentation is in ftlist.h */
43 
44   FT_EXPORT_DEF( FT_ListNode )
FT_List_Find(FT_List list,void * data)45   FT_List_Find( FT_List  list,
46                 void*    data )
47   {
48     FT_ListNode  cur;
49 
50 
51     cur = list->head;
52     while ( cur )
53     {
54       if ( cur->data == data )
55         return cur;
56 
57       cur = cur->next;
58     }
59 
60     return (FT_ListNode)0;
61   }
62 
63 
64   /* documentation is in ftlist.h */
65 
66   FT_EXPORT_DEF( void )
FT_List_Add(FT_List list,FT_ListNode node)67   FT_List_Add( FT_List      list,
68                FT_ListNode  node )
69   {
70     FT_ListNode  before = list->tail;
71 
72 
73     node->next = 0;
74     node->prev = before;
75 
76     if ( before )
77       before->next = node;
78     else
79       list->head = node;
80 
81     list->tail = node;
82   }
83 
84 
85   /* documentation is in ftlist.h */
86 
87   FT_EXPORT_DEF( void )
FT_List_Insert(FT_List list,FT_ListNode node)88   FT_List_Insert( FT_List      list,
89                   FT_ListNode  node )
90   {
91     FT_ListNode  after = list->head;
92 
93 
94     node->next = after;
95     node->prev = 0;
96 
97     if ( !after )
98       list->tail = node;
99     else
100       after->prev = node;
101 
102     list->head = node;
103   }
104 
105 
106   /* documentation is in ftlist.h */
107 
108   FT_EXPORT_DEF( void )
FT_List_Remove(FT_List list,FT_ListNode node)109   FT_List_Remove( FT_List      list,
110                   FT_ListNode  node )
111   {
112     FT_ListNode  before, after;
113 
114 
115     before = node->prev;
116     after  = node->next;
117 
118     if ( before )
119       before->next = after;
120     else
121       list->head = after;
122 
123     if ( after )
124       after->prev = before;
125     else
126       list->tail = before;
127   }
128 
129 
130   /* documentation is in ftlist.h */
131 
132   FT_EXPORT_DEF( void )
FT_List_Up(FT_List list,FT_ListNode node)133   FT_List_Up( FT_List      list,
134               FT_ListNode  node )
135   {
136     FT_ListNode  before, after;
137 
138 
139     before = node->prev;
140     after  = node->next;
141 
142     /* check whether we are already on top of the list */
143     if ( !before )
144       return;
145 
146     before->next = after;
147 
148     if ( after )
149       after->prev = before;
150     else
151       list->tail = before;
152 
153     node->prev       = 0;
154     node->next       = list->head;
155     list->head->prev = node;
156     list->head       = node;
157   }
158 
159 
160   /* documentation is in ftlist.h */
161 
162   FT_EXPORT_DEF( FT_Error )
FT_List_Iterate(FT_List list,FT_List_Iterator iterator,void * user)163   FT_List_Iterate( FT_List            list,
164                    FT_List_Iterator   iterator,
165                    void*              user )
166   {
167     FT_ListNode  cur   = list->head;
168     FT_Error     error = FT_Err_Ok;
169 
170 
171     while ( cur )
172     {
173       FT_ListNode  next = cur->next;
174 
175 
176       error = iterator( cur, user );
177       if ( error )
178         break;
179 
180       cur = next;
181     }
182 
183     return error;
184   }
185 
186 
187   /* documentation is in ftlist.h */
188 
189   FT_EXPORT_DEF( void )
FT_List_Finalize(FT_List list,FT_List_Destructor destroy,FT_Memory memory,void * user)190   FT_List_Finalize( FT_List             list,
191                     FT_List_Destructor  destroy,
192                     FT_Memory           memory,
193                     void*               user )
194   {
195     FT_ListNode  cur;
196 
197 
198     cur = list->head;
199     while ( cur )
200     {
201       FT_ListNode  next = cur->next;
202       void*        data = cur->data;
203 
204 
205       if ( destroy )
206         destroy( memory, data, user );
207 
208       FT_FREE( cur );
209       cur = next;
210     }
211 
212     list->head = 0;
213     list->tail = 0;
214   }
215 
216 
217 /* END */
218