Home | History | Annotate | Download | only in libxml
      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 (at) 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