• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, const 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, const xmlChar *name);
80 /**
81  * xmlHashScanner:
82  * @payload:  the data in the hash
83  * @data:  extra scanner 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, const xmlChar *name);
89 /**
90  * xmlHashScannerFull:
91  * @payload:  the data in the hash
92  * @data:  extra scanner 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 XMLPUBFUN void XMLCALL
115 			xmlHashDefaultDeallocator(void *entry,
116 					 const xmlChar *name);
117 
118 /*
119  * Add a new entry to the hash table.
120  */
121 XMLPUBFUN int XMLCALL
122 			xmlHashAddEntry	(xmlHashTablePtr table,
123 		                         const xmlChar *name,
124 		                         void *userdata);
125 XMLPUBFUN int XMLCALL
126 			xmlHashUpdateEntry(xmlHashTablePtr table,
127 		                         const xmlChar *name,
128 		                         void *userdata,
129 					 xmlHashDeallocator f);
130 XMLPUBFUN int XMLCALL
131 			xmlHashAddEntry2(xmlHashTablePtr table,
132 		                         const xmlChar *name,
133 		                         const xmlChar *name2,
134 		                         void *userdata);
135 XMLPUBFUN int XMLCALL
136 			xmlHashUpdateEntry2(xmlHashTablePtr table,
137 		                         const xmlChar *name,
138 		                         const xmlChar *name2,
139 		                         void *userdata,
140 					 xmlHashDeallocator f);
141 XMLPUBFUN int XMLCALL
142 			xmlHashAddEntry3(xmlHashTablePtr table,
143 		                         const xmlChar *name,
144 		                         const xmlChar *name2,
145 		                         const xmlChar *name3,
146 		                         void *userdata);
147 XMLPUBFUN int XMLCALL
148 			xmlHashUpdateEntry3(xmlHashTablePtr table,
149 		                         const xmlChar *name,
150 		                         const xmlChar *name2,
151 		                         const xmlChar *name3,
152 		                         void *userdata,
153 					 xmlHashDeallocator f);
154 
155 /*
156  * Remove an entry from the hash table.
157  */
158 XMLPUBFUN int XMLCALL
159 			xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name,
160                            xmlHashDeallocator f);
161 XMLPUBFUN int XMLCALL
162 			xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name,
163                             const xmlChar *name2, xmlHashDeallocator f);
164 XMLPUBFUN int  XMLCALL
165 			xmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name,
166                             const xmlChar *name2, const xmlChar *name3,
167                             xmlHashDeallocator f);
168 
169 /*
170  * Retrieve the userdata.
171  */
172 XMLPUBFUN void * XMLCALL
173 			xmlHashLookup	(xmlHashTablePtr table,
174 					 const xmlChar *name);
175 XMLPUBFUN void * XMLCALL
176 			xmlHashLookup2	(xmlHashTablePtr table,
177 					 const xmlChar *name,
178 					 const xmlChar *name2);
179 XMLPUBFUN void * XMLCALL
180 			xmlHashLookup3	(xmlHashTablePtr table,
181 					 const xmlChar *name,
182 					 const xmlChar *name2,
183 					 const xmlChar *name3);
184 XMLPUBFUN void * XMLCALL
185 			xmlHashQLookup	(xmlHashTablePtr table,
186 					 const xmlChar *name,
187 					 const xmlChar *prefix);
188 XMLPUBFUN void * XMLCALL
189 			xmlHashQLookup2	(xmlHashTablePtr table,
190 					 const xmlChar *name,
191 					 const xmlChar *prefix,
192 					 const xmlChar *name2,
193 					 const xmlChar *prefix2);
194 XMLPUBFUN void * XMLCALL
195 			xmlHashQLookup3	(xmlHashTablePtr table,
196 					 const xmlChar *name,
197 					 const xmlChar *prefix,
198 					 const xmlChar *name2,
199 					 const xmlChar *prefix2,
200 					 const xmlChar *name3,
201 					 const xmlChar *prefix3);
202 
203 /*
204  * Helpers.
205  */
206 XMLPUBFUN xmlHashTablePtr XMLCALL
207 			xmlHashCopy	(xmlHashTablePtr table,
208 					 xmlHashCopier f);
209 XMLPUBFUN int XMLCALL
210 			xmlHashSize	(xmlHashTablePtr table);
211 XMLPUBFUN void XMLCALL
212 			xmlHashScan	(xmlHashTablePtr table,
213 					 xmlHashScanner f,
214 					 void *data);
215 XMLPUBFUN void XMLCALL
216 			xmlHashScan3	(xmlHashTablePtr table,
217 					 const xmlChar *name,
218 					 const xmlChar *name2,
219 					 const xmlChar *name3,
220 					 xmlHashScanner f,
221 					 void *data);
222 XMLPUBFUN void XMLCALL
223 			xmlHashScanFull	(xmlHashTablePtr table,
224 					 xmlHashScannerFull f,
225 					 void *data);
226 XMLPUBFUN void XMLCALL
227 			xmlHashScanFull3(xmlHashTablePtr table,
228 					 const xmlChar *name,
229 					 const xmlChar *name2,
230 					 const xmlChar *name3,
231 					 xmlHashScannerFull f,
232 					 void *data);
233 #ifdef __cplusplus
234 }
235 #endif
236 #endif /* ! __XML_HASH_H__ */
237