home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Unix / CNews / Source / libc / hash.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-07  |  2.8 KB  |  139 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. int
  40. hashstore(tbl, key, data)
  41. HASHTABLE *tbl;
  42. register HASHDATUM key, data;
  43. {
  44.     register HDBMDATUM hdbmkey, hdbmdata;
  45.  
  46.     hdbmkey.dat_ptr = key;            /* actually a string */
  47.     hdbmkey.dat_len = strlen(key);
  48.     hdbmdata.dat_ptr = data;        /* just an address */
  49.     hdbmdata.dat_len = 0;            /* no promises */
  50.     return hdbmstore(tbl, hdbmkey, hdbmdata);
  51. }
  52.  
  53. static HASHDATUM (*hashalloc)();
  54.  
  55. static HDBMDATUM
  56. hdbmalloc(key)            /* hdbm->hash->hdbm allocator translator */
  57. HDBMDATUM key;
  58. {
  59.     register HDBMDATUM hdbmdata;
  60.  
  61.     hdbmdata.dat_ptr = (*hashalloc)(key.dat_ptr);
  62.     hdbmdata.dat_len = 0;            /* just a string */
  63.     return hdbmdata;
  64. }
  65.  
  66. /* return any existing entry for key; otherwise call allocator to make one */
  67. HASHDATUM
  68. hashentry(tbl, key, allocator)
  69. register HASHTABLE *tbl;
  70. HASHDATUM key;
  71. HASHDATUM (*allocator)();
  72. {
  73.     register HDBMDATUM hdbmkey, hdbmdata;
  74.  
  75.     hdbmkey.dat_ptr = key;            /* just a string */
  76.     hdbmkey.dat_len = strlen(key);
  77.     hashalloc = allocator;
  78.     hdbmdata = hdbmentry(tbl, hdbmkey, hdbmalloc);
  79.     return hdbmdata.dat_ptr;
  80. }
  81.  
  82. HASHDATUM                    /* data corresponding to key */
  83. hashfetch(tbl, key)
  84. HASHTABLE *tbl;
  85. register HASHDATUM key;
  86. {
  87.     register HDBMDATUM hdbmkey, hdbmdata;
  88.  
  89.     hdbmkey.dat_ptr = key;            /* actually a string */
  90.     hdbmkey.dat_len = strlen(key);
  91.     hdbmdata = hdbmfetch(tbl, hdbmkey);
  92.     return hdbmdata.dat_ptr;        /* just an address */
  93. }
  94.  
  95. int
  96. hashdelete(tbl, key)
  97. HASHTABLE *tbl;
  98. register HASHDATUM key;
  99. {
  100.     register HDBMDATUM hdbmkey;
  101.  
  102.     hdbmkey.dat_ptr = key;            /* actually a string */
  103.     hdbmkey.dat_len = strlen(key);
  104.     return hdbmdelete(tbl, hdbmkey);
  105. }
  106.  
  107. struct translate {
  108.     char *realhook;
  109.     int (*func)();
  110. };
  111.  
  112. static
  113. hdbmtohash(key, data, hook)
  114. HDBMDATUM key, data;
  115. char *hook;
  116. {
  117.     register struct translate *thp = (struct translate *)hook;
  118.  
  119.     (*thp->func)(key.dat_ptr, data.dat_ptr, thp->realhook);
  120. }
  121.  
  122. /*
  123.  * arrange that at each node, hdbmtohash gets called to map the
  124.  * HDBMDATUM arguments to HASHDATUM arguments.  this also demonstrates
  125.  * how to use the hook argument.
  126.  */
  127. hashwalk(tbl, nodefunc, hook)
  128. HASHTABLE *tbl;
  129. int (*nodefunc)();
  130. char *hook;                    /* (void *) really */
  131. {
  132.     struct translate transhook;
  133.     register struct translate *tp = &transhook;
  134.  
  135.     tp->realhook = hook;
  136.     tp->func = nodefunc;
  137.     hdbmwalk(tbl, hdbmtohash, (char *)tp);
  138. }
  139.