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, 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