xref: /aosp_15_r20/external/libxml2/list.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker  * list.c: lists handling implementation
3*7c568831SAndroid Build Coastguard Worker  *
4*7c568831SAndroid Build Coastguard Worker  * Copyright (C) 2000 Gary Pennington and Daniel Veillard.
5*7c568831SAndroid Build Coastguard Worker  *
6*7c568831SAndroid Build Coastguard Worker  * Permission to use, copy, modify, and distribute this software for any
7*7c568831SAndroid Build Coastguard Worker  * purpose with or without fee is hereby granted, provided that the above
8*7c568831SAndroid Build Coastguard Worker  * copyright notice and this permission notice appear in all copies.
9*7c568831SAndroid Build Coastguard Worker  *
10*7c568831SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
11*7c568831SAndroid Build Coastguard Worker  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
12*7c568831SAndroid Build Coastguard Worker  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
13*7c568831SAndroid Build Coastguard Worker  * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
14*7c568831SAndroid Build Coastguard Worker  *
15*7c568831SAndroid Build Coastguard Worker  * Author: [email protected]
16*7c568831SAndroid Build Coastguard Worker  */
17*7c568831SAndroid Build Coastguard Worker 
18*7c568831SAndroid Build Coastguard Worker #define IN_LIBXML
19*7c568831SAndroid Build Coastguard Worker #include "libxml.h"
20*7c568831SAndroid Build Coastguard Worker 
21*7c568831SAndroid Build Coastguard Worker #include <stdlib.h>
22*7c568831SAndroid Build Coastguard Worker #include <string.h>
23*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlmemory.h>
24*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlerror.h>
25*7c568831SAndroid Build Coastguard Worker #include <libxml/list.h>
26*7c568831SAndroid Build Coastguard Worker 
27*7c568831SAndroid Build Coastguard Worker /*
28*7c568831SAndroid Build Coastguard Worker  * Type definition are kept internal
29*7c568831SAndroid Build Coastguard Worker  */
30*7c568831SAndroid Build Coastguard Worker 
31*7c568831SAndroid Build Coastguard Worker struct _xmlLink
32*7c568831SAndroid Build Coastguard Worker {
33*7c568831SAndroid Build Coastguard Worker     struct _xmlLink *next;
34*7c568831SAndroid Build Coastguard Worker     struct _xmlLink *prev;
35*7c568831SAndroid Build Coastguard Worker     void *data;
36*7c568831SAndroid Build Coastguard Worker };
37*7c568831SAndroid Build Coastguard Worker 
38*7c568831SAndroid Build Coastguard Worker struct _xmlList
39*7c568831SAndroid Build Coastguard Worker {
40*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr sentinel;
41*7c568831SAndroid Build Coastguard Worker     void (*linkDeallocator)(xmlLinkPtr );
42*7c568831SAndroid Build Coastguard Worker     int (*linkCompare)(const void *, const void*);
43*7c568831SAndroid Build Coastguard Worker };
44*7c568831SAndroid Build Coastguard Worker 
45*7c568831SAndroid Build Coastguard Worker /************************************************************************
46*7c568831SAndroid Build Coastguard Worker  *                                    *
47*7c568831SAndroid Build Coastguard Worker  *                Interfaces                *
48*7c568831SAndroid Build Coastguard Worker  *                                    *
49*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
50*7c568831SAndroid Build Coastguard Worker 
51*7c568831SAndroid Build Coastguard Worker /**
52*7c568831SAndroid Build Coastguard Worker  * xmlLinkDeallocator:
53*7c568831SAndroid Build Coastguard Worker  * @l:  a list
54*7c568831SAndroid Build Coastguard Worker  * @lk:  a link
55*7c568831SAndroid Build Coastguard Worker  *
56*7c568831SAndroid Build Coastguard Worker  * Unlink and deallocate @lk from list @l
57*7c568831SAndroid Build Coastguard Worker  */
58*7c568831SAndroid Build Coastguard Worker static void
xmlLinkDeallocator(xmlListPtr l,xmlLinkPtr lk)59*7c568831SAndroid Build Coastguard Worker xmlLinkDeallocator(xmlListPtr l, xmlLinkPtr lk)
60*7c568831SAndroid Build Coastguard Worker {
61*7c568831SAndroid Build Coastguard Worker     (lk->prev)->next = lk->next;
62*7c568831SAndroid Build Coastguard Worker     (lk->next)->prev = lk->prev;
63*7c568831SAndroid Build Coastguard Worker     if(l->linkDeallocator)
64*7c568831SAndroid Build Coastguard Worker         l->linkDeallocator(lk);
65*7c568831SAndroid Build Coastguard Worker     xmlFree(lk);
66*7c568831SAndroid Build Coastguard Worker }
67*7c568831SAndroid Build Coastguard Worker 
68*7c568831SAndroid Build Coastguard Worker /**
69*7c568831SAndroid Build Coastguard Worker  * xmlLinkCompare:
70*7c568831SAndroid Build Coastguard Worker  * @data0:  first data
71*7c568831SAndroid Build Coastguard Worker  * @data1:  second data
72*7c568831SAndroid Build Coastguard Worker  *
73*7c568831SAndroid Build Coastguard Worker  * Compares two arbitrary data
74*7c568831SAndroid Build Coastguard Worker  *
75*7c568831SAndroid Build Coastguard Worker  * Returns -1, 0 or 1 depending on whether data1 is greater equal or smaller
76*7c568831SAndroid Build Coastguard Worker  *          than data0
77*7c568831SAndroid Build Coastguard Worker  */
78*7c568831SAndroid Build Coastguard Worker static int
xmlLinkCompare(const void * data0,const void * data1)79*7c568831SAndroid Build Coastguard Worker xmlLinkCompare(const void *data0, const void *data1)
80*7c568831SAndroid Build Coastguard Worker {
81*7c568831SAndroid Build Coastguard Worker     if (data0 < data1)
82*7c568831SAndroid Build Coastguard Worker         return (-1);
83*7c568831SAndroid Build Coastguard Worker     else if (data0 == data1)
84*7c568831SAndroid Build Coastguard Worker 	return (0);
85*7c568831SAndroid Build Coastguard Worker     return (1);
86*7c568831SAndroid Build Coastguard Worker }
87*7c568831SAndroid Build Coastguard Worker 
88*7c568831SAndroid Build Coastguard Worker /**
89*7c568831SAndroid Build Coastguard Worker  * xmlListLowerSearch:
90*7c568831SAndroid Build Coastguard Worker  * @l:  a list
91*7c568831SAndroid Build Coastguard Worker  * @data:  a data
92*7c568831SAndroid Build Coastguard Worker  *
93*7c568831SAndroid Build Coastguard Worker  * Search data in the ordered list walking from the beginning
94*7c568831SAndroid Build Coastguard Worker  *
95*7c568831SAndroid Build Coastguard Worker  * Returns the link containing the data or NULL
96*7c568831SAndroid Build Coastguard Worker  */
97*7c568831SAndroid Build Coastguard Worker static xmlLinkPtr
xmlListLowerSearch(xmlListPtr l,void * data)98*7c568831SAndroid Build Coastguard Worker xmlListLowerSearch(xmlListPtr l, void *data)
99*7c568831SAndroid Build Coastguard Worker {
100*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lk;
101*7c568831SAndroid Build Coastguard Worker 
102*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
103*7c568831SAndroid Build Coastguard Worker         return(NULL);
104*7c568831SAndroid Build Coastguard Worker     for(lk = l->sentinel->next;lk != l->sentinel && l->linkCompare(lk->data, data) <0 ;lk = lk->next);
105*7c568831SAndroid Build Coastguard Worker     return lk;
106*7c568831SAndroid Build Coastguard Worker }
107*7c568831SAndroid Build Coastguard Worker 
108*7c568831SAndroid Build Coastguard Worker /**
109*7c568831SAndroid Build Coastguard Worker  * xmlListHigherSearch:
110*7c568831SAndroid Build Coastguard Worker  * @l:  a list
111*7c568831SAndroid Build Coastguard Worker  * @data:  a data
112*7c568831SAndroid Build Coastguard Worker  *
113*7c568831SAndroid Build Coastguard Worker  * Search data in the ordered list walking backward from the end
114*7c568831SAndroid Build Coastguard Worker  *
115*7c568831SAndroid Build Coastguard Worker  * Returns the link containing the data or NULL
116*7c568831SAndroid Build Coastguard Worker  */
117*7c568831SAndroid Build Coastguard Worker static xmlLinkPtr
xmlListHigherSearch(xmlListPtr l,void * data)118*7c568831SAndroid Build Coastguard Worker xmlListHigherSearch(xmlListPtr l, void *data)
119*7c568831SAndroid Build Coastguard Worker {
120*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lk;
121*7c568831SAndroid Build Coastguard Worker 
122*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
123*7c568831SAndroid Build Coastguard Worker         return(NULL);
124*7c568831SAndroid Build Coastguard Worker     for(lk = l->sentinel->prev;lk != l->sentinel && l->linkCompare(lk->data, data) >0 ;lk = lk->prev);
125*7c568831SAndroid Build Coastguard Worker     return lk;
126*7c568831SAndroid Build Coastguard Worker }
127*7c568831SAndroid Build Coastguard Worker 
128*7c568831SAndroid Build Coastguard Worker /**
129*7c568831SAndroid Build Coastguard Worker  * xmlListSearch:
130*7c568831SAndroid Build Coastguard Worker  * @l:  a list
131*7c568831SAndroid Build Coastguard Worker  * @data:  a data
132*7c568831SAndroid Build Coastguard Worker  *
133*7c568831SAndroid Build Coastguard Worker  * Search data in the list
134*7c568831SAndroid Build Coastguard Worker  *
135*7c568831SAndroid Build Coastguard Worker  * Returns the link containing the data or NULL
136*7c568831SAndroid Build Coastguard Worker  */
137*7c568831SAndroid Build Coastguard Worker static xmlLinkPtr
xmlListLinkSearch(xmlListPtr l,void * data)138*7c568831SAndroid Build Coastguard Worker xmlListLinkSearch(xmlListPtr l, void *data)
139*7c568831SAndroid Build Coastguard Worker {
140*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lk;
141*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
142*7c568831SAndroid Build Coastguard Worker         return(NULL);
143*7c568831SAndroid Build Coastguard Worker     lk = xmlListLowerSearch(l, data);
144*7c568831SAndroid Build Coastguard Worker     if (lk == l->sentinel)
145*7c568831SAndroid Build Coastguard Worker         return NULL;
146*7c568831SAndroid Build Coastguard Worker     else {
147*7c568831SAndroid Build Coastguard Worker         if (l->linkCompare(lk->data, data) ==0)
148*7c568831SAndroid Build Coastguard Worker             return lk;
149*7c568831SAndroid Build Coastguard Worker         return NULL;
150*7c568831SAndroid Build Coastguard Worker     }
151*7c568831SAndroid Build Coastguard Worker }
152*7c568831SAndroid Build Coastguard Worker 
153*7c568831SAndroid Build Coastguard Worker /**
154*7c568831SAndroid Build Coastguard Worker  * xmlListLinkReverseSearch:
155*7c568831SAndroid Build Coastguard Worker  * @l:  a list
156*7c568831SAndroid Build Coastguard Worker  * @data:  a data
157*7c568831SAndroid Build Coastguard Worker  *
158*7c568831SAndroid Build Coastguard Worker  * Search data in the list processing backward
159*7c568831SAndroid Build Coastguard Worker  *
160*7c568831SAndroid Build Coastguard Worker  * Returns the link containing the data or NULL
161*7c568831SAndroid Build Coastguard Worker  */
162*7c568831SAndroid Build Coastguard Worker static xmlLinkPtr
xmlListLinkReverseSearch(xmlListPtr l,void * data)163*7c568831SAndroid Build Coastguard Worker xmlListLinkReverseSearch(xmlListPtr l, void *data)
164*7c568831SAndroid Build Coastguard Worker {
165*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lk;
166*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
167*7c568831SAndroid Build Coastguard Worker         return(NULL);
168*7c568831SAndroid Build Coastguard Worker     lk = xmlListHigherSearch(l, data);
169*7c568831SAndroid Build Coastguard Worker     if (lk == l->sentinel)
170*7c568831SAndroid Build Coastguard Worker         return NULL;
171*7c568831SAndroid Build Coastguard Worker     else {
172*7c568831SAndroid Build Coastguard Worker         if (l->linkCompare(lk->data, data) ==0)
173*7c568831SAndroid Build Coastguard Worker             return lk;
174*7c568831SAndroid Build Coastguard Worker         return NULL;
175*7c568831SAndroid Build Coastguard Worker     }
176*7c568831SAndroid Build Coastguard Worker }
177*7c568831SAndroid Build Coastguard Worker 
178*7c568831SAndroid Build Coastguard Worker /**
179*7c568831SAndroid Build Coastguard Worker  * xmlListCreate:
180*7c568831SAndroid Build Coastguard Worker  * @deallocator:  an optional deallocator function
181*7c568831SAndroid Build Coastguard Worker  * @compare:  an optional comparison function
182*7c568831SAndroid Build Coastguard Worker  *
183*7c568831SAndroid Build Coastguard Worker  * Create a new list
184*7c568831SAndroid Build Coastguard Worker  *
185*7c568831SAndroid Build Coastguard Worker  * Returns the new list or NULL in case of error
186*7c568831SAndroid Build Coastguard Worker  */
187*7c568831SAndroid Build Coastguard Worker xmlListPtr
xmlListCreate(xmlListDeallocator deallocator,xmlListDataCompare compare)188*7c568831SAndroid Build Coastguard Worker xmlListCreate(xmlListDeallocator deallocator, xmlListDataCompare compare)
189*7c568831SAndroid Build Coastguard Worker {
190*7c568831SAndroid Build Coastguard Worker     xmlListPtr l;
191*7c568831SAndroid Build Coastguard Worker     l = (xmlListPtr)xmlMalloc(sizeof(xmlList));
192*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
193*7c568831SAndroid Build Coastguard Worker         return (NULL);
194*7c568831SAndroid Build Coastguard Worker     /* Initialize the list to NULL */
195*7c568831SAndroid Build Coastguard Worker     memset(l, 0, sizeof(xmlList));
196*7c568831SAndroid Build Coastguard Worker 
197*7c568831SAndroid Build Coastguard Worker     /* Add the sentinel */
198*7c568831SAndroid Build Coastguard Worker     l->sentinel = (xmlLinkPtr)xmlMalloc(sizeof(xmlLink));
199*7c568831SAndroid Build Coastguard Worker     if (l->sentinel == NULL) {
200*7c568831SAndroid Build Coastguard Worker 	xmlFree(l);
201*7c568831SAndroid Build Coastguard Worker         return (NULL);
202*7c568831SAndroid Build Coastguard Worker     }
203*7c568831SAndroid Build Coastguard Worker     l->sentinel->next = l->sentinel;
204*7c568831SAndroid Build Coastguard Worker     l->sentinel->prev = l->sentinel;
205*7c568831SAndroid Build Coastguard Worker     l->sentinel->data = NULL;
206*7c568831SAndroid Build Coastguard Worker 
207*7c568831SAndroid Build Coastguard Worker     /* If there is a link deallocator, use it */
208*7c568831SAndroid Build Coastguard Worker     if (deallocator != NULL)
209*7c568831SAndroid Build Coastguard Worker         l->linkDeallocator = deallocator;
210*7c568831SAndroid Build Coastguard Worker     /* If there is a link comparator, use it */
211*7c568831SAndroid Build Coastguard Worker     if (compare != NULL)
212*7c568831SAndroid Build Coastguard Worker         l->linkCompare = compare;
213*7c568831SAndroid Build Coastguard Worker     else /* Use our own */
214*7c568831SAndroid Build Coastguard Worker         l->linkCompare = xmlLinkCompare;
215*7c568831SAndroid Build Coastguard Worker     return l;
216*7c568831SAndroid Build Coastguard Worker }
217*7c568831SAndroid Build Coastguard Worker 
218*7c568831SAndroid Build Coastguard Worker /**
219*7c568831SAndroid Build Coastguard Worker  * xmlListSearch:
220*7c568831SAndroid Build Coastguard Worker  * @l:  a list
221*7c568831SAndroid Build Coastguard Worker  * @data:  a search value
222*7c568831SAndroid Build Coastguard Worker  *
223*7c568831SAndroid Build Coastguard Worker  * Search the list for an existing value of @data
224*7c568831SAndroid Build Coastguard Worker  *
225*7c568831SAndroid Build Coastguard Worker  * Returns the value associated to @data or NULL in case of error
226*7c568831SAndroid Build Coastguard Worker  */
227*7c568831SAndroid Build Coastguard Worker void *
xmlListSearch(xmlListPtr l,void * data)228*7c568831SAndroid Build Coastguard Worker xmlListSearch(xmlListPtr l, void *data)
229*7c568831SAndroid Build Coastguard Worker {
230*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lk;
231*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
232*7c568831SAndroid Build Coastguard Worker         return(NULL);
233*7c568831SAndroid Build Coastguard Worker     lk = xmlListLinkSearch(l, data);
234*7c568831SAndroid Build Coastguard Worker     if (lk)
235*7c568831SAndroid Build Coastguard Worker         return (lk->data);
236*7c568831SAndroid Build Coastguard Worker     return NULL;
237*7c568831SAndroid Build Coastguard Worker }
238*7c568831SAndroid Build Coastguard Worker 
239*7c568831SAndroid Build Coastguard Worker /**
240*7c568831SAndroid Build Coastguard Worker  * xmlListReverseSearch:
241*7c568831SAndroid Build Coastguard Worker  * @l:  a list
242*7c568831SAndroid Build Coastguard Worker  * @data:  a search value
243*7c568831SAndroid Build Coastguard Worker  *
244*7c568831SAndroid Build Coastguard Worker  * Search the list in reverse order for an existing value of @data
245*7c568831SAndroid Build Coastguard Worker  *
246*7c568831SAndroid Build Coastguard Worker  * Returns the value associated to @data or NULL in case of error
247*7c568831SAndroid Build Coastguard Worker  */
248*7c568831SAndroid Build Coastguard Worker void *
xmlListReverseSearch(xmlListPtr l,void * data)249*7c568831SAndroid Build Coastguard Worker xmlListReverseSearch(xmlListPtr l, void *data)
250*7c568831SAndroid Build Coastguard Worker {
251*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lk;
252*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
253*7c568831SAndroid Build Coastguard Worker         return(NULL);
254*7c568831SAndroid Build Coastguard Worker     lk = xmlListLinkReverseSearch(l, data);
255*7c568831SAndroid Build Coastguard Worker     if (lk)
256*7c568831SAndroid Build Coastguard Worker         return (lk->data);
257*7c568831SAndroid Build Coastguard Worker     return NULL;
258*7c568831SAndroid Build Coastguard Worker }
259*7c568831SAndroid Build Coastguard Worker 
260*7c568831SAndroid Build Coastguard Worker /**
261*7c568831SAndroid Build Coastguard Worker  * xmlListInsert:
262*7c568831SAndroid Build Coastguard Worker  * @l:  a list
263*7c568831SAndroid Build Coastguard Worker  * @data:  the data
264*7c568831SAndroid Build Coastguard Worker  *
265*7c568831SAndroid Build Coastguard Worker  * Insert data in the ordered list at the beginning for this value
266*7c568831SAndroid Build Coastguard Worker  *
267*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, 1 in case of failure
268*7c568831SAndroid Build Coastguard Worker  */
269*7c568831SAndroid Build Coastguard Worker int
xmlListInsert(xmlListPtr l,void * data)270*7c568831SAndroid Build Coastguard Worker xmlListInsert(xmlListPtr l, void *data)
271*7c568831SAndroid Build Coastguard Worker {
272*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lkPlace, lkNew;
273*7c568831SAndroid Build Coastguard Worker 
274*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
275*7c568831SAndroid Build Coastguard Worker         return(1);
276*7c568831SAndroid Build Coastguard Worker     lkPlace = xmlListLowerSearch(l, data);
277*7c568831SAndroid Build Coastguard Worker     /* Add the new link */
278*7c568831SAndroid Build Coastguard Worker     lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink));
279*7c568831SAndroid Build Coastguard Worker     if (lkNew == NULL)
280*7c568831SAndroid Build Coastguard Worker         return (1);
281*7c568831SAndroid Build Coastguard Worker     lkNew->data = data;
282*7c568831SAndroid Build Coastguard Worker     lkPlace = lkPlace->prev;
283*7c568831SAndroid Build Coastguard Worker     lkNew->next = lkPlace->next;
284*7c568831SAndroid Build Coastguard Worker     (lkPlace->next)->prev = lkNew;
285*7c568831SAndroid Build Coastguard Worker     lkPlace->next = lkNew;
286*7c568831SAndroid Build Coastguard Worker     lkNew->prev = lkPlace;
287*7c568831SAndroid Build Coastguard Worker     return 0;
288*7c568831SAndroid Build Coastguard Worker }
289*7c568831SAndroid Build Coastguard Worker 
290*7c568831SAndroid Build Coastguard Worker /**
291*7c568831SAndroid Build Coastguard Worker  * xmlListAppend:
292*7c568831SAndroid Build Coastguard Worker  * @l:  a list
293*7c568831SAndroid Build Coastguard Worker  * @data:  the data
294*7c568831SAndroid Build Coastguard Worker  *
295*7c568831SAndroid Build Coastguard Worker  * Insert data in the ordered list at the end for this value
296*7c568831SAndroid Build Coastguard Worker  *
297*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, 1 in case of failure
298*7c568831SAndroid Build Coastguard Worker  */
xmlListAppend(xmlListPtr l,void * data)299*7c568831SAndroid Build Coastguard Worker int xmlListAppend(xmlListPtr l, void *data)
300*7c568831SAndroid Build Coastguard Worker {
301*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lkPlace, lkNew;
302*7c568831SAndroid Build Coastguard Worker 
303*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
304*7c568831SAndroid Build Coastguard Worker         return(1);
305*7c568831SAndroid Build Coastguard Worker     lkPlace = xmlListHigherSearch(l, data);
306*7c568831SAndroid Build Coastguard Worker     /* Add the new link */
307*7c568831SAndroid Build Coastguard Worker     lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink));
308*7c568831SAndroid Build Coastguard Worker     if (lkNew == NULL)
309*7c568831SAndroid Build Coastguard Worker         return (1);
310*7c568831SAndroid Build Coastguard Worker     lkNew->data = data;
311*7c568831SAndroid Build Coastguard Worker     lkNew->next = lkPlace->next;
312*7c568831SAndroid Build Coastguard Worker     (lkPlace->next)->prev = lkNew;
313*7c568831SAndroid Build Coastguard Worker     lkPlace->next = lkNew;
314*7c568831SAndroid Build Coastguard Worker     lkNew->prev = lkPlace;
315*7c568831SAndroid Build Coastguard Worker     return 0;
316*7c568831SAndroid Build Coastguard Worker }
317*7c568831SAndroid Build Coastguard Worker 
318*7c568831SAndroid Build Coastguard Worker /**
319*7c568831SAndroid Build Coastguard Worker  * xmlListDelete:
320*7c568831SAndroid Build Coastguard Worker  * @l:  a list
321*7c568831SAndroid Build Coastguard Worker  *
322*7c568831SAndroid Build Coastguard Worker  * Deletes the list and its associated data
323*7c568831SAndroid Build Coastguard Worker  */
xmlListDelete(xmlListPtr l)324*7c568831SAndroid Build Coastguard Worker void xmlListDelete(xmlListPtr l)
325*7c568831SAndroid Build Coastguard Worker {
326*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
327*7c568831SAndroid Build Coastguard Worker         return;
328*7c568831SAndroid Build Coastguard Worker 
329*7c568831SAndroid Build Coastguard Worker     xmlListClear(l);
330*7c568831SAndroid Build Coastguard Worker     xmlFree(l->sentinel);
331*7c568831SAndroid Build Coastguard Worker     xmlFree(l);
332*7c568831SAndroid Build Coastguard Worker }
333*7c568831SAndroid Build Coastguard Worker 
334*7c568831SAndroid Build Coastguard Worker /**
335*7c568831SAndroid Build Coastguard Worker  * xmlListRemoveFirst:
336*7c568831SAndroid Build Coastguard Worker  * @l:  a list
337*7c568831SAndroid Build Coastguard Worker  * @data:  list data
338*7c568831SAndroid Build Coastguard Worker  *
339*7c568831SAndroid Build Coastguard Worker  * Remove the first instance associated to data in the list
340*7c568831SAndroid Build Coastguard Worker  *
341*7c568831SAndroid Build Coastguard Worker  * Returns 1 if a deallocation occurred, or 0 if not found
342*7c568831SAndroid Build Coastguard Worker  */
343*7c568831SAndroid Build Coastguard Worker int
xmlListRemoveFirst(xmlListPtr l,void * data)344*7c568831SAndroid Build Coastguard Worker xmlListRemoveFirst(xmlListPtr l, void *data)
345*7c568831SAndroid Build Coastguard Worker {
346*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lk;
347*7c568831SAndroid Build Coastguard Worker 
348*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
349*7c568831SAndroid Build Coastguard Worker         return(0);
350*7c568831SAndroid Build Coastguard Worker     /*Find the first instance of this data */
351*7c568831SAndroid Build Coastguard Worker     lk = xmlListLinkSearch(l, data);
352*7c568831SAndroid Build Coastguard Worker     if (lk != NULL) {
353*7c568831SAndroid Build Coastguard Worker         xmlLinkDeallocator(l, lk);
354*7c568831SAndroid Build Coastguard Worker         return 1;
355*7c568831SAndroid Build Coastguard Worker     }
356*7c568831SAndroid Build Coastguard Worker     return 0;
357*7c568831SAndroid Build Coastguard Worker }
358*7c568831SAndroid Build Coastguard Worker 
359*7c568831SAndroid Build Coastguard Worker /**
360*7c568831SAndroid Build Coastguard Worker  * xmlListRemoveLast:
361*7c568831SAndroid Build Coastguard Worker  * @l:  a list
362*7c568831SAndroid Build Coastguard Worker  * @data:  list data
363*7c568831SAndroid Build Coastguard Worker  *
364*7c568831SAndroid Build Coastguard Worker  * Remove the last instance associated to data in the list
365*7c568831SAndroid Build Coastguard Worker  *
366*7c568831SAndroid Build Coastguard Worker  * Returns 1 if a deallocation occurred, or 0 if not found
367*7c568831SAndroid Build Coastguard Worker  */
368*7c568831SAndroid Build Coastguard Worker int
xmlListRemoveLast(xmlListPtr l,void * data)369*7c568831SAndroid Build Coastguard Worker xmlListRemoveLast(xmlListPtr l, void *data)
370*7c568831SAndroid Build Coastguard Worker {
371*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lk;
372*7c568831SAndroid Build Coastguard Worker 
373*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
374*7c568831SAndroid Build Coastguard Worker         return(0);
375*7c568831SAndroid Build Coastguard Worker     /*Find the last instance of this data */
376*7c568831SAndroid Build Coastguard Worker     lk = xmlListLinkReverseSearch(l, data);
377*7c568831SAndroid Build Coastguard Worker     if (lk != NULL) {
378*7c568831SAndroid Build Coastguard Worker 	xmlLinkDeallocator(l, lk);
379*7c568831SAndroid Build Coastguard Worker         return 1;
380*7c568831SAndroid Build Coastguard Worker     }
381*7c568831SAndroid Build Coastguard Worker     return 0;
382*7c568831SAndroid Build Coastguard Worker }
383*7c568831SAndroid Build Coastguard Worker 
384*7c568831SAndroid Build Coastguard Worker /**
385*7c568831SAndroid Build Coastguard Worker  * xmlListRemoveAll:
386*7c568831SAndroid Build Coastguard Worker  * @l:  a list
387*7c568831SAndroid Build Coastguard Worker  * @data:  list data
388*7c568831SAndroid Build Coastguard Worker  *
389*7c568831SAndroid Build Coastguard Worker  * Remove the all instance associated to data in the list
390*7c568831SAndroid Build Coastguard Worker  *
391*7c568831SAndroid Build Coastguard Worker  * Returns the number of deallocation, or 0 if not found
392*7c568831SAndroid Build Coastguard Worker  */
393*7c568831SAndroid Build Coastguard Worker int
xmlListRemoveAll(xmlListPtr l,void * data)394*7c568831SAndroid Build Coastguard Worker xmlListRemoveAll(xmlListPtr l, void *data)
395*7c568831SAndroid Build Coastguard Worker {
396*7c568831SAndroid Build Coastguard Worker     int count=0;
397*7c568831SAndroid Build Coastguard Worker 
398*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
399*7c568831SAndroid Build Coastguard Worker         return(0);
400*7c568831SAndroid Build Coastguard Worker 
401*7c568831SAndroid Build Coastguard Worker     while(xmlListRemoveFirst(l, data))
402*7c568831SAndroid Build Coastguard Worker         count++;
403*7c568831SAndroid Build Coastguard Worker     return count;
404*7c568831SAndroid Build Coastguard Worker }
405*7c568831SAndroid Build Coastguard Worker 
406*7c568831SAndroid Build Coastguard Worker /**
407*7c568831SAndroid Build Coastguard Worker  * xmlListClear:
408*7c568831SAndroid Build Coastguard Worker  * @l:  a list
409*7c568831SAndroid Build Coastguard Worker  *
410*7c568831SAndroid Build Coastguard Worker  * Remove the all data in the list
411*7c568831SAndroid Build Coastguard Worker  */
412*7c568831SAndroid Build Coastguard Worker void
xmlListClear(xmlListPtr l)413*7c568831SAndroid Build Coastguard Worker xmlListClear(xmlListPtr l)
414*7c568831SAndroid Build Coastguard Worker {
415*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr  lk;
416*7c568831SAndroid Build Coastguard Worker 
417*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
418*7c568831SAndroid Build Coastguard Worker         return;
419*7c568831SAndroid Build Coastguard Worker     lk = l->sentinel->next;
420*7c568831SAndroid Build Coastguard Worker     while(lk != l->sentinel) {
421*7c568831SAndroid Build Coastguard Worker         xmlLinkPtr next = lk->next;
422*7c568831SAndroid Build Coastguard Worker 
423*7c568831SAndroid Build Coastguard Worker         xmlLinkDeallocator(l, lk);
424*7c568831SAndroid Build Coastguard Worker         lk = next;
425*7c568831SAndroid Build Coastguard Worker     }
426*7c568831SAndroid Build Coastguard Worker }
427*7c568831SAndroid Build Coastguard Worker 
428*7c568831SAndroid Build Coastguard Worker /**
429*7c568831SAndroid Build Coastguard Worker  * xmlListEmpty:
430*7c568831SAndroid Build Coastguard Worker  * @l:  a list
431*7c568831SAndroid Build Coastguard Worker  *
432*7c568831SAndroid Build Coastguard Worker  * Is the list empty ?
433*7c568831SAndroid Build Coastguard Worker  *
434*7c568831SAndroid Build Coastguard Worker  * Returns 1 if the list is empty, 0 if not empty and -1 in case of error
435*7c568831SAndroid Build Coastguard Worker  */
436*7c568831SAndroid Build Coastguard Worker int
xmlListEmpty(xmlListPtr l)437*7c568831SAndroid Build Coastguard Worker xmlListEmpty(xmlListPtr l)
438*7c568831SAndroid Build Coastguard Worker {
439*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
440*7c568831SAndroid Build Coastguard Worker         return(-1);
441*7c568831SAndroid Build Coastguard Worker     return (l->sentinel->next == l->sentinel);
442*7c568831SAndroid Build Coastguard Worker }
443*7c568831SAndroid Build Coastguard Worker 
444*7c568831SAndroid Build Coastguard Worker /**
445*7c568831SAndroid Build Coastguard Worker  * xmlListFront:
446*7c568831SAndroid Build Coastguard Worker  * @l:  a list
447*7c568831SAndroid Build Coastguard Worker  *
448*7c568831SAndroid Build Coastguard Worker  * Get the first element in the list
449*7c568831SAndroid Build Coastguard Worker  *
450*7c568831SAndroid Build Coastguard Worker  * Returns the first element in the list, or NULL
451*7c568831SAndroid Build Coastguard Worker  */
452*7c568831SAndroid Build Coastguard Worker xmlLinkPtr
xmlListFront(xmlListPtr l)453*7c568831SAndroid Build Coastguard Worker xmlListFront(xmlListPtr l)
454*7c568831SAndroid Build Coastguard Worker {
455*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
456*7c568831SAndroid Build Coastguard Worker         return(NULL);
457*7c568831SAndroid Build Coastguard Worker     return (l->sentinel->next);
458*7c568831SAndroid Build Coastguard Worker }
459*7c568831SAndroid Build Coastguard Worker 
460*7c568831SAndroid Build Coastguard Worker /**
461*7c568831SAndroid Build Coastguard Worker  * xmlListEnd:
462*7c568831SAndroid Build Coastguard Worker  * @l:  a list
463*7c568831SAndroid Build Coastguard Worker  *
464*7c568831SAndroid Build Coastguard Worker  * Get the last element in the list
465*7c568831SAndroid Build Coastguard Worker  *
466*7c568831SAndroid Build Coastguard Worker  * Returns the last element in the list, or NULL
467*7c568831SAndroid Build Coastguard Worker  */
468*7c568831SAndroid Build Coastguard Worker xmlLinkPtr
xmlListEnd(xmlListPtr l)469*7c568831SAndroid Build Coastguard Worker xmlListEnd(xmlListPtr l)
470*7c568831SAndroid Build Coastguard Worker {
471*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
472*7c568831SAndroid Build Coastguard Worker         return(NULL);
473*7c568831SAndroid Build Coastguard Worker     return (l->sentinel->prev);
474*7c568831SAndroid Build Coastguard Worker }
475*7c568831SAndroid Build Coastguard Worker 
476*7c568831SAndroid Build Coastguard Worker /**
477*7c568831SAndroid Build Coastguard Worker  * xmlListSize:
478*7c568831SAndroid Build Coastguard Worker  * @l:  a list
479*7c568831SAndroid Build Coastguard Worker  *
480*7c568831SAndroid Build Coastguard Worker  * Get the number of elements in the list
481*7c568831SAndroid Build Coastguard Worker  *
482*7c568831SAndroid Build Coastguard Worker  * Returns the number of elements in the list or -1 in case of error
483*7c568831SAndroid Build Coastguard Worker  */
484*7c568831SAndroid Build Coastguard Worker int
xmlListSize(xmlListPtr l)485*7c568831SAndroid Build Coastguard Worker xmlListSize(xmlListPtr l)
486*7c568831SAndroid Build Coastguard Worker {
487*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lk;
488*7c568831SAndroid Build Coastguard Worker     int count=0;
489*7c568831SAndroid Build Coastguard Worker 
490*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
491*7c568831SAndroid Build Coastguard Worker         return(-1);
492*7c568831SAndroid Build Coastguard Worker     /* TODO: keep a counter in xmlList instead */
493*7c568831SAndroid Build Coastguard Worker     for(lk = l->sentinel->next; lk != l->sentinel; lk = lk->next, count++);
494*7c568831SAndroid Build Coastguard Worker     return count;
495*7c568831SAndroid Build Coastguard Worker }
496*7c568831SAndroid Build Coastguard Worker 
497*7c568831SAndroid Build Coastguard Worker /**
498*7c568831SAndroid Build Coastguard Worker  * xmlListPopFront:
499*7c568831SAndroid Build Coastguard Worker  * @l:  a list
500*7c568831SAndroid Build Coastguard Worker  *
501*7c568831SAndroid Build Coastguard Worker  * Removes the first element in the list
502*7c568831SAndroid Build Coastguard Worker  */
503*7c568831SAndroid Build Coastguard Worker void
xmlListPopFront(xmlListPtr l)504*7c568831SAndroid Build Coastguard Worker xmlListPopFront(xmlListPtr l)
505*7c568831SAndroid Build Coastguard Worker {
506*7c568831SAndroid Build Coastguard Worker     if(!xmlListEmpty(l))
507*7c568831SAndroid Build Coastguard Worker         xmlLinkDeallocator(l, l->sentinel->next);
508*7c568831SAndroid Build Coastguard Worker }
509*7c568831SAndroid Build Coastguard Worker 
510*7c568831SAndroid Build Coastguard Worker /**
511*7c568831SAndroid Build Coastguard Worker  * xmlListPopBack:
512*7c568831SAndroid Build Coastguard Worker  * @l:  a list
513*7c568831SAndroid Build Coastguard Worker  *
514*7c568831SAndroid Build Coastguard Worker  * Removes the last element in the list
515*7c568831SAndroid Build Coastguard Worker  */
516*7c568831SAndroid Build Coastguard Worker void
xmlListPopBack(xmlListPtr l)517*7c568831SAndroid Build Coastguard Worker xmlListPopBack(xmlListPtr l)
518*7c568831SAndroid Build Coastguard Worker {
519*7c568831SAndroid Build Coastguard Worker     if(!xmlListEmpty(l))
520*7c568831SAndroid Build Coastguard Worker         xmlLinkDeallocator(l, l->sentinel->prev);
521*7c568831SAndroid Build Coastguard Worker }
522*7c568831SAndroid Build Coastguard Worker 
523*7c568831SAndroid Build Coastguard Worker /**
524*7c568831SAndroid Build Coastguard Worker  * xmlListPushFront:
525*7c568831SAndroid Build Coastguard Worker  * @l:  a list
526*7c568831SAndroid Build Coastguard Worker  * @data:  new data
527*7c568831SAndroid Build Coastguard Worker  *
528*7c568831SAndroid Build Coastguard Worker  * add the new data at the beginning of the list
529*7c568831SAndroid Build Coastguard Worker  *
530*7c568831SAndroid Build Coastguard Worker  * Returns 1 if successful, 0 otherwise
531*7c568831SAndroid Build Coastguard Worker  */
532*7c568831SAndroid Build Coastguard Worker int
xmlListPushFront(xmlListPtr l,void * data)533*7c568831SAndroid Build Coastguard Worker xmlListPushFront(xmlListPtr l, void *data)
534*7c568831SAndroid Build Coastguard Worker {
535*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lkPlace, lkNew;
536*7c568831SAndroid Build Coastguard Worker 
537*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
538*7c568831SAndroid Build Coastguard Worker         return(0);
539*7c568831SAndroid Build Coastguard Worker     lkPlace = l->sentinel;
540*7c568831SAndroid Build Coastguard Worker     /* Add the new link */
541*7c568831SAndroid Build Coastguard Worker     lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink));
542*7c568831SAndroid Build Coastguard Worker     if (lkNew == NULL)
543*7c568831SAndroid Build Coastguard Worker         return (0);
544*7c568831SAndroid Build Coastguard Worker     lkNew->data = data;
545*7c568831SAndroid Build Coastguard Worker     lkNew->next = lkPlace->next;
546*7c568831SAndroid Build Coastguard Worker     (lkPlace->next)->prev = lkNew;
547*7c568831SAndroid Build Coastguard Worker     lkPlace->next = lkNew;
548*7c568831SAndroid Build Coastguard Worker     lkNew->prev = lkPlace;
549*7c568831SAndroid Build Coastguard Worker     return 1;
550*7c568831SAndroid Build Coastguard Worker }
551*7c568831SAndroid Build Coastguard Worker 
552*7c568831SAndroid Build Coastguard Worker /**
553*7c568831SAndroid Build Coastguard Worker  * xmlListPushBack:
554*7c568831SAndroid Build Coastguard Worker  * @l:  a list
555*7c568831SAndroid Build Coastguard Worker  * @data:  new data
556*7c568831SAndroid Build Coastguard Worker  *
557*7c568831SAndroid Build Coastguard Worker  * add the new data at the end of the list
558*7c568831SAndroid Build Coastguard Worker  *
559*7c568831SAndroid Build Coastguard Worker  * Returns 1 if successful, 0 otherwise
560*7c568831SAndroid Build Coastguard Worker  */
561*7c568831SAndroid Build Coastguard Worker int
xmlListPushBack(xmlListPtr l,void * data)562*7c568831SAndroid Build Coastguard Worker xmlListPushBack(xmlListPtr l, void *data)
563*7c568831SAndroid Build Coastguard Worker {
564*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lkPlace, lkNew;
565*7c568831SAndroid Build Coastguard Worker 
566*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
567*7c568831SAndroid Build Coastguard Worker         return(0);
568*7c568831SAndroid Build Coastguard Worker     lkPlace = l->sentinel->prev;
569*7c568831SAndroid Build Coastguard Worker     /* Add the new link */
570*7c568831SAndroid Build Coastguard Worker     lkNew = (xmlLinkPtr)xmlMalloc(sizeof(xmlLink));
571*7c568831SAndroid Build Coastguard Worker     if (lkNew == NULL)
572*7c568831SAndroid Build Coastguard Worker         return (0);
573*7c568831SAndroid Build Coastguard Worker     lkNew->data = data;
574*7c568831SAndroid Build Coastguard Worker     lkNew->next = lkPlace->next;
575*7c568831SAndroid Build Coastguard Worker     (lkPlace->next)->prev = lkNew;
576*7c568831SAndroid Build Coastguard Worker     lkPlace->next = lkNew;
577*7c568831SAndroid Build Coastguard Worker     lkNew->prev = lkPlace;
578*7c568831SAndroid Build Coastguard Worker     return 1;
579*7c568831SAndroid Build Coastguard Worker }
580*7c568831SAndroid Build Coastguard Worker 
581*7c568831SAndroid Build Coastguard Worker /**
582*7c568831SAndroid Build Coastguard Worker  * xmlLinkGetData:
583*7c568831SAndroid Build Coastguard Worker  * @lk:  a link
584*7c568831SAndroid Build Coastguard Worker  *
585*7c568831SAndroid Build Coastguard Worker  * See Returns.
586*7c568831SAndroid Build Coastguard Worker  *
587*7c568831SAndroid Build Coastguard Worker  * Returns a pointer to the data referenced from this link
588*7c568831SAndroid Build Coastguard Worker  */
589*7c568831SAndroid Build Coastguard Worker void *
xmlLinkGetData(xmlLinkPtr lk)590*7c568831SAndroid Build Coastguard Worker xmlLinkGetData(xmlLinkPtr lk)
591*7c568831SAndroid Build Coastguard Worker {
592*7c568831SAndroid Build Coastguard Worker     if (lk == NULL)
593*7c568831SAndroid Build Coastguard Worker         return(NULL);
594*7c568831SAndroid Build Coastguard Worker     return lk->data;
595*7c568831SAndroid Build Coastguard Worker }
596*7c568831SAndroid Build Coastguard Worker 
597*7c568831SAndroid Build Coastguard Worker /**
598*7c568831SAndroid Build Coastguard Worker  * xmlListReverse:
599*7c568831SAndroid Build Coastguard Worker  * @l:  a list
600*7c568831SAndroid Build Coastguard Worker  *
601*7c568831SAndroid Build Coastguard Worker  * Reverse the order of the elements in the list
602*7c568831SAndroid Build Coastguard Worker  */
603*7c568831SAndroid Build Coastguard Worker void
xmlListReverse(xmlListPtr l)604*7c568831SAndroid Build Coastguard Worker xmlListReverse(xmlListPtr l)
605*7c568831SAndroid Build Coastguard Worker {
606*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lk;
607*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lkPrev;
608*7c568831SAndroid Build Coastguard Worker 
609*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
610*7c568831SAndroid Build Coastguard Worker         return;
611*7c568831SAndroid Build Coastguard Worker     lkPrev = l->sentinel;
612*7c568831SAndroid Build Coastguard Worker     for (lk = l->sentinel->next; lk != l->sentinel; lk = lk->next) {
613*7c568831SAndroid Build Coastguard Worker         lkPrev->next = lkPrev->prev;
614*7c568831SAndroid Build Coastguard Worker         lkPrev->prev = lk;
615*7c568831SAndroid Build Coastguard Worker         lkPrev = lk;
616*7c568831SAndroid Build Coastguard Worker     }
617*7c568831SAndroid Build Coastguard Worker     /* Fix up the last node */
618*7c568831SAndroid Build Coastguard Worker     lkPrev->next = lkPrev->prev;
619*7c568831SAndroid Build Coastguard Worker     lkPrev->prev = lk;
620*7c568831SAndroid Build Coastguard Worker }
621*7c568831SAndroid Build Coastguard Worker 
622*7c568831SAndroid Build Coastguard Worker /**
623*7c568831SAndroid Build Coastguard Worker  * xmlListSort:
624*7c568831SAndroid Build Coastguard Worker  * @l:  a list
625*7c568831SAndroid Build Coastguard Worker  *
626*7c568831SAndroid Build Coastguard Worker  * Sort all the elements in the list
627*7c568831SAndroid Build Coastguard Worker  */
628*7c568831SAndroid Build Coastguard Worker void
xmlListSort(xmlListPtr l)629*7c568831SAndroid Build Coastguard Worker xmlListSort(xmlListPtr l)
630*7c568831SAndroid Build Coastguard Worker {
631*7c568831SAndroid Build Coastguard Worker     xmlListPtr lTemp;
632*7c568831SAndroid Build Coastguard Worker 
633*7c568831SAndroid Build Coastguard Worker     if (l == NULL)
634*7c568831SAndroid Build Coastguard Worker         return;
635*7c568831SAndroid Build Coastguard Worker     if(xmlListEmpty(l))
636*7c568831SAndroid Build Coastguard Worker         return;
637*7c568831SAndroid Build Coastguard Worker 
638*7c568831SAndroid Build Coastguard Worker     /* I think that the real answer is to implement quicksort, the
639*7c568831SAndroid Build Coastguard Worker      * alternative is to implement some list copying procedure which
640*7c568831SAndroid Build Coastguard Worker      * would be based on a list copy followed by a clear followed by
641*7c568831SAndroid Build Coastguard Worker      * an insert. This is slow...
642*7c568831SAndroid Build Coastguard Worker      */
643*7c568831SAndroid Build Coastguard Worker 
644*7c568831SAndroid Build Coastguard Worker     lTemp = xmlListDup(l);
645*7c568831SAndroid Build Coastguard Worker     if (lTemp == NULL)
646*7c568831SAndroid Build Coastguard Worker         return;
647*7c568831SAndroid Build Coastguard Worker     xmlListClear(l);
648*7c568831SAndroid Build Coastguard Worker     xmlListMerge(l, lTemp);
649*7c568831SAndroid Build Coastguard Worker     xmlListDelete(lTemp);
650*7c568831SAndroid Build Coastguard Worker }
651*7c568831SAndroid Build Coastguard Worker 
652*7c568831SAndroid Build Coastguard Worker /**
653*7c568831SAndroid Build Coastguard Worker  * xmlListWalk:
654*7c568831SAndroid Build Coastguard Worker  * @l:  a list
655*7c568831SAndroid Build Coastguard Worker  * @walker:  a processing function
656*7c568831SAndroid Build Coastguard Worker  * @user:  a user parameter passed to the walker function
657*7c568831SAndroid Build Coastguard Worker  *
658*7c568831SAndroid Build Coastguard Worker  * Walk all the element of the first from first to last and
659*7c568831SAndroid Build Coastguard Worker  * apply the walker function to it
660*7c568831SAndroid Build Coastguard Worker  */
661*7c568831SAndroid Build Coastguard Worker void
xmlListWalk(xmlListPtr l,xmlListWalker walker,void * user)662*7c568831SAndroid Build Coastguard Worker xmlListWalk(xmlListPtr l, xmlListWalker walker, void *user) {
663*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lk;
664*7c568831SAndroid Build Coastguard Worker 
665*7c568831SAndroid Build Coastguard Worker     if ((l == NULL) || (walker == NULL))
666*7c568831SAndroid Build Coastguard Worker         return;
667*7c568831SAndroid Build Coastguard Worker     for(lk = l->sentinel->next; lk != l->sentinel; lk = lk->next) {
668*7c568831SAndroid Build Coastguard Worker         if((walker(lk->data, user)) == 0)
669*7c568831SAndroid Build Coastguard Worker                 break;
670*7c568831SAndroid Build Coastguard Worker     }
671*7c568831SAndroid Build Coastguard Worker }
672*7c568831SAndroid Build Coastguard Worker 
673*7c568831SAndroid Build Coastguard Worker /**
674*7c568831SAndroid Build Coastguard Worker  * xmlListReverseWalk:
675*7c568831SAndroid Build Coastguard Worker  * @l:  a list
676*7c568831SAndroid Build Coastguard Worker  * @walker:  a processing function
677*7c568831SAndroid Build Coastguard Worker  * @user:  a user parameter passed to the walker function
678*7c568831SAndroid Build Coastguard Worker  *
679*7c568831SAndroid Build Coastguard Worker  * Walk all the element of the list in reverse order and
680*7c568831SAndroid Build Coastguard Worker  * apply the walker function to it
681*7c568831SAndroid Build Coastguard Worker  */
682*7c568831SAndroid Build Coastguard Worker void
xmlListReverseWalk(xmlListPtr l,xmlListWalker walker,void * user)683*7c568831SAndroid Build Coastguard Worker xmlListReverseWalk(xmlListPtr l, xmlListWalker walker, void *user) {
684*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lk;
685*7c568831SAndroid Build Coastguard Worker 
686*7c568831SAndroid Build Coastguard Worker     if ((l == NULL) || (walker == NULL))
687*7c568831SAndroid Build Coastguard Worker         return;
688*7c568831SAndroid Build Coastguard Worker     for(lk = l->sentinel->prev; lk != l->sentinel; lk = lk->prev) {
689*7c568831SAndroid Build Coastguard Worker         if((walker(lk->data, user)) == 0)
690*7c568831SAndroid Build Coastguard Worker                 break;
691*7c568831SAndroid Build Coastguard Worker     }
692*7c568831SAndroid Build Coastguard Worker }
693*7c568831SAndroid Build Coastguard Worker 
694*7c568831SAndroid Build Coastguard Worker /**
695*7c568831SAndroid Build Coastguard Worker  * xmlListMerge:
696*7c568831SAndroid Build Coastguard Worker  * @l1:  the original list
697*7c568831SAndroid Build Coastguard Worker  * @l2:  the new list
698*7c568831SAndroid Build Coastguard Worker  *
699*7c568831SAndroid Build Coastguard Worker  * include all the elements of the second list in the first one and
700*7c568831SAndroid Build Coastguard Worker  * clear the second list
701*7c568831SAndroid Build Coastguard Worker  */
702*7c568831SAndroid Build Coastguard Worker void
xmlListMerge(xmlListPtr l1,xmlListPtr l2)703*7c568831SAndroid Build Coastguard Worker xmlListMerge(xmlListPtr l1, xmlListPtr l2)
704*7c568831SAndroid Build Coastguard Worker {
705*7c568831SAndroid Build Coastguard Worker     xmlListCopy(l1, l2);
706*7c568831SAndroid Build Coastguard Worker     xmlListClear(l2);
707*7c568831SAndroid Build Coastguard Worker }
708*7c568831SAndroid Build Coastguard Worker 
709*7c568831SAndroid Build Coastguard Worker /**
710*7c568831SAndroid Build Coastguard Worker  * xmlListDup:
711*7c568831SAndroid Build Coastguard Worker  * @old:  the list
712*7c568831SAndroid Build Coastguard Worker  *
713*7c568831SAndroid Build Coastguard Worker  * Duplicate the list
714*7c568831SAndroid Build Coastguard Worker  *
715*7c568831SAndroid Build Coastguard Worker  * Returns a new copy of the list or NULL in case of error
716*7c568831SAndroid Build Coastguard Worker  */
717*7c568831SAndroid Build Coastguard Worker xmlListPtr
xmlListDup(xmlListPtr old)718*7c568831SAndroid Build Coastguard Worker xmlListDup(xmlListPtr old)
719*7c568831SAndroid Build Coastguard Worker {
720*7c568831SAndroid Build Coastguard Worker     xmlListPtr cur;
721*7c568831SAndroid Build Coastguard Worker 
722*7c568831SAndroid Build Coastguard Worker     if (old == NULL)
723*7c568831SAndroid Build Coastguard Worker         return(NULL);
724*7c568831SAndroid Build Coastguard Worker     /* Hmmm, how to best deal with allocation issues when copying
725*7c568831SAndroid Build Coastguard Worker      * lists. If there is a de-allocator, should responsibility lie with
726*7c568831SAndroid Build Coastguard Worker      * the new list or the old list. Surely not both. I'll arbitrarily
727*7c568831SAndroid Build Coastguard Worker      * set it to be the old list for the time being whilst I work out
728*7c568831SAndroid Build Coastguard Worker      * the answer
729*7c568831SAndroid Build Coastguard Worker      */
730*7c568831SAndroid Build Coastguard Worker     cur = xmlListCreate(NULL, old->linkCompare);
731*7c568831SAndroid Build Coastguard Worker     if (cur == NULL)
732*7c568831SAndroid Build Coastguard Worker         return (NULL);
733*7c568831SAndroid Build Coastguard Worker     if (0 != xmlListCopy(cur, old))
734*7c568831SAndroid Build Coastguard Worker         return NULL;
735*7c568831SAndroid Build Coastguard Worker     return cur;
736*7c568831SAndroid Build Coastguard Worker }
737*7c568831SAndroid Build Coastguard Worker 
738*7c568831SAndroid Build Coastguard Worker /**
739*7c568831SAndroid Build Coastguard Worker  * xmlListCopy:
740*7c568831SAndroid Build Coastguard Worker  * @cur:  the new list
741*7c568831SAndroid Build Coastguard Worker  * @old:  the old list
742*7c568831SAndroid Build Coastguard Worker  *
743*7c568831SAndroid Build Coastguard Worker  * Move all the element from the old list in the new list
744*7c568831SAndroid Build Coastguard Worker  *
745*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success 1 in case of error
746*7c568831SAndroid Build Coastguard Worker  */
747*7c568831SAndroid Build Coastguard Worker int
xmlListCopy(xmlListPtr cur,xmlListPtr old)748*7c568831SAndroid Build Coastguard Worker xmlListCopy(xmlListPtr cur, xmlListPtr old)
749*7c568831SAndroid Build Coastguard Worker {
750*7c568831SAndroid Build Coastguard Worker     /* Walk the old tree and insert the data into the new one */
751*7c568831SAndroid Build Coastguard Worker     xmlLinkPtr lk;
752*7c568831SAndroid Build Coastguard Worker 
753*7c568831SAndroid Build Coastguard Worker     if ((old == NULL) || (cur == NULL))
754*7c568831SAndroid Build Coastguard Worker         return(1);
755*7c568831SAndroid Build Coastguard Worker     for(lk = old->sentinel->next; lk != old->sentinel; lk = lk->next) {
756*7c568831SAndroid Build Coastguard Worker         if (0 !=xmlListInsert(cur, lk->data)) {
757*7c568831SAndroid Build Coastguard Worker             xmlListDelete(cur);
758*7c568831SAndroid Build Coastguard Worker             return (1);
759*7c568831SAndroid Build Coastguard Worker         }
760*7c568831SAndroid Build Coastguard Worker     }
761*7c568831SAndroid Build Coastguard Worker     return (0);
762*7c568831SAndroid Build Coastguard Worker }
763*7c568831SAndroid Build Coastguard Worker /* xmlListUnique() */
764*7c568831SAndroid Build Coastguard Worker /* xmlListSwap */
765