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 15extern "C" { 16#endif 17 18/* 19 * The hash table. 20 */ 21typedef struct _xmlHashTable xmlHashTable; 22typedef 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 33extern "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 */ 69typedef 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 */ 79typedef 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 */ 88typedef 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 */ 99typedef void (*xmlHashScannerFull)(void *payload, void *data, 100 const xmlChar *name, const xmlChar *name2, 101 const xmlChar *name3); 102 103/* 104 * Constructor and destructor. 105 */ 106XMLPUBFUN xmlHashTablePtr XMLCALL 107 xmlHashCreate (int size); 108XMLPUBFUN xmlHashTablePtr XMLCALL 109 xmlHashCreateDict(int size, 110 xmlDictPtr dict); 111XMLPUBFUN void XMLCALL 112 xmlHashFree (xmlHashTablePtr table, 113 xmlHashDeallocator f); 114XMLPUBFUN void XMLCALL 115 xmlHashDefaultDeallocator(void *entry, 116 const xmlChar *name); 117 118/* 119 * Add a new entry to the hash table. 120 */ 121XMLPUBFUN int XMLCALL 122 xmlHashAddEntry (xmlHashTablePtr table, 123 const xmlChar *name, 124 void *userdata); 125XMLPUBFUN int XMLCALL 126 xmlHashUpdateEntry(xmlHashTablePtr table, 127 const xmlChar *name, 128 void *userdata, 129 xmlHashDeallocator f); 130XMLPUBFUN int XMLCALL 131 xmlHashAddEntry2(xmlHashTablePtr table, 132 const xmlChar *name, 133 const xmlChar *name2, 134 void *userdata); 135XMLPUBFUN int XMLCALL 136 xmlHashUpdateEntry2(xmlHashTablePtr table, 137 const xmlChar *name, 138 const xmlChar *name2, 139 void *userdata, 140 xmlHashDeallocator f); 141XMLPUBFUN int XMLCALL 142 xmlHashAddEntry3(xmlHashTablePtr table, 143 const xmlChar *name, 144 const xmlChar *name2, 145 const xmlChar *name3, 146 void *userdata); 147XMLPUBFUN 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 */ 158XMLPUBFUN int XMLCALL 159 xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name, 160 xmlHashDeallocator f); 161XMLPUBFUN int XMLCALL 162 xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name, 163 const xmlChar *name2, xmlHashDeallocator f); 164XMLPUBFUN 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 */ 172XMLPUBFUN void * XMLCALL 173 xmlHashLookup (xmlHashTablePtr table, 174 const xmlChar *name); 175XMLPUBFUN void * XMLCALL 176 xmlHashLookup2 (xmlHashTablePtr table, 177 const xmlChar *name, 178 const xmlChar *name2); 179XMLPUBFUN void * XMLCALL 180 xmlHashLookup3 (xmlHashTablePtr table, 181 const xmlChar *name, 182 const xmlChar *name2, 183 const xmlChar *name3); 184XMLPUBFUN void * XMLCALL 185 xmlHashQLookup (xmlHashTablePtr table, 186 const xmlChar *name, 187 const xmlChar *prefix); 188XMLPUBFUN void * XMLCALL 189 xmlHashQLookup2 (xmlHashTablePtr table, 190 const xmlChar *name, 191 const xmlChar *prefix, 192 const xmlChar *name2, 193 const xmlChar *prefix2); 194XMLPUBFUN 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 */ 206XMLPUBFUN xmlHashTablePtr XMLCALL 207 xmlHashCopy (xmlHashTablePtr table, 208 xmlHashCopier f); 209XMLPUBFUN int XMLCALL 210 xmlHashSize (xmlHashTablePtr table); 211XMLPUBFUN void XMLCALL 212 xmlHashScan (xmlHashTablePtr table, 213 xmlHashScanner f, 214 void *data); 215XMLPUBFUN void XMLCALL 216 xmlHashScan3 (xmlHashTablePtr table, 217 const xmlChar *name, 218 const xmlChar *name2, 219 const xmlChar *name3, 220 xmlHashScanner f, 221 void *data); 222XMLPUBFUN void XMLCALL 223 xmlHashScanFull (xmlHashTablePtr table, 224 xmlHashScannerFull f, 225 void *data); 226XMLPUBFUN 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