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 #include <libxml/xmlversion.h> 15 #include <libxml/dict.h> 16 #include <libxml/xmlstring.h> 17 18 #ifdef __cplusplus 19 extern "C" { 20 #endif 21 22 /* 23 * The hash table. 24 */ 25 typedef struct _xmlHashTable xmlHashTable; 26 typedef xmlHashTable *xmlHashTablePtr; 27 28 /* 29 * Recent version of gcc produce a warning when a function pointer is assigned 30 * to an object pointer, or vice versa. The following macro is a dirty hack 31 * to allow suppression of the warning. If your architecture has function 32 * pointers which are a different size than a void pointer, there may be some 33 * serious trouble within the library. 34 */ 35 /** 36 * XML_CAST_FPTR: 37 * @fptr: pointer to a function 38 * 39 * Macro to do a casting from an object pointer to a 40 * function pointer without encountering a warning from 41 * gcc 42 * 43 * #define XML_CAST_FPTR(fptr) (*(void **)(&fptr)) 44 * This macro violated ISO C aliasing rules (gcc4 on s390 broke) 45 * so it is disabled now 46 */ 47 48 #define XML_CAST_FPTR(fptr) fptr 49 50 /* 51 * function types: 52 */ 53 /** 54 * xmlHashDeallocator: 55 * @payload: the data in the hash 56 * @name: the name associated 57 * 58 * Callback to free data from a hash. 59 */ 60 typedef void (*xmlHashDeallocator)(void *payload, const xmlChar *name); 61 /** 62 * xmlHashCopier: 63 * @payload: the data in the hash 64 * @name: the name associated 65 * 66 * Callback to copy data from a hash. 67 * 68 * Returns a copy of the data or NULL in case of error. 69 */ 70 typedef void *(*xmlHashCopier)(void *payload, const xmlChar *name); 71 /** 72 * xmlHashScanner: 73 * @payload: the data in the hash 74 * @data: extra scanner data 75 * @name: the name associated 76 * 77 * Callback when scanning data in a hash with the simple scanner. 78 */ 79 typedef void (*xmlHashScanner)(void *payload, void *data, const xmlChar *name); 80 /** 81 * xmlHashScannerFull: 82 * @payload: the data in the hash 83 * @data: extra scanner data 84 * @name: the name associated 85 * @name2: the second name associated 86 * @name3: the third name associated 87 * 88 * Callback when scanning data in a hash with the full scanner. 89 */ 90 typedef void (*xmlHashScannerFull)(void *payload, void *data, 91 const xmlChar *name, const xmlChar *name2, 92 const xmlChar *name3); 93 94 /* 95 * Constructor and destructor. 96 */ 97 XMLPUBFUN xmlHashTablePtr 98 xmlHashCreate (int size); 99 XMLPUBFUN xmlHashTablePtr 100 xmlHashCreateDict (int size, 101 xmlDictPtr dict); 102 XMLPUBFUN void 103 xmlHashFree (xmlHashTablePtr hash, 104 xmlHashDeallocator dealloc); 105 XMLPUBFUN void 106 xmlHashDefaultDeallocator(void *entry, 107 const xmlChar *name); 108 109 /* 110 * Add a new entry to the hash table. 111 */ 112 XMLPUBFUN int 113 xmlHashAddEntry (xmlHashTablePtr hash, 114 const xmlChar *name, 115 void *userdata); 116 XMLPUBFUN int 117 xmlHashUpdateEntry (xmlHashTablePtr hash, 118 const xmlChar *name, 119 void *userdata, 120 xmlHashDeallocator dealloc); 121 XMLPUBFUN int 122 xmlHashAddEntry2 (xmlHashTablePtr hash, 123 const xmlChar *name, 124 const xmlChar *name2, 125 void *userdata); 126 XMLPUBFUN int 127 xmlHashUpdateEntry2 (xmlHashTablePtr hash, 128 const xmlChar *name, 129 const xmlChar *name2, 130 void *userdata, 131 xmlHashDeallocator dealloc); 132 XMLPUBFUN int 133 xmlHashAddEntry3 (xmlHashTablePtr hash, 134 const xmlChar *name, 135 const xmlChar *name2, 136 const xmlChar *name3, 137 void *userdata); 138 XMLPUBFUN int 139 xmlHashUpdateEntry3 (xmlHashTablePtr hash, 140 const xmlChar *name, 141 const xmlChar *name2, 142 const xmlChar *name3, 143 void *userdata, 144 xmlHashDeallocator dealloc); 145 146 /* 147 * Remove an entry from the hash table. 148 */ 149 XMLPUBFUN int 150 xmlHashRemoveEntry (xmlHashTablePtr hash, 151 const xmlChar *name, 152 xmlHashDeallocator dealloc); 153 XMLPUBFUN int 154 xmlHashRemoveEntry2 (xmlHashTablePtr hash, 155 const xmlChar *name, 156 const xmlChar *name2, 157 xmlHashDeallocator dealloc); 158 XMLPUBFUN int 159 xmlHashRemoveEntry3 (xmlHashTablePtr hash, 160 const xmlChar *name, 161 const xmlChar *name2, 162 const xmlChar *name3, 163 xmlHashDeallocator dealloc); 164 165 /* 166 * Retrieve the payload. 167 */ 168 XMLPUBFUN void * 169 xmlHashLookup (xmlHashTablePtr hash, 170 const xmlChar *name); 171 XMLPUBFUN void * 172 xmlHashLookup2 (xmlHashTablePtr hash, 173 const xmlChar *name, 174 const xmlChar *name2); 175 XMLPUBFUN void * 176 xmlHashLookup3 (xmlHashTablePtr hash, 177 const xmlChar *name, 178 const xmlChar *name2, 179 const xmlChar *name3); 180 XMLPUBFUN void * 181 xmlHashQLookup (xmlHashTablePtr hash, 182 const xmlChar *prefix, 183 const xmlChar *name); 184 XMLPUBFUN void * 185 xmlHashQLookup2 (xmlHashTablePtr hash, 186 const xmlChar *prefix, 187 const xmlChar *name, 188 const xmlChar *prefix2, 189 const xmlChar *name2); 190 XMLPUBFUN void * 191 xmlHashQLookup3 (xmlHashTablePtr hash, 192 const xmlChar *prefix, 193 const xmlChar *name, 194 const xmlChar *prefix2, 195 const xmlChar *name2, 196 const xmlChar *prefix3, 197 const xmlChar *name3); 198 199 /* 200 * Helpers. 201 */ 202 XMLPUBFUN xmlHashTablePtr 203 xmlHashCopy (xmlHashTablePtr hash, 204 xmlHashCopier copy); 205 XMLPUBFUN int 206 xmlHashSize (xmlHashTablePtr hash); 207 XMLPUBFUN void 208 xmlHashScan (xmlHashTablePtr hash, 209 xmlHashScanner scan, 210 void *data); 211 XMLPUBFUN void 212 xmlHashScan3 (xmlHashTablePtr hash, 213 const xmlChar *name, 214 const xmlChar *name2, 215 const xmlChar *name3, 216 xmlHashScanner scan, 217 void *data); 218 XMLPUBFUN void 219 xmlHashScanFull (xmlHashTablePtr hash, 220 xmlHashScannerFull scan, 221 void *data); 222 XMLPUBFUN void 223 xmlHashScanFull3 (xmlHashTablePtr hash, 224 const xmlChar *name, 225 const xmlChar *name2, 226 const xmlChar *name3, 227 xmlHashScannerFull scan, 228 void *data); 229 #ifdef __cplusplus 230 } 231 #endif 232 #endif /* ! __XML_HASH_H__ */ 233