1 /*
2  * Summary: Chained hash tables
3  * Description: This module implements the hash table support used in
4  * 		various places in the library.
5  *
6  * Copy: See Copyright for the status of this software.
7  *
8  * Author: Bjorn Reese <bjorn.reese@systematic.dk>
9  */
10 
11 #ifndef __XML_HASH_H__
12 #define __XML_HASH_H__
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 /*
19  * The hash table.
20  */
21 typedef struct _xmlHashTable xmlHashTable;
22 typedef xmlHashTable *xmlHashTablePtr;
23 
24 #ifdef __cplusplus
25 }
26 #endif
27 
28 #include <libxml/xmlversion.h>
29 #include <libxml/parser.h>
30 #include <libxml/dict.h>
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 /*
37  * 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  *
51  * #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
54  */
55 
56 #define XML_CAST_FPTR(fptr) fptr
57 
58 
59 /*
60  * function types:
61  */
62 /**
63  * xmlHashDeallocator:
64  * @payload:  the data in the hash
65  * @name:  the name associated
66  *
67  * Callback to free data from a hash.
68  */
69 typedef void (*xmlHashDeallocator)(void *payload, xmlChar *name);
70 /**
71  * xmlHashCopier:
72  * @payload:  the data in the hash
73  * @name:  the name associated
74  *
75  * Callback to copy data from a hash.
76  *
77  * Returns a copy of the data or NULL in case of error.
78  */
79 typedef void *(*xmlHashCopier)(void *payload, xmlChar *name);
80 /**
81  * xmlHashScanner:
82  * @payload:  the data in the hash
83  * @data:  extra scannner data
84  * @name:  the name associated
85  *
86  * Callback when scanning data in a hash with the simple scanner.
87  */
88 typedef 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  *
97  * Callback when scanning data in a hash with the full scanner.
98  */
99 typedef void (*xmlHashScannerFull)(void *payload, void *data,
100 				   const xmlChar *name, const xmlChar *name2,
101 				   const xmlChar *name3);
102 
103 /*
104  * Constructor and destructor.
105  */
106 XMLPUBFUN xmlHashTablePtr XMLCALL
107 			xmlHashCreate	(int size);
108 XMLPUBFUN xmlHashTablePtr XMLCALL
109 			xmlHashCreateDict(int size,
110 					 xmlDictPtr dict);
111 XMLPUBFUN void XMLCALL
112 			xmlHashFree	(xmlHashTablePtr table,
113 					 xmlHashDeallocator f);
114 
115 /*
116  * Add a new entry to the hash table.
117  */
118 XMLPUBFUN int XMLCALL
119 			xmlHashAddEntry	(xmlHashTablePtr table,
120 		                         const xmlChar *name,
121 		                         void *userdata);
122 XMLPUBFUN int XMLCALL
123 			xmlHashUpdateEntry(xmlHashTablePtr table,
124 		                         const xmlChar *name,
125 		                         void *userdata,
126 					 xmlHashDeallocator f);
127 XMLPUBFUN int XMLCALL
128 			xmlHashAddEntry2(xmlHashTablePtr table,
129 		                         const xmlChar *name,
130 		                         const xmlChar *name2,
131 		                         void *userdata);
132 XMLPUBFUN int XMLCALL
133 			xmlHashUpdateEntry2(xmlHashTablePtr table,
134 		                         const xmlChar *name,
135 		                         const xmlChar *name2,
136 		                         void *userdata,
137 					 xmlHashDeallocator f);
138 XMLPUBFUN int XMLCALL
139 			xmlHashAddEntry3(xmlHashTablePtr table,
140 		                         const xmlChar *name,
141 		                         const xmlChar *name2,
142 		                         const xmlChar *name3,
143 		                         void *userdata);
144 XMLPUBFUN int XMLCALL
145 			xmlHashUpdateEntry3(xmlHashTablePtr table,
146 		                         const xmlChar *name,
147 		                         const xmlChar *name2,
148 		                         const xmlChar *name3,
149 		                         void *userdata,
150 					 xmlHashDeallocator f);
151 
152 /*
153  * Remove an entry from the hash table.
154  */
155 XMLPUBFUN int XMLCALL
156 			xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name,
157                            xmlHashDeallocator f);
158 XMLPUBFUN int XMLCALL
159 			xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name,
160                             const xmlChar *name2, xmlHashDeallocator f);
161 XMLPUBFUN int  XMLCALL
162 			xmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name,
163                             const xmlChar *name2, const xmlChar *name3,
164                             xmlHashDeallocator f);
165 
166 /*
167  * Retrieve the userdata.
168  */
169 XMLPUBFUN void * XMLCALL
170 			xmlHashLookup	(xmlHashTablePtr table,
171 					 const xmlChar *name);
172 XMLPUBFUN void * XMLCALL
173 			xmlHashLookup2	(xmlHashTablePtr table,
174 					 const xmlChar *name,
175 					 const xmlChar *name2);
176 XMLPUBFUN void * XMLCALL
177 			xmlHashLookup3	(xmlHashTablePtr table,
178 					 const xmlChar *name,
179 					 const xmlChar *name2,
180 					 const xmlChar *name3);
181 XMLPUBFUN void * XMLCALL
182 			xmlHashQLookup	(xmlHashTablePtr table,
183 					 const xmlChar *name,
184 					 const xmlChar *prefix);
185 XMLPUBFUN void * XMLCALL
186 			xmlHashQLookup2	(xmlHashTablePtr table,
187 					 const xmlChar *name,
188 					 const xmlChar *prefix,
189 					 const xmlChar *name2,
190 					 const xmlChar *prefix2);
191 XMLPUBFUN 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);
199 
200 /*
201  * Helpers.
202  */
203 XMLPUBFUN xmlHashTablePtr XMLCALL
204 			xmlHashCopy	(xmlHashTablePtr table,
205 					 xmlHashCopier f);
206 XMLPUBFUN int XMLCALL
207 			xmlHashSize	(xmlHashTablePtr table);
208 XMLPUBFUN void XMLCALL
209 			xmlHashScan	(xmlHashTablePtr table,
210 					 xmlHashScanner f,
211 					 void *data);
212 XMLPUBFUN void XMLCALL
213 			xmlHashScan3	(xmlHashTablePtr table,
214 					 const xmlChar *name,
215 					 const xmlChar *name2,
216 					 const xmlChar *name3,
217 					 xmlHashScanner f,
218 					 void *data);
219 XMLPUBFUN void XMLCALL
220 			xmlHashScanFull	(xmlHashTablePtr table,
221 					 xmlHashScannerFull f,
222 					 void *data);
223 XMLPUBFUN void XMLCALL
224 			xmlHashScanFull3(xmlHashTablePtr table,
225 					 const xmlChar *name,
226 					 const xmlChar *name2,
227 					 const xmlChar *name3,
228 					 xmlHashScannerFull f,
229 					 void *data);
230 #ifdef __cplusplus
231 }
232 #endif
233 #endif /* ! __XML_HASH_H__ */
234