home *** CD-ROM | disk | FTP | other *** search
/ Serving the Web / ServingTheWeb1995.disc1of1.iso / linux / slacksrce / d / libc / libc-4.6 / libc-4 / libc-linux / misc / hsearch.c.old < prev    next >
Encoding:
Text File  |  1994-08-20  |  16.8 KB  |  375 lines

  1. /* Copyright (C) 1994 Free Software Foundation, Inc.
  2. This file is part of the GNU C Library.
  3.  
  4. The GNU C Library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Library General Public License as
  6. published by the Free Software Foundation; either version 2 of the
  7. License, or (at your option) any later version.
  8.  
  9. The GNU C Library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. Library General Public License for more details.
  13.  
  14. You should have received a copy of the GNU Library General Public
  15. License along with the GNU C Library; see the file COPYING.LIB.  If
  16. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  17. Cambridge, MA 02139, USA.  */
  18.  
  19. /*
  20. ################## Public Domain hsearch(3) ########################
  21.  
  22. -rw-r--r--  1 david       10324 Mar  6  1985 PD.hsearch.Z
  23.  
  24. This is a Public Domain re-implementation of the hsearch routines
  25. of the System V C library.  The hsearch routines provide the hashing
  26. and table management part of the code that one would use in (for
  27. instance) doing a symbol table.  Yet the routines do not place any
  28. constraint on the contents or shape of the entries in the table.
  29.  
  30. I have used these routines extensively in a toy compiler and found
  31. no bugs in a semesters' worth of use.  It isn't a complete
  32. implementation
  33. of the SysV routines, but it was enough for me.  There is a limitation
  34. of only one table -- but this limitation is also present in the
  35. SysV implementation.
  36.  
  37. Arnold Robbins
  38. School of Information and Computer Science
  39. Georgia Institute of Technology
  40. Atlanta, Georgia 30332
  41.  
  42. CSNET:  arnold@gatech
  43. ARPA:   arnold%gatech.csnet@csnet-relay.arpa
  44. UUCP:   { akgua, allegra, hplabs, ihnp4, seismo, ut-sally}!gatech!arnold
  45.  
  46. */
  47.  
  48. /* hsearch.c --- PD simple implementation of System V hsearch(3c) routine */
  49.  
  50. #include <ansidecl.h>
  51. #include <stdio.h>
  52. #include <search.h>
  53.  
  54. typedef struct element
  55. {
  56.     ENTRY    item;
  57.     struct element *next;
  58. } ELEMENT;
  59.  
  60. static ELEMENT **Table = NULL;    /* pointer to dynamicly allocated table */
  61. static int Num_elem = -1;    /* number of elements */
  62.  
  63. static int hashit __P ((char *__text));
  64.  
  65. /*
  66.  * table of first 1900 or so primes, for use in finding the right prime
  67.  * number to be the table size.  this table may be generally useful...
  68.  */
  69.  
  70. static unsigned short primetab[] = {
  71. /*
  72.  * comment these out, so that table will always have a minimal size...
  73. 1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
  74. */
  75. 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
  76. 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233,
  77. 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317,
  78. 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419,
  79. 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503,
  80. 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607,
  81. 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701,
  82. 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811,
  83. 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911,
  84. 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019,
  85. 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097,
  86. 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201,
  87. 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291,
  88. 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409,
  89. 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487,
  90. 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579,
  91. 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667,
  92. 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777,
  93. 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877,
  94. 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993,
  95. 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083,
  96. 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179,
  97. 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287,
  98. 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381,
  99. 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473,
  100. 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609,
  101. 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693,
  102. 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789,
  103. 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887,
  104. 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001,
  105. 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119,
  106. 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229,
  107. 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331,
  108. 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457,
  109. 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541,
  110. 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637,
  111. 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739,
  112. 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853,
  113. 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947,
  114. 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073,
  115. 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177,
  116. 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273,
  117. 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409,
  118. 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517,
  119. 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639,
  120. 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733,
  121. 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871,
  122. 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969,
  123. 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077,
  124. 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189,
  125. 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309,
  126. 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431,
  127. 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521,
  128. 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651,
  129. 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743,
  130. 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851,
  131. 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981,
  132. 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091,
  133. 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211,
  134. 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311,
  135. 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397,
  136. 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553,
  137. 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673,
  138. 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781,
  139. 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883,
  140. 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991,
  141. 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121,
  142. 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237,
  143. 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369,
  144. 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507,
  145. 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589,
  146. 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699,
  147. 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829,
  148. 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937,
  149. 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087,
  150. 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209,
  151. 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297,
  152. 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431,
  153. 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573,
  154. 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681,
  155. 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779,
  156. 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887,
  157. 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011,
  158. 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137,
  159. 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241,
  160. 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371,
  161. 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463,
  162. 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601,
  163. 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719,
  164. 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817,
  165. 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929,
  166. 9931, 9941, 9949, 9967, 9973, 10007, 10009, 10037, 10039, 10061, 10067, 10069,
  167. 10079, 10091, 10093, 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159,
  168. 10163, 10169, 10177, 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259,
  169. 10267, 10271, 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337,
  170. 10343, 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459,
  171. 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, 10589,
  172. 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, 10663, 10667,
  173. 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, 10753, 10771, 10781,
  174. 10789, 10799, 10831, 10837, 10847, 10853, 10859, 10861, 10867, 10883, 10889,
  175. 10891, 10903, 10909, 10937, 10939, 10949, 10957, 10973, 10979, 10987, 10993,
  176. 11003, 11027, 11047, 11057, 11059, 11069, 11071, 11083, 11087, 11093, 11113,
  177. 11117, 11119, 11131, 11149, 11159, 11161, 11171, 11173, 11177, 11197, 11213,
  178. 11239, 11243, 11251, 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317,
  179. 11321, 11329, 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437,
  180. 11443, 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527,
  181. 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, 11677,
  182. 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, 11779, 11783,
  183. 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, 11839, 11863, 11867,
  184. 11887, 11897, 11903, 11909, 11923, 11927, 11933, 11939, 11941, 11953, 11959,
  185. 11969, 11971, 11981, 11987, 12007, 12011, 12037, 12041, 12043, 12049, 12071,
  186. 12073, 12097, 12101, 12107, 12109, 12113, 12119, 12143, 12149, 12157, 12161,
  187. 12163, 12197, 12203, 12211, 12227, 12239, 12241, 12251, 12253, 12263, 12269,
  188. 12277, 12281, 12289, 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379,
  189. 12391, 12401, 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479,
  190. 12487, 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553,
  191. 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, 12647,
  192. 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, 12743, 12757,
  193. 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, 12841, 12853, 12889,
  194. 12893, 12899, 12907, 12911, 12917, 12919, 12923, 12941, 12953, 12959, 12967,
  195. 12973, 12979, 12983, 13001, 13003, 13007, 13009, 13033, 13037, 13043, 13049,
  196. 13063, 13093, 13099, 13103, 13109, 13121, 13127, 13147, 13151, 13159, 13163,
  197. 13171, 13177, 13183, 13187, 13217, 13219, 13229, 13241, 13249, 13259, 13267,
  198. 13291, 13297, 13309, 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397,
  199. 13399, 13411, 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487,
  200. 13499, 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619,
  201. 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, 13709,
  202. 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, 13789, 13799,
  203. 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, 13883, 13901, 13903,
  204. 13907, 13913, 13921, 13931, 13933, 13963, 13967, 13997, 13999, 14009, 14011,
  205. 14029, 14033, 14051, 14057, 14071, 14081, 14083, 14087, 14107, 14143, 14149,
  206. 14153, 14159, 14173, 14177, 14197, 14207, 14221, 14243, 14249, 14251, 14281,
  207. 14293, 14303, 14321, 14323, 14327, 14341, 14347, 14369, 14387, 14389, 14401,
  208. 14407, 14411, 14419, 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489,
  209. 14503, 14519, 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591,
  210. 14593, 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699,
  211. 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, 14771,
  212. 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, 14867, 14869,
  213. 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, 14951, 14957, 14969,
  214. 14983, 15013, 15017, 15031, 15053, 15061, 15073, 15077, 15083, 15091, 15101,
  215. 15107, 15121, 15131, 15137, 15139, 15149, 15161, 15173, 15187, 15193, 15199,
  216. 15217, 15227, 15233, 15241, 15259, 15263, 15269, 15271, 15277, 15287, 15289,
  217. 15299, 15307, 15313, 15319, 15329, 15331, 15349, 15359, 15361, 15373, 15377,
  218. 15383, 15391, 15401, 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473,
  219. 15493, 15497, 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601,
  220. 15607, 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679,
  221. 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, 15787,
  222. 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, 15887, 15889,
  223. 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, 15973, 15991, 16001,
  224. 16007, 16033, 16057, 16061, 16063, 16067, 16069, 16073, 16087, 16091, 16097,
  225. 16103, 16111, 16127, 16139, 16141, 16183, 16187, 16189, 16193, 16217, 16223,
  226. 16229, 16231, 16249, 16253, 16267, 16273, 16301, 16319, 16333, 16339, 16349,
  227. 16361, 16363, 16369, 16381
  228. };
  229.  
  230. /* hcreate --- create a hash table at least howmany big */
  231.  
  232. int
  233. DEFUN(hcreate, (howmany),
  234.     register unsigned int howmany)
  235. {
  236.     register int i, j;
  237.  
  238.     /*
  239.      * find first prime number >= howmany, and use it for table size
  240.      */
  241.  
  242.     if (Num_elem != -1)    /* already a table out there */
  243.         hdestroy();    /* remove it */
  244.  
  245.     j = sizeof (primetab) / sizeof (primetab[0]);
  246.     for (i = 0; i < j; i++)
  247.         if (primetab[i] >= howmany)
  248.             break;
  249.  
  250.     if (i >= j)    /* howmany bigger than any prime we have, use it */
  251.         Num_elem = howmany;
  252.     else
  253.         Num_elem = primetab[i];
  254.  
  255.     if ((Table = (ELEMENT **) calloc (Num_elem, sizeof (ELEMENT *))) == NULL)
  256.         return (0);
  257.     else
  258.         return (1);
  259. }
  260.  
  261. /* idestroy --- destroy a single element on a chain */
  262.  
  263. static void
  264. DEFUN(idestroy, (elem),
  265.     register ELEMENT *elem)
  266. {
  267.     if (elem != NULL)
  268.     {
  269.         idestroy (elem->next);
  270.         free ((char *) elem);
  271.     }
  272. }
  273.  
  274. /* hdestroy --- nuke the existing hash table */
  275. void
  276. DEFUN_VOID(hdestroy)
  277. {
  278.     register unsigned int i;
  279.  
  280.     if (Table != NULL)
  281.     {
  282.         /* free all the chains */
  283.         for (i = 0; i < Num_elem; i++)
  284.             idestroy (Table[i]);
  285.  
  286.         /* now the table itself */
  287.         free ((char *) Table);
  288.         Num_elem = -1;
  289.         Table = NULL;
  290.     }
  291. }
  292.  
  293. /* hsearch --- lookup or enter an item in the hash table */
  294.  
  295. ENTRY *
  296. DEFUN(hsearch, (entry, action),
  297.     register ENTRY entry AND register ACTION action)
  298. {
  299.     ELEMENT e;
  300.     ELEMENT *ep = NULL;
  301.     ELEMENT *ep2 = NULL;
  302.     int index;
  303.  
  304.     if (Table == NULL)
  305.         return (NULL);
  306.  
  307.     index = hashit (entry.key);
  308.     if (Table[index] == NULL)    /* nothing there */
  309.     {
  310.         if (action == FIND)
  311.             return (NULL);
  312.         else
  313.         {
  314.             /* add it to the table */
  315.             e.item = entry;
  316.             e.next = NULL;
  317.             if ((Table[index] = (ELEMENT *) calloc (1, sizeof (ELEMENT))) == NULL)
  318.                 return (NULL);
  319.             *Table[index] = e;
  320.             return (& Table[index]->item);
  321.         }
  322.     }
  323.     else
  324.     {
  325.         /* something in bucket, see if already on chain */
  326.         for (ep = Table[index]; ep != NULL; ep = ep->next)
  327.         {
  328.             if (strcmp (ep->item.key, entry.key) == 0)
  329.             {
  330.                 if (action == ENTER)
  331.                     ep->item.data = entry.data;
  332.                     /* already there, just change data */
  333.                 /* or action was just find it */
  334.                 return (& ep->item);
  335.             }
  336.             else
  337.                 ep2 = ep;
  338.         }
  339.         /* at this point, item was not in table */
  340.         /* ep2 points at last element on the list */
  341.         if (action == ENTER)
  342.         {
  343.             if ((ep2->next = (ELEMENT *) calloc (1, sizeof (ELEMENT))) == NULL)
  344.                 return (NULL);
  345.             ep2->next->item = entry;
  346.             ep2->next->next = NULL;
  347.             return (& ep2->next->item);
  348.         }
  349.         else
  350.             return (NULL);
  351.     }
  352.     /*NOTREACHED*/
  353. }
  354.  
  355. /* hashit --- do the hashing algorithm */
  356.  
  357. /*
  358.  * algorithm is sum of string elements, plus string length
  359.  * mod table size.
  360.  */
  361.  
  362. static int
  363. DEFUN(hashit, (text),
  364.     register char *text)
  365. {
  366.     register long int sum = 0;
  367.     register int i;
  368.  
  369.     for (i = 0; text[i] != '\0'; i++)
  370.         sum += text[i];
  371.     sum += i;
  372.  
  373.     return (sum % Num_elem);
  374. }
  375.