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__ */
266