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