1 /****************************************************************/
2 /* Chained list unit */
3 /* (c) Christophe CALMEJANE (Ze KiLleR) - 1999-06 */
4 /****************************************************************/
5
6 /*
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public
18 License along with this library; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22
23 #include <stdio.h>
24 #include <stdlib.h>
25
26 #include "skyutils.h"
27
28 #ifndef SU_TRACE_INTERNAL
29 #undef malloc
30 #undef calloc
31 #undef realloc
32 #undef strdup
33 #undef free
34 #endif /* !SU_TRACE_INTERNAL */
35
SU_AddElementTail(SU_PList List,void * Elem)36 SU_PList SU_AddElementTail(SU_PList List,void *Elem)
37 {
38 SU_PList Ptr,Ptr2,El;
39
40 Ptr = List;
41 Ptr2 = NULL;
42 while(Ptr != NULL)
43 {
44 Ptr2 = Ptr;
45 Ptr = Ptr->Next;
46 }
47 El = (SU_PList) malloc(sizeof(SU_TList));
48 El->Next = NULL;
49 El->Data = Elem;
50 if(List == NULL)
51 return El;
52 Ptr2->Next = El;
53 return List;
54 }
55
SU_AddElementHead(SU_PList List,void * Elem)56 SU_PList SU_AddElementHead(SU_PList List,void *Elem)
57 {
58 SU_PList El;
59
60 El = (SU_PList) malloc(sizeof(SU_TList));
61 El->Next = List;
62 El->Data = Elem;
63 return El;
64 }
65
SU_AddElementPos(SU_PList List,int Pos,void * Elem)66 SU_PList SU_AddElementPos(SU_PList List,int Pos,void *Elem)
67 {
68 SU_PList Ptr;
69 int p;
70
71 if((Pos <= 0) || (List == NULL))
72 return SU_AddElementHead(List,Elem);
73 Ptr = List;
74 for(p=0;p<(Pos-1);p++)
75 {
76 if(Ptr->Next == NULL)
77 {
78 Ptr->Next = SU_AddElementHead(NULL,Elem);
79 return List;
80 }
81 Ptr = Ptr->Next;
82 }
83 Ptr->Next = SU_AddElementHead(Ptr->Next,Elem);
84 return List;
85 }
86
SU_DelElementElem(SU_PList List,void * Elem)87 SU_PList SU_DelElementElem(SU_PList List,void *Elem)
88 {
89 SU_PList Ptr,Ptr2,St;
90
91 if(List == NULL)
92 return NULL;
93 Ptr = List;
94 St = List;
95 Ptr2 = NULL;
96 while(Ptr != NULL)
97 {
98 if(Ptr->Data == Elem)
99 {
100 Ptr = SU_DelElementHead(Ptr);
101 if(Ptr2 == NULL)
102 St = Ptr;
103 else
104 Ptr2->Next = Ptr;
105 if(Ptr == NULL)
106 return St;
107 }
108 Ptr2 = Ptr;
109 Ptr = Ptr->Next;
110 }
111 return St;
112 }
113
SU_DelElementTail(SU_PList List)114 SU_PList SU_DelElementTail(SU_PList List)
115 {
116 SU_PList Ptr,Ptr2;
117
118 if(List == NULL)
119 return NULL;
120 Ptr = List;
121 Ptr2 = NULL;
122 while(Ptr->Next != NULL)
123 {
124 Ptr2 = Ptr;
125 Ptr = Ptr->Next;
126 }
127 free(Ptr);
128 if(Ptr2 == NULL)
129 return NULL;
130 Ptr2->Next = NULL;
131 return List;
132 }
133
SU_DelElementHead(SU_PList List)134 SU_PList SU_DelElementHead(SU_PList List)
135 {
136 SU_PList Ptr;
137
138 if(List == NULL)
139 return NULL;
140 Ptr = List->Next;
141 free(List);
142 return Ptr;
143 }
144
SU_DelElementPos(SU_PList List,int Pos)145 SU_PList SU_DelElementPos(SU_PList List,int Pos)
146 {
147 int p;
148 SU_PList Ptr;
149
150 if(List == NULL)
151 return NULL;
152 if(Pos <= 0)
153 return SU_DelElementHead(List);
154 Ptr = List;
155 for(p=0;p<(Pos-1);p++)
156 {
157 Ptr = Ptr->Next;
158 if(Ptr == NULL)
159 return List;
160 }
161 if(Ptr->Next == NULL)
162 return List;
163 Ptr->Next = SU_DelElementHead(Ptr->Next);
164 return List;
165 }
166
SU_GetElementTail(SU_PList List)167 void *SU_GetElementTail(SU_PList List)
168 {
169 SU_PList Ptr;
170
171 if(List == NULL)
172 return NULL;
173 Ptr = List;
174 while(Ptr->Next != NULL)
175 Ptr = Ptr->Next;
176 return Ptr->Data;
177 }
178
SU_GetElementHead(SU_PList List)179 void *SU_GetElementHead(SU_PList List)
180 {
181 if(List == NULL)
182 return NULL;
183 return List->Data;
184 }
185
SU_GetElementPos(SU_PList List,int Pos)186 void *SU_GetElementPos(SU_PList List,int Pos)
187 {
188 int p;
189 SU_PList Ptr;
190
191 if(List == NULL)
192 return NULL;
193 if(Pos <= 0)
194 return SU_GetElementHead(List);
195 Ptr = List;
196 for(p=0;p<Pos;p++)
197 {
198 Ptr = Ptr->Next;
199 if(Ptr == NULL)
200 return NULL;
201 }
202 return Ptr->Data;
203 }
204
SU_FreeList(SU_PList List)205 void SU_FreeList(SU_PList List)
206 {
207 SU_PList Ptr,Ptr2;
208
209 Ptr = List;
210 while(Ptr != NULL)
211 {
212 Ptr2 = Ptr->Next;
213 free(Ptr);
214 Ptr = Ptr2;
215 }
216 }
217
SU_FreeListElem(SU_PList List)218 void SU_FreeListElem(SU_PList List)
219 {
220 SU_PList Ptr,Ptr2;
221
222 Ptr = List;
223 while(Ptr != NULL)
224 {
225 Ptr2 = Ptr->Next;
226 free(Ptr->Data);
227 free(Ptr);
228 Ptr = Ptr2;
229 }
230 }
231
SU_ListCount(SU_PList List)232 unsigned int SU_ListCount(SU_PList List)
233 {
234 SU_PList Ptr;
235 unsigned int c;
236
237 c = 0;
238 Ptr = List;
239 while(Ptr != NULL)
240 {
241 c++;
242 Ptr = Ptr->Next;
243 }
244 return c;
245 }
246
247