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