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