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