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