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, 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__ */ 234