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