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 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, const 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 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