blob: 7fe4be754c3e7675e15a4b019c7ddecc967b4e45 [file] [log] [blame]
Owen Taylor3473f882001-02-23 17:55:21 +00001/*
William M. Brack21e4ef22005-01-02 09:53:13 +00002 * Summary: Chained hash tables
3 * Description: This module implements the hash table support used in
4 * various places in the library.
Owen Taylor3473f882001-02-23 17:55:21 +00005 *
Daniel Veillardbe586972003-11-18 20:56:51 +00006 * Copy: See Copyright for the status of this software.
Owen Taylor3473f882001-02-23 17:55:21 +00007 *
Daniel Veillardbe586972003-11-18 20:56:51 +00008 * Author: Bjorn Reese <bjorn.reese@systematic.dk>
Owen Taylor3473f882001-02-23 17:55:21 +00009 */
10
11#ifndef __XML_HASH_H__
12#define __XML_HASH_H__
13
Owen Taylor3473f882001-02-23 17:55:21 +000014#ifdef __cplusplus
15extern "C" {
16#endif
17
18/*
Daniel Veillard61f26172002-03-12 18:46:39 +000019 * The hash table.
Owen Taylor3473f882001-02-23 17:55:21 +000020 */
21typedef struct _xmlHashTable xmlHashTable;
22typedef xmlHashTable *xmlHashTablePtr;
23
Daniel Veillard5841f0e2003-11-20 11:59:09 +000024#ifdef __cplusplus
25}
26#endif
27
28#include <libxml/xmlversion.h>
29#include <libxml/parser.h>
Daniel Veillard316a5c32005-01-23 22:56:39 +000030#include <libxml/dict.h>
Daniel Veillard5841f0e2003-11-20 11:59:09 +000031
32#ifdef __cplusplus
33extern "C" {
34#endif
35
Owen Taylor3473f882001-02-23 17:55:21 +000036/*
William M. Brackad0e67c2004-12-01 14:35:10 +000037 * Recent version of gcc produce a warning when a function pointer is assigned
38 * to an object pointer, or vice versa. The following macro is a dirty hack
39 * to allow suppression of the warning. If your architecture has function
40 * pointers which are a different size than a void pointer, there may be some
41 * serious trouble within the library.
42 */
43/**
44 * XML_CAST_FPTR:
45 * @fptr: pointer to a function
46 *
47 * Macro to do a casting from an object pointer to a
48 * function pointer without encountering a warning from
49 * gcc
50 *
Daniel Veillardc0c6ce22005-03-10 09:22:07 +000051 * #define XML_CAST_FPTR(fptr) (*(void **)(&fptr))
52 * This macro violated ISO C aliasing rules (gcc4 on s390 broke)
53 * so it is disabled now
William M. Brackad0e67c2004-12-01 14:35:10 +000054 */
Daniel Veillardc0c6ce22005-03-10 09:22:07 +000055
56#define XML_CAST_FPTR(fptr) fptr
57
William M. Brackad0e67c2004-12-01 14:35:10 +000058
59/*
Owen Taylor3473f882001-02-23 17:55:21 +000060 * function types:
61 */
Daniel Veillard9d06d302002-01-22 18:15:52 +000062/**
63 * xmlHashDeallocator:
64 * @payload: the data in the hash
65 * @name: the name associated
66 *
Daniel Veillard61f26172002-03-12 18:46:39 +000067 * Callback to free data from a hash.
Daniel Veillard9d06d302002-01-22 18:15:52 +000068 */
Owen Taylor3473f882001-02-23 17:55:21 +000069typedef void (*xmlHashDeallocator)(void *payload, xmlChar *name);
Daniel Veillard9d06d302002-01-22 18:15:52 +000070/**
71 * xmlHashCopier:
72 * @payload: the data in the hash
73 * @name: the name associated
74 *
Daniel Veillard61f26172002-03-12 18:46:39 +000075 * Callback to copy data from a hash.
Daniel Veillard9d06d302002-01-22 18:15:52 +000076 *
Daniel Veillard61f26172002-03-12 18:46:39 +000077 * Returns a copy of the data or NULL in case of error.
Daniel Veillard9d06d302002-01-22 18:15:52 +000078 */
Owen Taylor3473f882001-02-23 17:55:21 +000079typedef void *(*xmlHashCopier)(void *payload, xmlChar *name);
Daniel Veillard9d06d302002-01-22 18:15:52 +000080/**
81 * xmlHashScanner:
82 * @payload: the data in the hash
83 * @data: extra scannner data
84 * @name: the name associated
85 *
Daniel Veillard61f26172002-03-12 18:46:39 +000086 * Callback when scanning data in a hash with the simple scanner.
Daniel Veillard9d06d302002-01-22 18:15:52 +000087 */
88typedef void (*xmlHashScanner)(void *payload, void *data, xmlChar *name);
89/**
90 * xmlHashScannerFull:
91 * @payload: the data in the hash
92 * @data: extra scannner data
93 * @name: the name associated
94 * @name2: the second name associated
95 * @name3: the third name associated
96 *
Daniel Veillard61f26172002-03-12 18:46:39 +000097 * Callback when scanning data in a hash with the full scanner.
Daniel Veillard9d06d302002-01-22 18:15:52 +000098 */
Thomas Broyere8126242001-07-22 03:54:15 +000099typedef void (*xmlHashScannerFull)(void *payload, void *data,
100 const xmlChar *name, const xmlChar *name2,
101 const xmlChar *name3);
Owen Taylor3473f882001-02-23 17:55:21 +0000102
103/*
Daniel Veillard61f26172002-03-12 18:46:39 +0000104 * Constructor and destructor.
Owen Taylor3473f882001-02-23 17:55:21 +0000105 */
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000106XMLPUBFUN xmlHashTablePtr XMLCALL
107 xmlHashCreate (int size);
Daniel Veillard316a5c32005-01-23 22:56:39 +0000108XMLPUBFUN xmlHashTablePtr XMLCALL
109 xmlHashCreateDict(int size,
110 xmlDictPtr dict);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000111XMLPUBFUN void XMLCALL
112 xmlHashFree (xmlHashTablePtr table,
Owen Taylor3473f882001-02-23 17:55:21 +0000113 xmlHashDeallocator f);
114
115/*
Daniel Veillard61f26172002-03-12 18:46:39 +0000116 * Add a new entry to the hash table.
Owen Taylor3473f882001-02-23 17:55:21 +0000117 */
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000118XMLPUBFUN int XMLCALL
119 xmlHashAddEntry (xmlHashTablePtr table,
Owen Taylor3473f882001-02-23 17:55:21 +0000120 const xmlChar *name,
121 void *userdata);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000122XMLPUBFUN int XMLCALL
123 xmlHashUpdateEntry(xmlHashTablePtr table,
Owen Taylor3473f882001-02-23 17:55:21 +0000124 const xmlChar *name,
125 void *userdata,
126 xmlHashDeallocator f);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000127XMLPUBFUN int XMLCALL
128 xmlHashAddEntry2(xmlHashTablePtr table,
Owen Taylor3473f882001-02-23 17:55:21 +0000129 const xmlChar *name,
130 const xmlChar *name2,
131 void *userdata);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000132XMLPUBFUN int XMLCALL
133 xmlHashUpdateEntry2(xmlHashTablePtr table,
Owen Taylor3473f882001-02-23 17:55:21 +0000134 const xmlChar *name,
135 const xmlChar *name2,
136 void *userdata,
137 xmlHashDeallocator f);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000138XMLPUBFUN int XMLCALL
139 xmlHashAddEntry3(xmlHashTablePtr table,
Owen Taylor3473f882001-02-23 17:55:21 +0000140 const xmlChar *name,
141 const xmlChar *name2,
142 const xmlChar *name3,
143 void *userdata);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000144XMLPUBFUN int XMLCALL
145 xmlHashUpdateEntry3(xmlHashTablePtr table,
Owen Taylor3473f882001-02-23 17:55:21 +0000146 const xmlChar *name,
147 const xmlChar *name2,
148 const xmlChar *name3,
149 void *userdata,
150 xmlHashDeallocator f);
151
152/*
Daniel Veillard61f26172002-03-12 18:46:39 +0000153 * Remove an entry from the hash table.
Owen Taylor3473f882001-02-23 17:55:21 +0000154 */
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000155XMLPUBFUN int XMLCALL
156 xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name,
Owen Taylor3473f882001-02-23 17:55:21 +0000157 xmlHashDeallocator f);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000158XMLPUBFUN int XMLCALL
159 xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name,
Owen Taylor3473f882001-02-23 17:55:21 +0000160 const xmlChar *name2, xmlHashDeallocator f);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000161XMLPUBFUN int XMLCALL
162 xmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name,
Owen Taylor3473f882001-02-23 17:55:21 +0000163 const xmlChar *name2, const xmlChar *name3,
164 xmlHashDeallocator f);
165
166/*
Daniel Veillard61f26172002-03-12 18:46:39 +0000167 * Retrieve the userdata.
Owen Taylor3473f882001-02-23 17:55:21 +0000168 */
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000169XMLPUBFUN void * XMLCALL
170 xmlHashLookup (xmlHashTablePtr table,
Owen Taylor3473f882001-02-23 17:55:21 +0000171 const xmlChar *name);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000172XMLPUBFUN void * XMLCALL
173 xmlHashLookup2 (xmlHashTablePtr table,
Owen Taylor3473f882001-02-23 17:55:21 +0000174 const xmlChar *name,
175 const xmlChar *name2);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000176XMLPUBFUN void * XMLCALL
177 xmlHashLookup3 (xmlHashTablePtr table,
Owen Taylor3473f882001-02-23 17:55:21 +0000178 const xmlChar *name,
179 const xmlChar *name2,
180 const xmlChar *name3);
Daniel Veillard07cb8222003-09-10 10:51:05 +0000181XMLPUBFUN void * XMLCALL
182 xmlHashQLookup (xmlHashTablePtr table,
183 const xmlChar *name,
184 const xmlChar *prefix);
185XMLPUBFUN void * XMLCALL
186 xmlHashQLookup2 (xmlHashTablePtr table,
187 const xmlChar *name,
188 const xmlChar *prefix,
189 const xmlChar *name2,
190 const xmlChar *prefix2);
191XMLPUBFUN void * XMLCALL
192 xmlHashQLookup3 (xmlHashTablePtr table,
193 const xmlChar *name,
194 const xmlChar *prefix,
195 const xmlChar *name2,
196 const xmlChar *prefix2,
197 const xmlChar *name3,
198 const xmlChar *prefix3);
Owen Taylor3473f882001-02-23 17:55:21 +0000199
200/*
Daniel Veillard61f26172002-03-12 18:46:39 +0000201 * Helpers.
Owen Taylor3473f882001-02-23 17:55:21 +0000202 */
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000203XMLPUBFUN xmlHashTablePtr XMLCALL
204 xmlHashCopy (xmlHashTablePtr table,
Owen Taylor3473f882001-02-23 17:55:21 +0000205 xmlHashCopier f);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000206XMLPUBFUN int XMLCALL
207 xmlHashSize (xmlHashTablePtr table);
208XMLPUBFUN void XMLCALL
209 xmlHashScan (xmlHashTablePtr table,
Owen Taylor3473f882001-02-23 17:55:21 +0000210 xmlHashScanner f,
211 void *data);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000212XMLPUBFUN void XMLCALL
213 xmlHashScan3 (xmlHashTablePtr table,
Owen Taylor3473f882001-02-23 17:55:21 +0000214 const xmlChar *name,
215 const xmlChar *name2,
216 const xmlChar *name3,
217 xmlHashScanner f,
218 void *data);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000219XMLPUBFUN void XMLCALL
220 xmlHashScanFull (xmlHashTablePtr table,
Thomas Broyere8126242001-07-22 03:54:15 +0000221 xmlHashScannerFull f,
222 void *data);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000223XMLPUBFUN void XMLCALL
224 xmlHashScanFull3(xmlHashTablePtr table,
Thomas Broyere8126242001-07-22 03:54:15 +0000225 const xmlChar *name,
226 const xmlChar *name2,
227 const xmlChar *name3,
228 xmlHashScannerFull f,
229 void *data);
Owen Taylor3473f882001-02-23 17:55:21 +0000230#ifdef __cplusplus
231}
232#endif
233#endif /* ! __XML_HASH_H__ */