home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / id-utils-3.2-src.tgz / tar.out / fsf / id-utils / libidu / hash.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  5KB  |  145 lines

  1. /* hash.h -- decls for hash table
  2.    Copyright (C) 1995 Free Software Foundation, Inc.
  3.    Written by Greg McGary <gkm@gnu.ai.mit.edu>
  4.  
  5.    This program is free software; you can redistribute it and/or modify
  6.    it under the terms of the GNU General Public License as published by
  7.    the Free Software Foundation; either version 2, or (at your option)
  8.    any later version.
  9.  
  10.    This program is distributed in the hope that it will be useful,
  11.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.    GNU General Public License for more details.
  14.  
  15.    You should have received a copy of the GNU General Public License
  16.    along with this program; if not, write to the Free Software
  17.    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
  18.  
  19. #ifndef _hash_h_
  20. #define _hash_h_
  21.  
  22. #include <stdio.h>
  23.  
  24. typedef unsigned long (*hash_func_t) __P((void const *key));
  25. typedef int (*hash_cmp_func_t) __P((void const *x, void const *y));
  26. typedef void (*hash_map_func_t) __P((void const *item));
  27.  
  28. struct hash_table
  29. {
  30.   void **ht_vec;
  31.   unsigned long ht_size;    /* total number of slots (power of 2) */
  32.   unsigned long ht_capacity;    /* usable slots, limited by loading-factor */
  33.   unsigned long ht_fill;    /* items in table */
  34.   unsigned long ht_collisions;    /* # of failed calls to comparison function */
  35.   unsigned long ht_lookups;    /* # of queries */
  36.   unsigned int ht_rehashes;    /* # of times we've expanded table */
  37.   hash_func_t ht_hash_1;    /* primary hash function */
  38.   hash_func_t ht_hash_2;    /* secondary hash function */
  39.   hash_cmp_func_t ht_compare;    /* comparison function */
  40. };
  41.  
  42. typedef int (*qsort_cmp_t) __P((void const *, void const *));
  43.  
  44. void hash_init __P((struct hash_table *ht, unsigned long size,
  45.             hash_func_t hash_1, hash_func_t hash_2, hash_cmp_func_t hash_cmp));
  46. void hash_load __P((struct hash_table *ht, void *item_table,
  47.             unsigned long cardinality, unsigned long size));
  48. void **hash_find_slot __P((struct hash_table *ht, void const *key));
  49. void *hash_find_item __P((struct hash_table *ht, void const *key));
  50. void *hash_insert __P((struct hash_table *ht, void *item));
  51. void *hash_insert_at __P((struct hash_table *ht, void *item, void const *slot));
  52. void *hash_delete __P((struct hash_table *ht, void const *item));
  53. void *hash_delete_at __P((struct hash_table *ht, void const *slot));
  54. void hash_delete_items __P((struct hash_table *ht));
  55. void hash_free_items __P((struct hash_table *ht));
  56. void hash_free __P((struct hash_table *ht, int free_items));
  57. void hash_map __P((struct hash_table *ht, hash_map_func_t map));
  58. void hash_print_stats __P((struct hash_table *ht, FILE *out_FILE));
  59. void **hash_dump __P((struct hash_table *ht, void **vector_0, qsort_cmp_t compare));
  60.  
  61. extern void *hash_deleted_item;
  62. #define HASH_VACANT(item) ((item) == 0 || (void *) (item) == hash_deleted_item)
  63.  
  64.  
  65. /* hash and comparison macros for string keys. */
  66.  
  67. #define STRING_HASH_1(_key_, _result_) { \
  68.   unsigned char const *kk = (unsigned char const *) (_key_) - 1; \
  69.   while (*++kk) \
  70.     (_result_) += (*kk << (kk[1] & 0xf)); \
  71. } while (0)
  72. #define return_STRING_HASH_1(_key_) do { \
  73.   unsigned long result = 0; \
  74.   STRING_HASH_1 ((_key_), result); \
  75.   return result; \
  76. } while (0)
  77.  
  78. #define STRING_HASH_2(_key_, _result_) do { \
  79.   unsigned char const *kk = (unsigned char const *) (_key_) - 1; \
  80.   while (*++kk) \
  81.     (_result_) += (*kk << (kk[1] & 0x7)); \
  82. } while (0)
  83. #define return_STRING_HASH_2(_key_) do { \
  84.   unsigned long result = 0; \
  85.   STRING_HASH_2 ((_key_), result); \
  86.   return result; \
  87. } while (0)
  88.  
  89. #define STRING_COMPARE(_x_, _y_, _result_) do { \
  90.   unsigned char const *xx = (unsigned char const *) (_x_) - 1; \
  91.   unsigned char const *yy = (unsigned char const *) (_y_) - 1; \
  92.   do { \
  93.     if (*++xx == '\0') { \
  94.       yy++; \
  95.       break; \
  96.     } \
  97.   } while (*xx == *++yy); \
  98.   (_result_) = *xx - *yy; \
  99. } while (0)
  100. #define return_STRING_COMPARE(_x_, _y_) do { \
  101.   int result; \
  102.   STRING_COMPARE (_x_, _y_, result); \
  103.   return result; \
  104. } while (0)
  105.  
  106. /* hash and comparison macros for integer keys. */
  107.  
  108. #define INTEGER_HASH_1(_key_, _result_) do { \
  109.   (_result_) += ((unsigned long)(_key_)); \
  110. } while (0)
  111. #define return_INTEGER_HASH_1(_key_) do { \
  112.   unsigned long result = 0; \
  113.   INTEGER_HASH_1 ((_key_), result); \
  114.   return result; \
  115. } while (0)
  116.  
  117. #define INTEGER_HASH_2(_key_, _result_) do { \
  118.   (_result_) += ~((unsigned long)(_key_)); \
  119. } while (0)
  120. #define return_INTEGER_HASH_2(_key_) do { \
  121.   unsigned long result = 0; \
  122.   INTEGER_HASH_2 ((_key_), result); \
  123.   return result; \
  124. } while (0)
  125.  
  126. #define INTEGER_COMPARE(_x_, _y_, _result_) do { \
  127.   (_result_) = _x_ - _y_; \
  128. } while (0)
  129. #define return_INTEGER_COMPARE(_x_, _y_) do { \
  130.   int result; \
  131.   INTEGER_COMPARE (_x_, _y_, result); \
  132.   return result; \
  133. } while (0)
  134.  
  135. /* hash and comparison macros for address keys. */
  136.  
  137. #define ADDRESS_HASH_1(_key_, _result_) INTEGER_HASH_1 (((unsigned long)(_key_)) >> 3, (_result_))
  138. #define ADDRESS_HASH_2(_key_, _result_) INTEGER_HASH_2 (((unsigned long)(_key_)) >> 3, (_result_))
  139. #define ADDRESS_COMPARE(_x_, _y_, _result_) INTEGER_COMPARE ((_x_), (_y_), (_result_))
  140. #define return_ADDRESS_HASH_1(_key_) return_INTEGER_HASH_1 (((unsigned long)(_key_)) >> 3)
  141. #define return_ADDRESS_HASH_2(_key_) return_INTEGER_HASH_2 (((unsigned long)(_key_)) >> 3)
  142. #define return_ADDRESS_COMPARE(_x_, _y_) return_INTEGER_COMPARE ((_x_), (_y_))
  143.  
  144. #endif /* not _hash_h_ */
  145.