Coverage Report

Created: 2024-08-27 12:19

/src/libxml2/include/libxml/hash.h
Line
Count
Source
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
169k
#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
107
      xmlHashCreate (int size);
108
XMLPUBFUN xmlHashTablePtr
109
      xmlHashCreateDict(int size,
110
           xmlDictPtr dict);
111
XMLPUBFUN void
112
      xmlHashFree (xmlHashTablePtr table,
113
           xmlHashDeallocator f);
114
XMLPUBFUN void
115
      xmlHashDefaultDeallocator(void *entry,
116
           const xmlChar *name);
117
118
/*
119
 * Add a new entry to the hash table.
120
 */
121
XMLPUBFUN int
122
      xmlHashAddEntry (xmlHashTablePtr table,
123
                             const xmlChar *name,
124
                             void *userdata);
125
XMLPUBFUN int
126
      xmlHashUpdateEntry(xmlHashTablePtr table,
127
                             const xmlChar *name,
128
                             void *userdata,
129
           xmlHashDeallocator f);
130
XMLPUBFUN int
131
      xmlHashAddEntry2(xmlHashTablePtr table,
132
                             const xmlChar *name,
133
                             const xmlChar *name2,
134
                             void *userdata);
135
XMLPUBFUN int
136
      xmlHashUpdateEntry2(xmlHashTablePtr table,
137
                             const xmlChar *name,
138
                             const xmlChar *name2,
139
                             void *userdata,
140
           xmlHashDeallocator f);
141
XMLPUBFUN int
142
      xmlHashAddEntry3(xmlHashTablePtr table,
143
                             const xmlChar *name,
144
                             const xmlChar *name2,
145
                             const xmlChar *name3,
146
                             void *userdata);
147
XMLPUBFUN int
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
159
      xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name,
160
                           xmlHashDeallocator f);
161
XMLPUBFUN int
162
      xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name,
163
                            const xmlChar *name2, xmlHashDeallocator f);
164
XMLPUBFUN int 
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 *
173
      xmlHashLookup (xmlHashTablePtr table,
174
           const xmlChar *name);
175
XMLPUBFUN void *
176
      xmlHashLookup2  (xmlHashTablePtr table,
177
           const xmlChar *name,
178
           const xmlChar *name2);
179
XMLPUBFUN void *
180
      xmlHashLookup3  (xmlHashTablePtr table,
181
           const xmlChar *name,
182
           const xmlChar *name2,
183
           const xmlChar *name3);
184
XMLPUBFUN void *
185
      xmlHashQLookup  (xmlHashTablePtr table,
186
           const xmlChar *name,
187
           const xmlChar *prefix);
188
XMLPUBFUN void *
189
      xmlHashQLookup2 (xmlHashTablePtr table,
190
           const xmlChar *name,
191
           const xmlChar *prefix,
192
           const xmlChar *name2,
193
           const xmlChar *prefix2);
194
XMLPUBFUN void *
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
207
      xmlHashCopy (xmlHashTablePtr table,
208
           xmlHashCopier f);
209
XMLPUBFUN int
210
      xmlHashSize (xmlHashTablePtr table);
211
XMLPUBFUN void
212
      xmlHashScan (xmlHashTablePtr table,
213
           xmlHashScanner f,
214
           void *data);
215
XMLPUBFUN void
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
223
      xmlHashScanFull (xmlHashTablePtr table,
224
           xmlHashScannerFull f,
225
           void *data);
226
XMLPUBFUN void
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__ */