1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * hash.c: chained hash tables 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reference: Your favorite introductory book on algorithms 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6df143a5041f03a22808b59c76698770b74692815Selim Gurun * Copyright (C) 2000,2012 Bjorn Reese and Daniel Veillard. 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Permission to use, copy, modify, and distribute this software for any 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * purpose with or without fee is hereby granted, provided that the above 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * copyright notice and this permission notice appear in all copies. 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Author: breese@users.sourceforge.net 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 24df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_STDLIB_H 25df143a5041f03a22808b59c76698770b74692815Selim Gurun#include <stdlib.h> 26df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 27df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_TIME_H 28df143a5041f03a22808b59c76698770b74692815Selim Gurun#include <time.h> 29df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 30df143a5041f03a22808b59c76698770b74692815Selim Gurun 31df143a5041f03a22808b59c76698770b74692815Selim Gurun/* 32df143a5041f03a22808b59c76698770b74692815Selim Gurun * Following http://www.ocert.org/advisories/ocert-2011-003.html 33df143a5041f03a22808b59c76698770b74692815Selim Gurun * it seems that having hash randomization might be a good idea 34df143a5041f03a22808b59c76698770b74692815Selim Gurun * when using XML with untrusted data 35df143a5041f03a22808b59c76698770b74692815Selim Gurun */ 36df143a5041f03a22808b59c76698770b74692815Selim Gurun#if defined(HAVE_RAND) && defined(HAVE_SRAND) && defined(HAVE_TIME) 37df143a5041f03a22808b59c76698770b74692815Selim Gurun#define HASH_RANDOMIZATION 38df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 39df143a5041f03a22808b59c76698770b74692815Selim Gurun 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h> 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/hash.h> 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h> 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h> 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h> 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_HASH_LEN 8 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_GROW */ 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 50df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HASH_RANDOMIZATION 51df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int hash_initialized = 0; 52df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 53df143a5041f03a22808b59c76698770b74692815Selim Gurun 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A single entry in the hash table 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlHashEntry xmlHashEntry; 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlHashEntry *xmlHashEntryPtr; 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlHashEntry { 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct _xmlHashEntry *next; 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name; 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name2; 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name3; 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *payload; 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int valid; 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The entire hash table 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlHashTable { 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct _xmlHashEntry *table; 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbElems; 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict; 76df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HASH_RANDOMIZATION 77df143a5041f03a22808b59c76698770b74692815Selim Gurun int random_seed; 78df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashComputeKey: 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Calculate the hash key 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned long 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashComputeKey(xmlHashTablePtr table, const xmlChar *name, 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name2, const xmlChar *name3) { 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long value = 0L; 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char ch; 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 91df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HASH_RANDOMIZATION 92df143a5041f03a22808b59c76698770b74692815Selim Gurun value = table->random_seed; 93df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value += 30 * (*name); 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ch = *name++) != 0) { 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name2 != NULL) { 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ch = *name2++) != 0) { 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name3 != NULL) { 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ch = *name3++) != 0) { 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (value % table->size); 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic unsigned long 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashComputeQKey(xmlHashTablePtr table, 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix, const xmlChar *name, 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix2, const xmlChar *name2, 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix3, const xmlChar *name3) { 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long value = 0L; 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char ch; 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 121df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HASH_RANDOMIZATION 122df143a5041f03a22808b59c76698770b74692815Selim Gurun value = table->random_seed; 123df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value += 30 * (*prefix); 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value += 30 * (*name); 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix != NULL) { 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ch = *prefix++) != 0) { 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = value ^ ((value << 5) + (value >> 3) + (unsigned long)':'); 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ch = *name++) != 0) { 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix2 != NULL) { 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ch = *prefix2++) != 0) { 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = value ^ ((value << 5) + (value >> 3) + (unsigned long)':'); 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name2 != NULL) { 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ch = *name2++) != 0) { 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix3 != NULL) { 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ch = *prefix3++) != 0) { 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = value ^ ((value << 5) + (value >> 3) + (unsigned long)':'); 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name3 != NULL) { 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((ch = *name3++) != 0) { 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (value % table->size); 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashCreate: 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the size of the hash table 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlHashTablePtr. 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object, or NULL if an error occured. 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashTablePtr 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashCreate(int size) { 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr table; 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size <= 0) 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = 256; 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = xmlMalloc(sizeof(xmlHashTable)); 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table) { 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->dict = NULL; 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->size = size; 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->nbElems = 0; 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->table = xmlMalloc(size * sizeof(xmlHashEntry)); 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table) { 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(table->table, 0, size * sizeof(xmlHashEntry)); 188df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HASH_RANDOMIZATION 189df143a5041f03a22808b59c76698770b74692815Selim Gurun if (!hash_initialized) { 190df143a5041f03a22808b59c76698770b74692815Selim Gurun srand(time(NULL)); 191df143a5041f03a22808b59c76698770b74692815Selim Gurun hash_initialized = 1; 192df143a5041f03a22808b59c76698770b74692815Selim Gurun } 193df143a5041f03a22808b59c76698770b74692815Selim Gurun table->random_seed = rand(); 194df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(table); 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(table); 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashCreateDict: 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the size of the hash table 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dict: a dictionary to use for the hash 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new xmlHashTablePtr which will use @dict as the internal dictionary 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly created object, or NULL if an error occured. 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashTablePtr 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashCreateDict(int size, xmlDictPtr dict) { 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr table; 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = xmlHashCreate(size); 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table != NULL) { 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->dict = dict; 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictReference(dict); 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(table); 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashGrow: 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the new size of the hash table 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * resize the hash table 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of failure 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashGrow(xmlHashTablePtr table, int size) { 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long key; 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int oldsize, i; 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr iter, next; 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct _xmlHashEntry *oldtable; 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_GROW 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long nbElem = 0; 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size < 8) 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size > 8 * 2048) 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldsize = table->size; 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldtable = table->table; 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (oldtable == NULL) 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->table = xmlMalloc(size * sizeof(xmlHashEntry)); 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table == NULL) { 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->table = oldtable; 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(table->table, 0, size * sizeof(xmlHashEntry)); 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->size = size; 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* If the two loops are merged, there would be situations where 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project a new entry needs to allocated and data copied into it from 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project the main table. So instead, we run through the array twice, first 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project copying all the elements in the main array (where we can't get 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project conflicts) and then the rest, so we only free (and don't allocate) 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldsize; i++) { 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (oldtable[i].valid == 0) 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project key = xmlHashComputeKey(table, oldtable[i].name, oldtable[i].name2, 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project oldtable[i].name3); 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&(table->table[key]), &(oldtable[i]), sizeof(xmlHashEntry)); 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->table[key].next = NULL; 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; i < oldsize; i++) { 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter = oldtable[i].next; 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (iter) { 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = iter->next; 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * put back the entry in the new table 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project key = xmlHashComputeKey(table, iter->name, iter->name2, 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter->name3); 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table[key].valid == 0) { 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&(table->table[key]), iter, sizeof(xmlHashEntry)); 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->table[key].next = NULL; 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(iter); 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter->next = table->table[key].next; 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->table[key].next = iter; 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_GROW 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbElem++; 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter = next; 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(oldtable); 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_GROW 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlHashGrow : from %d to %d, %d elems\n", oldsize, size, nbElem); 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashFree: 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the deallocator function for items in the hash 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the hash @table and its contents. The userdata is 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * deallocated with @f if provided. 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashFree(xmlHashTablePtr table, xmlHashDeallocator f) { 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr iter; 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr next; 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int inside_table = 0; 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbElems; 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table) { 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbElems = table->nbElems; 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for(i = 0; (i < table->size) && (nbElems > 0); i++) { 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter = &(table->table[i]); 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (iter->valid == 0) 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inside_table = 1; 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (iter) { 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = iter->next; 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((f != NULL) && (iter->payload != NULL)) 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f(iter->payload, iter->name); 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->dict == NULL) { 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (iter->name) 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(iter->name); 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (iter->name2) 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(iter->name2); 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (iter->name3) 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(iter->name3); 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter->payload = NULL; 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!inside_table) 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(iter); 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbElems--; 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inside_table = 0; 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter = next; 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(table->table); 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->dict) 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictFree(table->dict); 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(table); 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashAddEntry: 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @userdata: a pointer to the userdata 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add the @userdata to the hash @table. This can later be retrieved 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by using the @name. Duplicate names generate errors. 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 the addition succeeded and -1 in case of error. 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashAddEntry(xmlHashTablePtr table, const xmlChar *name, void *userdata) { 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashAddEntry3(table, name, NULL, NULL, userdata)); 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashAddEntry2: 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name2: a second name of the userdata 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @userdata: a pointer to the userdata 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add the @userdata to the hash @table. This can later be retrieved 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by using the (@name, @name2) tuple. Duplicate tuples generate errors. 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 the addition succeeded and -1 in case of error. 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashAddEntry2(xmlHashTablePtr table, const xmlChar *name, 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name2, void *userdata) { 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashAddEntry3(table, name, name2, NULL, userdata)); 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashUpdateEntry: 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @userdata: a pointer to the userdata 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the deallocator function for replaced item (if any) 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add the @userdata to the hash @table. This can later be retrieved 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by using the @name. Existing entry for this @name will be removed 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and freed with @f if found. 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 the addition succeeded and -1 in case of error. 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashUpdateEntry(xmlHashTablePtr table, const xmlChar *name, 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *userdata, xmlHashDeallocator f) { 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashUpdateEntry3(table, name, NULL, NULL, userdata, f)); 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashUpdateEntry2: 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name2: a second name of the userdata 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @userdata: a pointer to the userdata 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the deallocator function for replaced item (if any) 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add the @userdata to the hash @table. This can later be retrieved 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by using the (@name, @name2) tuple. Existing entry for this tuple will 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be removed and freed with @f if found. 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 the addition succeeded and -1 in case of error. 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashUpdateEntry2(xmlHashTablePtr table, const xmlChar *name, 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name2, void *userdata, 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashDeallocator f) { 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashUpdateEntry3(table, name, name2, NULL, userdata, f)); 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashLookup: 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the userdata specified by the @name. 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the pointer to the userdata 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid * 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashLookup(xmlHashTablePtr table, const xmlChar *name) { 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashLookup3(table, name, NULL, NULL)); 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashLookup2: 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name2: a second name of the userdata 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the userdata specified by the (@name, @name2) tuple. 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the pointer to the userdata 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid * 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashLookup2(xmlHashTablePtr table, const xmlChar *name, 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name2) { 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashLookup3(table, name, name2, NULL)); 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashQLookup: 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: the prefix of the userdata 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the userdata specified by the QName @prefix:@name/@name. 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the pointer to the userdata 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid * 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashQLookup(xmlHashTablePtr table, const xmlChar *prefix, 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name) { 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashQLookup3(table, prefix, name, NULL, NULL, NULL, NULL)); 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashQLookup2: 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: the prefix of the userdata 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix2: the second prefix of the userdata 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name2: a second name of the userdata 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the userdata specified by the QNames tuple 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the pointer to the userdata 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid * 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashQLookup2(xmlHashTablePtr table, const xmlChar *prefix, 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name, const xmlChar *prefix2, 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name2) { 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashQLookup3(table, prefix, name, prefix2, name2, NULL, NULL)); 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashAddEntry3: 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name2: a second name of the userdata 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name3: a third name of the userdata 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @userdata: a pointer to the userdata 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add the @userdata to the hash @table. This can later be retrieved 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by using the tuple (@name, @name2, @name3). Duplicate entries generate 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors. 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 the addition succeeded and -1 in case of error. 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashAddEntry3(xmlHashTablePtr table, const xmlChar *name, 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name2, const xmlChar *name3, 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *userdata) { 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long key, len = 0; 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr entry; 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr insert; 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((table == NULL) || (name == NULL)) 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If using a dict internalize if needed 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->dict) { 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlDictOwns(table->dict, name)) { 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlDictLookup(table->dict, name, -1); 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((name2 != NULL) && (!xmlDictOwns(table->dict, name2))) { 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name2 = xmlDictLookup(table->dict, name2, -1); 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name2 == NULL) 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((name3 != NULL) && (!xmlDictOwns(table->dict, name3))) { 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name3 = xmlDictLookup(table->dict, name3, -1); 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name3 == NULL) 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for duplicate and insertion location. 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project key = xmlHashComputeKey(table, name, name2, name3); 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table[key].valid == 0) { 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert = NULL; 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->dict) { 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (insert = &(table->table[key]); insert->next != NULL; 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert = insert->next) { 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((insert->name == name) && 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->name2 == name2) && 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->name3 == name3)) 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len++; 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((insert->name == name) && 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->name2 == name2) && 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->name3 == name3)) 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (insert = &(table->table[key]); insert->next != NULL; 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert = insert->next) { 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual(insert->name, name)) && 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(insert->name2, name2)) && 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(insert->name3, name3))) 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len++; 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual(insert->name, name)) && 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(insert->name2, name2)) && 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(insert->name3, name3))) 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (insert == NULL) { 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry = &(table->table[key]); 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry = xmlMalloc(sizeof(xmlHashEntry)); 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entry == NULL) 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->dict != NULL) { 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->name = (xmlChar *) name; 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->name2 = (xmlChar *) name2; 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->name3 = (xmlChar *) name3; 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->name = xmlStrdup(name); 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->name2 = xmlStrdup(name2); 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->name3 = xmlStrdup(name3); 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->payload = userdata; 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->next = NULL; 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->valid = 1; 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (insert != NULL) 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert->next = entry; 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->nbElems++; 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len > MAX_HASH_LEN) 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashGrow(table, MAX_HASH_LEN * table->size); 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashUpdateEntry3: 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name2: a second name of the userdata 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name3: a third name of the userdata 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @userdata: a pointer to the userdata 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the deallocator function for replaced item (if any) 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add the @userdata to the hash @table. This can later be retrieved 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by using the tuple (@name, @name2, @name3). Existing entry for this tuple 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be removed and freed with @f if found. 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 the addition succeeded and -1 in case of error. 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashUpdateEntry3(xmlHashTablePtr table, const xmlChar *name, 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name2, const xmlChar *name3, 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *userdata, xmlHashDeallocator f) { 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long key; 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr entry; 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr insert; 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((table == NULL) || name == NULL) 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If using a dict internalize if needed 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->dict) { 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlDictOwns(table->dict, name)) { 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlDictLookup(table->dict, name, -1); 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((name2 != NULL) && (!xmlDictOwns(table->dict, name2))) { 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name2 = xmlDictLookup(table->dict, name2, -1); 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name2 == NULL) 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((name3 != NULL) && (!xmlDictOwns(table->dict, name3))) { 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name3 = xmlDictLookup(table->dict, name3, -1); 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name3 == NULL) 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for duplicate and insertion location. 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project key = xmlHashComputeKey(table, name, name2, name3); 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table[key].valid == 0) { 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert = NULL; 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table ->dict) { 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (insert = &(table->table[key]); insert->next != NULL; 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert = insert->next) { 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((insert->name == name) && 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->name2 == name2) && 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->name3 == name3)) { 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (f) 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f(insert->payload, insert->name); 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert->payload = userdata; 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((insert->name == name) && 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->name2 == name2) && 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (insert->name3 == name3)) { 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (f) 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f(insert->payload, insert->name); 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert->payload = userdata; 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (insert = &(table->table[key]); insert->next != NULL; 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert = insert->next) { 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual(insert->name, name)) && 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(insert->name2, name2)) && 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(insert->name3, name3))) { 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (f) 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f(insert->payload, insert->name); 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert->payload = userdata; 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual(insert->name, name)) && 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(insert->name2, name2)) && 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(insert->name3, name3))) { 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (f) 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f(insert->payload, insert->name); 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert->payload = userdata; 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (insert == NULL) { 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry = &(table->table[key]); 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry = xmlMalloc(sizeof(xmlHashEntry)); 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entry == NULL) 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->dict != NULL) { 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->name = (xmlChar *) name; 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->name2 = (xmlChar *) name2; 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->name3 = (xmlChar *) name3; 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->name = xmlStrdup(name); 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->name2 = xmlStrdup(name2); 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->name3 = xmlStrdup(name3); 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->payload = userdata; 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->next = NULL; 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->valid = 1; 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->nbElems++; 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (insert != NULL) { 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project insert->next = entry; 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashLookup3: 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name2: a second name of the userdata 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name3: a third name of the userdata 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the userdata specified by the (@name, @name2, @name3) tuple. 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the a pointer to the userdata 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid * 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashLookup3(xmlHashTablePtr table, const xmlChar *name, 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name2, const xmlChar *name3) { 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long key; 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr entry; 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project key = xmlHashComputeKey(table, name, name2, name3); 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table[key].valid == 0) 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->dict) { 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((entry->name == name) && 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (entry->name2 == name2) && 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (entry->name3 == name3)) 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(entry->payload); 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrEqual(entry->name, name)) && 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(entry->name2, name2)) && 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(entry->name3, name3))) 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(entry->payload); 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashQLookup3: 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: the prefix of the userdata 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix2: the second prefix of the userdata 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name2: a second name of the userdata 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix3: the third prefix of the userdata 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name3: a third name of the userdata 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the userdata specified by the (@name, @name2, @name3) tuple. 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the a pointer to the userdata 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid * 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashQLookup3(xmlHashTablePtr table, 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix, const xmlChar *name, 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix2, const xmlChar *name2, 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix3, const xmlChar *name3) { 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long key; 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr entry; 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project key = xmlHashComputeQKey(table, prefix, name, prefix2, 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name2, prefix3, name3); 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table[key].valid == 0) 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlStrQEqual(prefix, name, entry->name)) && 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrQEqual(prefix2, name2, entry->name2)) && 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrQEqual(prefix3, name3, entry->name3))) 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(entry->payload); 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct { 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScanner hashscanner; 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data; 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} stubData; 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectstubHashScannerFull (void *payload, void *data, const xmlChar *name, 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name2 ATTRIBUTE_UNUSED, 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name3 ATTRIBUTE_UNUSED) { 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stubData *stubdata = (stubData *) data; 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stubdata->hashscanner (payload, stubdata->data, (xmlChar *) name); 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashScan: 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the scanner function for items in the hash 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: extra data passed to f 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Scan the hash @table and applied @f to each value. 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashScan(xmlHashTablePtr table, xmlHashScanner f, void *data) { 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stubData stubdata; 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stubdata.data = data; 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stubdata.hashscanner = f; 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScanFull (table, stubHashScannerFull, &stubdata); 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashScanFull: 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the scanner function for items in the hash 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: extra data passed to f 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Scan the hash @table and applied @f to each value. 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashScanFull(xmlHashTablePtr table, xmlHashScannerFull f, void *data) { 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, nb; 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr iter; 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr next; 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (f == NULL) 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table) { 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for(i = 0; i < table->size; i++) { 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table[i].valid == 0) 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter = &(table->table[i]); 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (iter) { 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = iter->next; 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nb = table->nbElems; 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((f != NULL) && (iter->payload != NULL)) 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f(iter->payload, data, iter->name, 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter->name2, iter->name3); 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nb != table->nbElems) { 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* table was modified by the callback, be careful */ 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (iter == &(table->table[i])) { 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table[i].valid == 0) 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter = NULL; 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table[i].next != next) 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter = &(table->table[i]); 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter = next; 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter = next; 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashScan3: 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata or NULL 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name2: a second name of the userdata or NULL 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name3: a third name of the userdata or NULL 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the scanner function for items in the hash 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: extra data passed to f 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Scan the hash @table and applied @f to each value matching 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (@name, @name2, @name3) tuple. If one of the names is null, 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the comparison is considered to match. 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashScan3(xmlHashTablePtr table, const xmlChar *name, 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name2, const xmlChar *name3, 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScanner f, void *data) { 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScanFull3 (table, name, name2, name3, 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlHashScannerFull) f, data); 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashScanFull3: 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata or NULL 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name2: a second name of the userdata or NULL 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name3: a third name of the userdata or NULL 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the scanner function for items in the hash 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: extra data passed to f 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Scan the hash @table and applied @f to each value matching 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (@name, @name2, @name3) tuple. If one of the names is null, 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the comparison is considered to match. 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashScanFull3(xmlHashTablePtr table, const xmlChar *name, 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name2, const xmlChar *name3, 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScannerFull f, void *data) { 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr iter; 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr next; 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (f == NULL) 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table) { 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for(i = 0; i < table->size; i++) { 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table[i].valid == 0) 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter = &(table->table[i]); 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (iter) { 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = iter->next; 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((name == NULL) || (xmlStrEqual(name, iter->name))) && 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((name2 == NULL) || (xmlStrEqual(name2, iter->name2))) && 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((name3 == NULL) || (xmlStrEqual(name3, iter->name3))) && 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (iter->payload != NULL)) { 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f(iter->payload, data, iter->name, 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter->name2, iter->name3); 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter = next; 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashCopy: 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the copier function for items in the hash 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Scan the hash @table and applied @f to each value. 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new table or NULL in case of error. 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashTablePtr 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashCopy(xmlHashTablePtr table, xmlHashCopier f) { 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr iter; 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr next; 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashTablePtr ret; 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (f == NULL) 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlHashCreate(table->size); 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table) { 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for(i = 0; i < table->size; i++) { 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table[i].valid == 0) 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter = &(table->table[i]); 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (iter) { 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = iter->next; 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashAddEntry3(ret, iter->name, iter->name2, 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter->name3, f(iter->payload, iter->name)); 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project iter = next; 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbElems = table->nbElems; 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashSize: 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Query the number of elements installed in the hash @table. 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of elements in the hash table or 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * -1 in case of error 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashSize(xmlHashTablePtr table) { 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL) 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(table->nbElems); 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashRemoveEntry: 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the deallocator function for removed item (if any) 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the userdata specified by the @name and remove 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it from the hash @table. Existing userdata for this tuple will be removed 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and freed with @f. 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the removal succeeded and -1 in case of error or not found. 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name, 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashDeallocator f) { 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashRemoveEntry3(table, name, NULL, NULL, f)); 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashRemoveEntry2: 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name2: a second name of the userdata 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the deallocator function for removed item (if any) 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the userdata specified by the (@name, @name2) tuple and remove 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it from the hash @table. Existing userdata for this tuple will be removed 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and freed with @f. 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the removal succeeded and -1 in case of error or not found. 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name, 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name2, xmlHashDeallocator f) { 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashRemoveEntry3(table, name, name2, NULL, f)); 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlHashRemoveEntry3: 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: the hash table 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the userdata 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name2: a second name of the userdata 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name3: a third name of the userdata 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f: the deallocator function for removed item (if any) 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the userdata specified by the (@name, @name2, @name3) tuple and remove 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * it from the hash @table. Existing userdata for this tuple will be removed 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and freed with @f. 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the removal succeeded and -1 in case of error or not found. 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name, 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name2, const xmlChar *name3, xmlHashDeallocator f) { 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned long key; 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr entry; 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashEntryPtr prev = NULL; 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table == NULL || name == NULL) 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project key = xmlHashComputeKey(table, name, name2, name3); 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->table[key].valid == 0) { 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(entry->name, name) && 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrEqual(entry->name2, name2) && 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrEqual(entry->name3, name3)) { 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((f != NULL) && (entry->payload != NULL)) 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project f(entry->payload, entry->name); 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->payload = NULL; 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (table->dict == NULL) { 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(entry->name) 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(entry->name); 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(entry->name2) 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(entry->name2); 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(entry->name3) 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(entry->name3); 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if(prev) { 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->next = entry->next; 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(entry); 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entry->next == NULL) { 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry->valid = 0; 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project entry = entry->next; 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memcpy(&(table->table[key]), entry, sizeof(xmlHashEntry)); 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(entry); 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table->nbElems--; 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = entry; 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_hash 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 1126