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