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