home *** CD-ROM | disk | FTP | other *** search
/ Unix System Administration Handbook 1997 October / usah_oct97.iso / news / cnews.tar / libc / hash.c < prev    next >
C/C++ Source or Header  |  1993-03-09  |  3KB  |  143 lines

  1. /*
  2.  * general-purpose in-core hashing, normal interface (wrapper)
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include "hdbm.h"
  8. #include "hash.h"
  9. #include "hashint.h"
  10.  
  11. #ifdef notdef
  12. static unsigned                /* not yet taken modulus table size */
  13. hashdef(key)
  14. register HASHDATUM key;
  15. {
  16.     register unsigned hash = 0;
  17.     register char c;
  18.  
  19.     while ((c = *key++) != '\0')
  20.         hash += c;
  21.     return hash;
  22. }
  23. #endif
  24.  
  25. HASHTABLE *
  26. hashcreate(size, hashfunc)
  27. unsigned size;                /* a crude guide to size */
  28. unsigned (*hashfunc)();
  29. {
  30.     return hdbmcreate(size, hashfunc);
  31. }
  32.  
  33. hashdestroy(tbl)
  34. register HASHTABLE *tbl;
  35. {
  36.     hdbmdestroy(tbl);
  37. }
  38.  
  39. /*
  40.  * addresses key and data must point at unmoving data
  41.  * for the life of the table.
  42.  */
  43. int
  44. hashstore(tbl, key, data)
  45. HASHTABLE *tbl;
  46. register HASHDATUM key, data;
  47. {
  48.     register HDBMDATUM hdbmkey, hdbmdata;
  49.  
  50.     hdbmkey.dat_ptr = key;            /* actually a string */
  51.     hdbmkey.dat_len = strlen(key);
  52.     hdbmdata.dat_ptr = data;        /* just an address */
  53.     hdbmdata.dat_len = 0;            /* no promises */
  54.     return hdbmstore(tbl, hdbmkey, hdbmdata);
  55. }
  56.  
  57. static HASHDATUM (*hashalloc)();
  58.  
  59. static HDBMDATUM
  60. hdbmalloc(key)            /* hdbm->hash->hdbm allocator translator */
  61. HDBMDATUM key;
  62. {
  63.     register HDBMDATUM hdbmdata;
  64.  
  65.     hdbmdata.dat_ptr = (*hashalloc)(key.dat_ptr);
  66.     hdbmdata.dat_len = 0;            /* just a string */
  67.     return hdbmdata;
  68. }
  69.  
  70. /* return any existing entry for key; otherwise call allocator to make one */
  71. HASHDATUM
  72. hashentry(tbl, key, allocator)
  73. register HASHTABLE *tbl;
  74. HASHDATUM key;
  75. HASHDATUM (*allocator)();
  76. {
  77.     register HDBMDATUM hdbmkey, hdbmdata;
  78.  
  79.     hdbmkey.dat_ptr = key;            /* just a string */
  80.     hdbmkey.dat_len = strlen(key);
  81.     hashalloc = allocator;
  82.     hdbmdata = hdbmentry(tbl, hdbmkey, hdbmalloc);
  83.     return hdbmdata.dat_ptr;
  84. }
  85.  
  86. HASHDATUM                    /* data corresponding to key */
  87. hashfetch(tbl, key)
  88. HASHTABLE *tbl;
  89. register HASHDATUM key;
  90. {
  91.     register HDBMDATUM hdbmkey, hdbmdata;
  92.  
  93.     hdbmkey.dat_ptr = key;            /* actually a string */
  94.     hdbmkey.dat_len = strlen(key);
  95.     hdbmdata = hdbmfetch(tbl, hdbmkey);
  96.     return hdbmdata.dat_ptr;        /* just an address */
  97. }
  98.  
  99. int
  100. hashdelete(tbl, key)
  101. HASHTABLE *tbl;
  102. register HASHDATUM key;
  103. {
  104.     register HDBMDATUM hdbmkey;
  105.  
  106.     hdbmkey.dat_ptr = key;            /* actually a string */
  107.     hdbmkey.dat_len = strlen(key);
  108.     return hdbmdelete(tbl, hdbmkey);
  109. }
  110.  
  111. struct translate {
  112.     char *realhook;
  113.     int (*func)();
  114. };
  115.  
  116. static
  117. hdbmtohash(key, data, hook)
  118. HDBMDATUM key, data;
  119. char *hook;
  120. {
  121.     register struct translate *thp = (struct translate *)hook;
  122.  
  123.     (*thp->func)(key.dat_ptr, data.dat_ptr, thp->realhook);
  124. }
  125.  
  126. /*
  127.  * arrange that at each node, hdbmtohash gets called to map the
  128.  * HDBMDATUM arguments to HASHDATUM arguments.  this also demonstrates
  129.  * how to use the hook argument.
  130.  */
  131. hashwalk(tbl, nodefunc, hook)
  132. HASHTABLE *tbl;
  133. int (*nodefunc)();
  134. char *hook;                    /* (void *) really */
  135. {
  136.     struct translate transhook;
  137.     register struct translate *tp = &transhook;
  138.  
  139.     tp->realhook = hook;
  140.     tp->func = nodefunc;
  141.     hdbmwalk(tbl, hdbmtohash, (char *)tp);
  142. }
  143.