blob: 6dbfb09f9af2e18f9cdc124600cf0a02830d674f [file] [log] [blame]
David Turnerd2b1f351999-12-16 23:11:37 +00001/***************************************************************************/
2/* */
3/* ftlist.c */
4/* */
5/* Generic list support for FreeType (body). */
6/* */
Werner Lemberg415235d2001-06-28 17:49:10 +00007/* Copyright 1996-2001 by */
David Turnerd2b1f351999-12-16 23:11:37 +00008/* David Turner, Robert Wilhelm, and Werner Lemberg. */
9/* */
Werner Lemberg4e6dd852000-06-05 05:26:15 +000010/* This file is part of the FreeType project, and may only be used, */
11/* modified, and distributed under the terms of the FreeType project */
David Turnerd2b1f351999-12-16 23:11:37 +000012/* 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
David Turnerd2b1f351999-12-16 23:11:37 +000018 /*************************************************************************/
19 /* */
20 /* This file implements functions relative to list processing. Its */
Werner Lemberga3b6c6c2000-05-31 06:55:12 +000021 /* data structures are defined in `freetype/internal/ftlist.h'. */
David Turnerd2b1f351999-12-16 23:11:37 +000022 /* */
23 /*************************************************************************/
24
25
Werner Lembergcc069be2000-12-08 16:17:16 +000026#include <ft2build.h>
27#include FT_LIST_H
28#include FT_INTERNAL_DEBUG_H
29#include FT_INTERNAL_OBJECTS_H
David Turnerd2b1f351999-12-16 23:11:37 +000030
31
32 /*************************************************************************/
33 /* */
Werner Lembergeb81e372000-06-03 06:03:11 +000034 /* 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
Werner Lemberg8ec9dfd2000-11-07 23:56:02 +000042 /* documentation is in ftlist.h */
43
Werner Lembergf814d0f2001-06-27 16:18:10 +000044 FT_EXPORT_DEF( FT_ListNode )
45 FT_List_Find( FT_List list,
46 void* data )
David Turnerd2b1f351999-12-16 23:11:37 +000047 {
48 FT_ListNode cur;
49
50
51 cur = list->head;
52 while ( cur )
53 {
Werner Lemberg7880dd62000-01-10 17:19:45 +000054 if ( cur->data == data )
David Turnerd2b1f351999-12-16 23:11:37 +000055 return cur;
56
57 cur = cur->next;
58 }
59
60 return (FT_ListNode)0;
61 }
62
63
Werner Lemberg8ec9dfd2000-11-07 23:56:02 +000064 /* documentation is in ftlist.h */
65
Werner Lembergf814d0f2001-06-27 16:18:10 +000066 FT_EXPORT_DEF( void )
67 FT_List_Add( FT_List list,
68 FT_ListNode node )
David Turnerd2b1f351999-12-16 23:11:37 +000069 {
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
Werner Lemberg8ec9dfd2000-11-07 23:56:02 +000085 /* documentation is in ftlist.h */
86
Werner Lembergf814d0f2001-06-27 16:18:10 +000087 FT_EXPORT_DEF( void )
88 FT_List_Insert( FT_List list,
89 FT_ListNode node )
David Turnerd2b1f351999-12-16 23:11:37 +000090 {
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
Werner Lemberg8ec9dfd2000-11-07 23:56:02 +0000106 /* documentation is in ftlist.h */
107
Werner Lembergf814d0f2001-06-27 16:18:10 +0000108 FT_EXPORT_DEF( void )
109 FT_List_Remove( FT_List list,
110 FT_ListNode node )
David Turnerd2b1f351999-12-16 23:11:37 +0000111 {
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
Werner Lemberg8ec9dfd2000-11-07 23:56:02 +0000130 /* documentation is in ftlist.h */
131
Werner Lembergf814d0f2001-06-27 16:18:10 +0000132 FT_EXPORT_DEF( void )
133 FT_List_Up( FT_List list,
134 FT_ListNode node )
David Turnerd2b1f351999-12-16 23:11:37 +0000135 {
136 FT_ListNode before, after;
137
138
139 before = node->prev;
140 after = node->next;
141
Werner Lemberga3b6c6c2000-05-31 06:55:12 +0000142 /* check whether we are already on top of the list */
David Turnerd2b1f351999-12-16 23:11:37 +0000143 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
Werner Lemberg8ec9dfd2000-11-07 23:56:02 +0000160 /* documentation is in ftlist.h */
161
Werner Lembergf814d0f2001-06-27 16:18:10 +0000162 FT_EXPORT_DEF( FT_Error )
163 FT_List_Iterate( FT_List list,
164 FT_List_Iterator iterator,
165 void* user )
David Turnerd2b1f351999-12-16 23:11:37 +0000166 {
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
Werner Lemberg8ec9dfd2000-11-07 23:56:02 +0000187 /* documentation is in ftlist.h */
188
Werner Lembergf814d0f2001-06-27 16:18:10 +0000189 FT_EXPORT_DEF( void )
190 FT_List_Finalize( FT_List list,
191 FT_List_Destructor destroy,
192 FT_Memory memory,
193 void* user )
David Turnerd2b1f351999-12-16 23:11:37 +0000194 {
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
David Turnere459d742002-03-22 13:52:37 +0000208 FT_FREE( cur );
David Turnerd2b1f351999-12-16 23:11:37 +0000209 cur = next;
210 }
211
212 list->head = 0;
213 list->tail = 0;
214 }
215
216
217/* END */