1 /* libxml2 - Library for parsing XML documents
2 * Copyright (C) 2006-2019 Free Software Foundation, Inc.
3 *
4 * This file is not part of the GNU gettext program, but is used with
5 * GNU gettext.
6 *
7 * The original copyright notice is as follows:
8 */
9
10 /*
11 * Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved.
12 *
13 * Permission is hereby granted, free of charge, to any person obtaining a copy
14 * of this software and associated documentation files (the "Software"), to deal
15 * in the Software without restriction, including without limitation the rights
16 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17 * copies of the Software, and to permit persons to whom the Software is fur-
18 * nished to do so, subject to the following conditions:
19 *
20 * The above copyright notice and this permission notice shall be included in
21 * all copies or substantial portions of the Software.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
25 * NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29 * THE SOFTWARE.
30 *
31 * Author: Bjorn Reese <bjorn.reese@systematic.dk>
32 */
33
34 /*
35 * Summary: Chained hash tables
36 * Description: This module implements the hash table support used in
37 * various places in the library.
38 */
39
40 #ifndef __XML_HASH_H__
41 #define __XML_HASH_H__
42
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46
47 /*
48 * The hash table.
49 */
50 typedef struct _xmlHashTable xmlHashTable;
51 typedef xmlHashTable *xmlHashTablePtr;
52
53 #ifdef __cplusplus
54 }
55 #endif
56
57 #include <libxml/xmlversion.h>
58 #include <libxml/parser.h>
59 #include <libxml/dict.h>
60
61 #ifdef __cplusplus
62 extern "C" {
63 #endif
64
65 /*
66 * Recent version of gcc produce a warning when a function pointer is assigned
67 * to an object pointer, or vice versa. The following macro is a dirty hack
68 * to allow suppression of the warning. If your architecture has function
69 * pointers which are a different size than a void pointer, there may be some
70 * serious trouble within the library.
71 */
72 /**
73 * XML_CAST_FPTR:
74 * @fptr: pointer to a function
75 *
76 * Macro to do a casting from an object pointer to a
77 * function pointer without encountering a warning from
78 * gcc
79 *
80 * #define XML_CAST_FPTR(fptr) (*(void **)(&fptr))
81 * This macro violated ISO C aliasing rules (gcc4 on s390 broke)
82 * so it is disabled now
83 */
84
85 #define XML_CAST_FPTR(fptr) fptr
86
87
88 /*
89 * function types:
90 */
91 /**
92 * xmlHashDeallocator:
93 * @payload: the data in the hash
94 * @name: the name associated
95 *
96 * Callback to free data from a hash.
97 */
98 typedef void (*xmlHashDeallocator)(void *payload, const xmlChar *name);
99 /**
100 * xmlHashCopier:
101 * @payload: the data in the hash
102 * @name: the name associated
103 *
104 * Callback to copy data from a hash.
105 *
106 * Returns a copy of the data or NULL in case of error.
107 */
108 typedef void *(*xmlHashCopier)(void *payload, const xmlChar *name);
109 /**
110 * xmlHashScanner:
111 * @payload: the data in the hash
112 * @data: extra scannner data
113 * @name: the name associated
114 *
115 * Callback when scanning data in a hash with the simple scanner.
116 */
117 typedef void (*xmlHashScanner)(void *payload, void *data, const xmlChar *name);
118 /**
119 * xmlHashScannerFull:
120 * @payload: the data in the hash
121 * @data: extra scannner data
122 * @name: the name associated
123 * @name2: the second name associated
124 * @name3: the third name associated
125 *
126 * Callback when scanning data in a hash with the full scanner.
127 */
128 typedef void (*xmlHashScannerFull)(void *payload, void *data,
129 const xmlChar *name, const xmlChar *name2,
130 const xmlChar *name3);
131
132 /*
133 * Constructor and destructor.
134 */
135 XMLPUBFUN xmlHashTablePtr XMLCALL
136 xmlHashCreate (int size);
137 XMLPUBFUN xmlHashTablePtr XMLCALL
138 xmlHashCreateDict(int size,
139 xmlDictPtr dict);
140 XMLPUBFUN void XMLCALL
141 xmlHashFree (xmlHashTablePtr table,
142 xmlHashDeallocator f);
143 XMLPUBFUN void XMLCALL
144 xmlHashDefaultDeallocator(void *entry,
145 const xmlChar *name);
146
147 /*
148 * Add a new entry to the hash table.
149 */
150 XMLPUBFUN int XMLCALL
151 xmlHashAddEntry (xmlHashTablePtr table,
152 const xmlChar *name,
153 void *userdata);
154 XMLPUBFUN int XMLCALL
155 xmlHashUpdateEntry(xmlHashTablePtr table,
156 const xmlChar *name,
157 void *userdata,
158 xmlHashDeallocator f);
159 XMLPUBFUN int XMLCALL
160 xmlHashAddEntry2(xmlHashTablePtr table,
161 const xmlChar *name,
162 const xmlChar *name2,
163 void *userdata);
164 XMLPUBFUN int XMLCALL
165 xmlHashUpdateEntry2(xmlHashTablePtr table,
166 const xmlChar *name,
167 const xmlChar *name2,
168 void *userdata,
169 xmlHashDeallocator f);
170 XMLPUBFUN int XMLCALL
171 xmlHashAddEntry3(xmlHashTablePtr table,
172 const xmlChar *name,
173 const xmlChar *name2,
174 const xmlChar *name3,
175 void *userdata);
176 XMLPUBFUN int XMLCALL
177 xmlHashUpdateEntry3(xmlHashTablePtr table,
178 const xmlChar *name,
179 const xmlChar *name2,
180 const xmlChar *name3,
181 void *userdata,
182 xmlHashDeallocator f);
183
184 /*
185 * Remove an entry from the hash table.
186 */
187 XMLPUBFUN int XMLCALL
188 xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name,
189 xmlHashDeallocator f);
190 XMLPUBFUN int XMLCALL
191 xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name,
192 const xmlChar *name2, xmlHashDeallocator f);
193 XMLPUBFUN int XMLCALL
194 xmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name,
195 const xmlChar *name2, const xmlChar *name3,
196 xmlHashDeallocator f);
197
198 /*
199 * Retrieve the userdata.
200 */
201 XMLPUBFUN void * XMLCALL
202 xmlHashLookup (xmlHashTablePtr table,
203 const xmlChar *name);
204 XMLPUBFUN void * XMLCALL
205 xmlHashLookup2 (xmlHashTablePtr table,
206 const xmlChar *name,
207 const xmlChar *name2);
208 XMLPUBFUN void * XMLCALL
209 xmlHashLookup3 (xmlHashTablePtr table,
210 const xmlChar *name,
211 const xmlChar *name2,
212 const xmlChar *name3);
213 XMLPUBFUN void * XMLCALL
214 xmlHashQLookup (xmlHashTablePtr table,
215 const xmlChar *name,
216 const xmlChar *prefix);
217 XMLPUBFUN void * XMLCALL
218 xmlHashQLookup2 (xmlHashTablePtr table,
219 const xmlChar *name,
220 const xmlChar *prefix,
221 const xmlChar *name2,
222 const xmlChar *prefix2);
223 XMLPUBFUN void * XMLCALL
224 xmlHashQLookup3 (xmlHashTablePtr table,
225 const xmlChar *name,
226 const xmlChar *prefix,
227 const xmlChar *name2,
228 const xmlChar *prefix2,
229 const xmlChar *name3,
230 const xmlChar *prefix3);
231
232 /*
233 * Helpers.
234 */
235 XMLPUBFUN xmlHashTablePtr XMLCALL
236 xmlHashCopy (xmlHashTablePtr table,
237 xmlHashCopier f);
238 XMLPUBFUN int XMLCALL
239 xmlHashSize (xmlHashTablePtr table);
240 XMLPUBFUN void XMLCALL
241 xmlHashScan (xmlHashTablePtr table,
242 xmlHashScanner f,
243 void *data);
244 XMLPUBFUN void XMLCALL
245 xmlHashScan3 (xmlHashTablePtr table,
246 const xmlChar *name,
247 const xmlChar *name2,
248 const xmlChar *name3,
249 xmlHashScanner f,
250 void *data);
251 XMLPUBFUN void XMLCALL
252 xmlHashScanFull (xmlHashTablePtr table,
253 xmlHashScannerFull f,
254 void *data);
255 XMLPUBFUN void XMLCALL
256 xmlHashScanFull3(xmlHashTablePtr table,
257 const xmlChar *name,
258 const xmlChar *name2,
259 const xmlChar *name3,
260 xmlHashScannerFull f,
261 void *data);
262 #ifdef __cplusplus
263 }
264 #endif
265 #endif /* ! __XML_HASH_H__ */