xref: /aosp_15_r20/external/libxml2/include/libxml/hash.h (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker  * Summary: Chained hash tables
3*7c568831SAndroid Build Coastguard Worker  * Description: This module implements the hash table support used in
4*7c568831SAndroid Build Coastguard Worker  *		various places in the library.
5*7c568831SAndroid Build Coastguard Worker  *
6*7c568831SAndroid Build Coastguard Worker  * Copy: See Copyright for the status of this software.
7*7c568831SAndroid Build Coastguard Worker  *
8*7c568831SAndroid Build Coastguard Worker  * Author: Bjorn Reese <[email protected]>
9*7c568831SAndroid Build Coastguard Worker  */
10*7c568831SAndroid Build Coastguard Worker 
11*7c568831SAndroid Build Coastguard Worker #ifndef __XML_HASH_H__
12*7c568831SAndroid Build Coastguard Worker #define __XML_HASH_H__
13*7c568831SAndroid Build Coastguard Worker 
14*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlversion.h>
15*7c568831SAndroid Build Coastguard Worker #include <libxml/dict.h>
16*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlstring.h>
17*7c568831SAndroid Build Coastguard Worker 
18*7c568831SAndroid Build Coastguard Worker #ifdef __cplusplus
19*7c568831SAndroid Build Coastguard Worker extern "C" {
20*7c568831SAndroid Build Coastguard Worker #endif
21*7c568831SAndroid Build Coastguard Worker 
22*7c568831SAndroid Build Coastguard Worker /*
23*7c568831SAndroid Build Coastguard Worker  * The hash table.
24*7c568831SAndroid Build Coastguard Worker  */
25*7c568831SAndroid Build Coastguard Worker typedef struct _xmlHashTable xmlHashTable;
26*7c568831SAndroid Build Coastguard Worker typedef xmlHashTable *xmlHashTablePtr;
27*7c568831SAndroid Build Coastguard Worker 
28*7c568831SAndroid Build Coastguard Worker /*
29*7c568831SAndroid Build Coastguard Worker  * Recent version of gcc produce a warning when a function pointer is assigned
30*7c568831SAndroid Build Coastguard Worker  * to an object pointer, or vice versa.  The following macro is a dirty hack
31*7c568831SAndroid Build Coastguard Worker  * to allow suppression of the warning.  If your architecture has function
32*7c568831SAndroid Build Coastguard Worker  * pointers which are a different size than a void pointer, there may be some
33*7c568831SAndroid Build Coastguard Worker  * serious trouble within the library.
34*7c568831SAndroid Build Coastguard Worker  */
35*7c568831SAndroid Build Coastguard Worker /**
36*7c568831SAndroid Build Coastguard Worker  * XML_CAST_FPTR:
37*7c568831SAndroid Build Coastguard Worker  * @fptr:  pointer to a function
38*7c568831SAndroid Build Coastguard Worker  *
39*7c568831SAndroid Build Coastguard Worker  * Macro to do a casting from an object pointer to a
40*7c568831SAndroid Build Coastguard Worker  * function pointer without encountering a warning from
41*7c568831SAndroid Build Coastguard Worker  * gcc
42*7c568831SAndroid Build Coastguard Worker  *
43*7c568831SAndroid Build Coastguard Worker  * #define XML_CAST_FPTR(fptr) (*(void **)(&fptr))
44*7c568831SAndroid Build Coastguard Worker  * This macro violated ISO C aliasing rules (gcc4 on s390 broke)
45*7c568831SAndroid Build Coastguard Worker  * so it is disabled now
46*7c568831SAndroid Build Coastguard Worker  */
47*7c568831SAndroid Build Coastguard Worker 
48*7c568831SAndroid Build Coastguard Worker #define XML_CAST_FPTR(fptr) fptr
49*7c568831SAndroid Build Coastguard Worker 
50*7c568831SAndroid Build Coastguard Worker /*
51*7c568831SAndroid Build Coastguard Worker  * function types:
52*7c568831SAndroid Build Coastguard Worker  */
53*7c568831SAndroid Build Coastguard Worker /**
54*7c568831SAndroid Build Coastguard Worker  * xmlHashDeallocator:
55*7c568831SAndroid Build Coastguard Worker  * @payload:  the data in the hash
56*7c568831SAndroid Build Coastguard Worker  * @name:  the name associated
57*7c568831SAndroid Build Coastguard Worker  *
58*7c568831SAndroid Build Coastguard Worker  * Callback to free data from a hash.
59*7c568831SAndroid Build Coastguard Worker  */
60*7c568831SAndroid Build Coastguard Worker typedef void (*xmlHashDeallocator)(void *payload, const xmlChar *name);
61*7c568831SAndroid Build Coastguard Worker /**
62*7c568831SAndroid Build Coastguard Worker  * xmlHashCopier:
63*7c568831SAndroid Build Coastguard Worker  * @payload:  the data in the hash
64*7c568831SAndroid Build Coastguard Worker  * @name:  the name associated
65*7c568831SAndroid Build Coastguard Worker  *
66*7c568831SAndroid Build Coastguard Worker  * Callback to copy data from a hash.
67*7c568831SAndroid Build Coastguard Worker  *
68*7c568831SAndroid Build Coastguard Worker  * Returns a copy of the data or NULL in case of error.
69*7c568831SAndroid Build Coastguard Worker  */
70*7c568831SAndroid Build Coastguard Worker typedef void *(*xmlHashCopier)(void *payload, const xmlChar *name);
71*7c568831SAndroid Build Coastguard Worker /**
72*7c568831SAndroid Build Coastguard Worker  * xmlHashScanner:
73*7c568831SAndroid Build Coastguard Worker  * @payload:  the data in the hash
74*7c568831SAndroid Build Coastguard Worker  * @data:  extra scanner data
75*7c568831SAndroid Build Coastguard Worker  * @name:  the name associated
76*7c568831SAndroid Build Coastguard Worker  *
77*7c568831SAndroid Build Coastguard Worker  * Callback when scanning data in a hash with the simple scanner.
78*7c568831SAndroid Build Coastguard Worker  */
79*7c568831SAndroid Build Coastguard Worker typedef void (*xmlHashScanner)(void *payload, void *data, const xmlChar *name);
80*7c568831SAndroid Build Coastguard Worker /**
81*7c568831SAndroid Build Coastguard Worker  * xmlHashScannerFull:
82*7c568831SAndroid Build Coastguard Worker  * @payload:  the data in the hash
83*7c568831SAndroid Build Coastguard Worker  * @data:  extra scanner data
84*7c568831SAndroid Build Coastguard Worker  * @name:  the name associated
85*7c568831SAndroid Build Coastguard Worker  * @name2:  the second name associated
86*7c568831SAndroid Build Coastguard Worker  * @name3:  the third name associated
87*7c568831SAndroid Build Coastguard Worker  *
88*7c568831SAndroid Build Coastguard Worker  * Callback when scanning data in a hash with the full scanner.
89*7c568831SAndroid Build Coastguard Worker  */
90*7c568831SAndroid Build Coastguard Worker typedef void (*xmlHashScannerFull)(void *payload, void *data,
91*7c568831SAndroid Build Coastguard Worker 				   const xmlChar *name, const xmlChar *name2,
92*7c568831SAndroid Build Coastguard Worker 				   const xmlChar *name3);
93*7c568831SAndroid Build Coastguard Worker 
94*7c568831SAndroid Build Coastguard Worker /*
95*7c568831SAndroid Build Coastguard Worker  * Constructor and destructor.
96*7c568831SAndroid Build Coastguard Worker  */
97*7c568831SAndroid Build Coastguard Worker XMLPUBFUN xmlHashTablePtr
98*7c568831SAndroid Build Coastguard Worker 		xmlHashCreate		(int size);
99*7c568831SAndroid Build Coastguard Worker XMLPUBFUN xmlHashTablePtr
100*7c568831SAndroid Build Coastguard Worker 		xmlHashCreateDict	(int size,
101*7c568831SAndroid Build Coastguard Worker 					 xmlDictPtr dict);
102*7c568831SAndroid Build Coastguard Worker XMLPUBFUN void
103*7c568831SAndroid Build Coastguard Worker 		xmlHashFree		(xmlHashTablePtr hash,
104*7c568831SAndroid Build Coastguard Worker 					 xmlHashDeallocator dealloc);
105*7c568831SAndroid Build Coastguard Worker XMLPUBFUN void
106*7c568831SAndroid Build Coastguard Worker 		xmlHashDefaultDeallocator(void *entry,
107*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name);
108*7c568831SAndroid Build Coastguard Worker 
109*7c568831SAndroid Build Coastguard Worker /*
110*7c568831SAndroid Build Coastguard Worker  * Add a new entry to the hash table.
111*7c568831SAndroid Build Coastguard Worker  */
112*7c568831SAndroid Build Coastguard Worker XMLPUBFUN int
113*7c568831SAndroid Build Coastguard Worker 		xmlHashAdd		(xmlHashTablePtr hash,
114*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name,
115*7c568831SAndroid Build Coastguard Worker 		                         void *userdata);
116*7c568831SAndroid Build Coastguard Worker XMLPUBFUN int
117*7c568831SAndroid Build Coastguard Worker 		xmlHashAddEntry		(xmlHashTablePtr hash,
118*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name,
119*7c568831SAndroid Build Coastguard Worker 		                         void *userdata);
120*7c568831SAndroid Build Coastguard Worker XMLPUBFUN int
121*7c568831SAndroid Build Coastguard Worker 		xmlHashUpdateEntry	(xmlHashTablePtr hash,
122*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name,
123*7c568831SAndroid Build Coastguard Worker 		                         void *userdata,
124*7c568831SAndroid Build Coastguard Worker 					 xmlHashDeallocator dealloc);
125*7c568831SAndroid Build Coastguard Worker XMLPUBFUN int
126*7c568831SAndroid Build Coastguard Worker 		xmlHashAdd2		(xmlHashTablePtr hash,
127*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name,
128*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name2,
129*7c568831SAndroid Build Coastguard Worker 		                         void *userdata);
130*7c568831SAndroid Build Coastguard Worker XMLPUBFUN int
131*7c568831SAndroid Build Coastguard Worker 		xmlHashAddEntry2	(xmlHashTablePtr hash,
132*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name,
133*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name2,
134*7c568831SAndroid Build Coastguard Worker 		                         void *userdata);
135*7c568831SAndroid Build Coastguard Worker XMLPUBFUN int
136*7c568831SAndroid Build Coastguard Worker 		xmlHashUpdateEntry2	(xmlHashTablePtr hash,
137*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name,
138*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name2,
139*7c568831SAndroid Build Coastguard Worker 		                         void *userdata,
140*7c568831SAndroid Build Coastguard Worker 					 xmlHashDeallocator dealloc);
141*7c568831SAndroid Build Coastguard Worker XMLPUBFUN int
142*7c568831SAndroid Build Coastguard Worker 		xmlHashAdd3		(xmlHashTablePtr hash,
143*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name,
144*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name2,
145*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name3,
146*7c568831SAndroid Build Coastguard Worker 		                         void *userdata);
147*7c568831SAndroid Build Coastguard Worker XMLPUBFUN int
148*7c568831SAndroid Build Coastguard Worker 		xmlHashAddEntry3	(xmlHashTablePtr hash,
149*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name,
150*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name2,
151*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name3,
152*7c568831SAndroid Build Coastguard Worker 		                         void *userdata);
153*7c568831SAndroid Build Coastguard Worker XMLPUBFUN int
154*7c568831SAndroid Build Coastguard Worker 		xmlHashUpdateEntry3	(xmlHashTablePtr hash,
155*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name,
156*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name2,
157*7c568831SAndroid Build Coastguard Worker 		                         const xmlChar *name3,
158*7c568831SAndroid Build Coastguard Worker 		                         void *userdata,
159*7c568831SAndroid Build Coastguard Worker 					 xmlHashDeallocator dealloc);
160*7c568831SAndroid Build Coastguard Worker 
161*7c568831SAndroid Build Coastguard Worker /*
162*7c568831SAndroid Build Coastguard Worker  * Remove an entry from the hash table.
163*7c568831SAndroid Build Coastguard Worker  */
164*7c568831SAndroid Build Coastguard Worker XMLPUBFUN int
165*7c568831SAndroid Build Coastguard Worker 		xmlHashRemoveEntry	(xmlHashTablePtr hash,
166*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name,
167*7c568831SAndroid Build Coastguard Worker 					 xmlHashDeallocator dealloc);
168*7c568831SAndroid Build Coastguard Worker XMLPUBFUN int
169*7c568831SAndroid Build Coastguard Worker 		xmlHashRemoveEntry2	(xmlHashTablePtr hash,
170*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name,
171*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name2,
172*7c568831SAndroid Build Coastguard Worker 					 xmlHashDeallocator dealloc);
173*7c568831SAndroid Build Coastguard Worker XMLPUBFUN int
174*7c568831SAndroid Build Coastguard Worker 		xmlHashRemoveEntry3	(xmlHashTablePtr hash,
175*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name,
176*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name2,
177*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name3,
178*7c568831SAndroid Build Coastguard Worker 					 xmlHashDeallocator dealloc);
179*7c568831SAndroid Build Coastguard Worker 
180*7c568831SAndroid Build Coastguard Worker /*
181*7c568831SAndroid Build Coastguard Worker  * Retrieve the payload.
182*7c568831SAndroid Build Coastguard Worker  */
183*7c568831SAndroid Build Coastguard Worker XMLPUBFUN void *
184*7c568831SAndroid Build Coastguard Worker 		xmlHashLookup		(xmlHashTablePtr hash,
185*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name);
186*7c568831SAndroid Build Coastguard Worker XMLPUBFUN void *
187*7c568831SAndroid Build Coastguard Worker 		xmlHashLookup2		(xmlHashTablePtr hash,
188*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name,
189*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name2);
190*7c568831SAndroid Build Coastguard Worker XMLPUBFUN void *
191*7c568831SAndroid Build Coastguard Worker 		xmlHashLookup3		(xmlHashTablePtr hash,
192*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name,
193*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name2,
194*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name3);
195*7c568831SAndroid Build Coastguard Worker XMLPUBFUN void *
196*7c568831SAndroid Build Coastguard Worker 		xmlHashQLookup		(xmlHashTablePtr hash,
197*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *prefix,
198*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name);
199*7c568831SAndroid Build Coastguard Worker XMLPUBFUN void *
200*7c568831SAndroid Build Coastguard Worker 		xmlHashQLookup2		(xmlHashTablePtr hash,
201*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *prefix,
202*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name,
203*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *prefix2,
204*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name2);
205*7c568831SAndroid Build Coastguard Worker XMLPUBFUN void *
206*7c568831SAndroid Build Coastguard Worker 		xmlHashQLookup3		(xmlHashTablePtr hash,
207*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *prefix,
208*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name,
209*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *prefix2,
210*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name2,
211*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *prefix3,
212*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name3);
213*7c568831SAndroid Build Coastguard Worker 
214*7c568831SAndroid Build Coastguard Worker /*
215*7c568831SAndroid Build Coastguard Worker  * Helpers.
216*7c568831SAndroid Build Coastguard Worker  */
217*7c568831SAndroid Build Coastguard Worker XMLPUBFUN xmlHashTablePtr
218*7c568831SAndroid Build Coastguard Worker 		xmlHashCopySafe		(xmlHashTablePtr hash,
219*7c568831SAndroid Build Coastguard Worker 					 xmlHashCopier copy,
220*7c568831SAndroid Build Coastguard Worker 					 xmlHashDeallocator dealloc);
221*7c568831SAndroid Build Coastguard Worker XMLPUBFUN xmlHashTablePtr
222*7c568831SAndroid Build Coastguard Worker 		xmlHashCopy		(xmlHashTablePtr hash,
223*7c568831SAndroid Build Coastguard Worker 					 xmlHashCopier copy);
224*7c568831SAndroid Build Coastguard Worker XMLPUBFUN int
225*7c568831SAndroid Build Coastguard Worker 		xmlHashSize		(xmlHashTablePtr hash);
226*7c568831SAndroid Build Coastguard Worker XMLPUBFUN void
227*7c568831SAndroid Build Coastguard Worker 		xmlHashScan		(xmlHashTablePtr hash,
228*7c568831SAndroid Build Coastguard Worker 					 xmlHashScanner scan,
229*7c568831SAndroid Build Coastguard Worker 					 void *data);
230*7c568831SAndroid Build Coastguard Worker XMLPUBFUN void
231*7c568831SAndroid Build Coastguard Worker 		xmlHashScan3		(xmlHashTablePtr hash,
232*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name,
233*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name2,
234*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name3,
235*7c568831SAndroid Build Coastguard Worker 					 xmlHashScanner scan,
236*7c568831SAndroid Build Coastguard Worker 					 void *data);
237*7c568831SAndroid Build Coastguard Worker XMLPUBFUN void
238*7c568831SAndroid Build Coastguard Worker 		xmlHashScanFull		(xmlHashTablePtr hash,
239*7c568831SAndroid Build Coastguard Worker 					 xmlHashScannerFull scan,
240*7c568831SAndroid Build Coastguard Worker 					 void *data);
241*7c568831SAndroid Build Coastguard Worker XMLPUBFUN void
242*7c568831SAndroid Build Coastguard Worker 		xmlHashScanFull3	(xmlHashTablePtr hash,
243*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name,
244*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name2,
245*7c568831SAndroid Build Coastguard Worker 					 const xmlChar *name3,
246*7c568831SAndroid Build Coastguard Worker 					 xmlHashScannerFull scan,
247*7c568831SAndroid Build Coastguard Worker 					 void *data);
248*7c568831SAndroid Build Coastguard Worker #ifdef __cplusplus
249*7c568831SAndroid Build Coastguard Worker }
250*7c568831SAndroid Build Coastguard Worker #endif
251*7c568831SAndroid Build Coastguard Worker #endif /* ! __XML_HASH_H__ */
252