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 */ 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlLinkPtr 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlListLowerSearch(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); 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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 */ 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlLinkPtr 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlListHigherSearch(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); 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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 */ 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlLinkPtr 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlListLinkSearch(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 */ 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlLinkPtr 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlListLinkReverseSearch(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)))) { 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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)); 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Add the sentinel */ 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NULL ==(l->sentinel = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) { 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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; 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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} 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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 * 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlListSearch(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 * 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlListReverseSearch(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 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlListInsert(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) { 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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 */ 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 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) { 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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; 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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; 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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; 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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; 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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 */ 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlLinkPtr 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} 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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 */ 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlLinkPtr 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} 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlListPushFront(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) { 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlListPushBack(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)))) { 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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; 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new copy of the list or NULL in case of error 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlListPtr 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 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 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 } 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 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