125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Fixed size hash table with internal linking.
225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Copyright (C) 2000, 2001, 2002, 2004, 2005 Red Hat, Inc.
303333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   This file is part of elfutils.
425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Written by Ulrich Drepper <drepper@redhat.com>, 2000.
525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   This file is free software; you can redistribute it and/or modify
703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   it under the terms of either
825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
903333823c75a1c1887e923828113a1b0fd12020cElliott Hughes     * the GNU Lesser General Public License as published by the Free
1003333823c75a1c1887e923828113a1b0fd12020cElliott Hughes       Software Foundation; either version 3 of the License, or (at
1103333823c75a1c1887e923828113a1b0fd12020cElliott Hughes       your option) any later version
1203333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
1303333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   or
1403333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
1503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes     * the GNU General Public License as published by the Free
1603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes       Software Foundation; either version 2 of the License, or (at
1703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes       your option) any later version
1803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
1903333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   or both in parallel, as here.
2003333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
2103333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   elfutils is distributed in the hope that it will be useful, but
2225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
2325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
2425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   General Public License for more details.
2525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
2603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   You should have received copies of the GNU General Public License and
2703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   the GNU Lesser General Public License along with this program.  If
2803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   not, see <http://www.gnu.org/licenses/>.  */
2925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <errno.h>
3125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <stdlib.h>
3225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <string.h>
3325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <sys/cdefs.h>
3425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <sys/param.h>
3525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <system.h>
3725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define CONCAT(t1,t2) __CONCAT (t1,t2)
3925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
4025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Before including this file the following macros must be defined:
4125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
4225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   TYPE           data type of the hash table entries
4325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   HASHFCT        name of the hashing function to use
4425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   HASHTYPE       type used for the hashing value
4525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   COMPARE        comparison function taking two pointers to TYPE objects
4625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   CLASS          can be defined to `static' to avoid exporting the functions
4725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   PREFIX         prefix to be used for function and data type names
4825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   STORE_POINTER  if defined the table stores a pointer and not an element
4925b3c049e70834cf33790a28643ab058b507b35cBen Cheng                  of type TYPE
5025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   INSERT_HASH    if defined alternate insert function which takes a hash
5125b3c049e70834cf33790a28643ab058b507b35cBen Cheng                  value is defined
5225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   NO_FINI_FCT    if defined the fini function is not defined
5325b3c049e70834cf33790a28643ab058b507b35cBen Cheng*/
5425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Defined separately.  */
5725b3c049e70834cf33790a28643ab058b507b35cBen Chengextern size_t next_prime (size_t seed);
5825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6025b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Set default values.  */
6125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifndef HASHTYPE
6225b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define HASHTYPE size_t
6325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
6425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifndef CLASS
6625b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define CLASS
6725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
6825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifndef PREFIX
7025b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define PREFIX
7125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
7225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
7325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
7425b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* The data structure.  */
7525b3c049e70834cf33790a28643ab058b507b35cBen Chengstruct CONCAT(PREFIX,fshash)
7625b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
7725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  size_t nslots;
7825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  struct CONCAT(PREFIX,fshashent)
7925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  {
8025b3c049e70834cf33790a28643ab058b507b35cBen Cheng    HASHTYPE hval;
8125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef STORE_POINTER
8225b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define ENTRYP(el) (el).entry
8325b3c049e70834cf33790a28643ab058b507b35cBen Cheng    TYPE *entry;
8425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#else
8525b3c049e70834cf33790a28643ab058b507b35cBen Cheng# define ENTRYP(el) &(el).entry
8625b3c049e70834cf33790a28643ab058b507b35cBen Cheng    TYPE entry;
8725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
8825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  } table[0];
8925b3c049e70834cf33790a28643ab058b507b35cBen Cheng};
9025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
9125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
9225b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Constructor for the hashing table.  */
9325b3c049e70834cf33790a28643ab058b507b35cBen ChengCLASS struct CONCAT(PREFIX,fshash) *
9425b3c049e70834cf33790a28643ab058b507b35cBen ChengCONCAT(PREFIX,fshash_init) (size_t nelems)
9525b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
9625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  struct CONCAT(PREFIX,fshash) *result;
9725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* We choose a size for the hashing table 150% over the number of
9825b3c049e70834cf33790a28643ab058b507b35cBen Cheng     entries.  This will guarantee short medium search lengths.  */
9925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  const size_t max_size_t = ~((size_t) 0);
10025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
10125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  if (nelems >= (max_size_t / 3) * 2)
10225b3c049e70834cf33790a28643ab058b507b35cBen Cheng    {
10325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      errno = EINVAL;
10425b3c049e70834cf33790a28643ab058b507b35cBen Cheng      return NULL;
10525b3c049e70834cf33790a28643ab058b507b35cBen Cheng    }
10625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
10725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* Adjust the size to be used for the hashing table.  */
10825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  nelems = next_prime (MAX ((nelems * 3) / 2, 10));
10925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
11025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* Allocate the data structure for the result.  */
11125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  result = (struct CONCAT(PREFIX,fshash) *)
11225b3c049e70834cf33790a28643ab058b507b35cBen Cheng    xcalloc (sizeof (struct CONCAT(PREFIX,fshash))
11325b3c049e70834cf33790a28643ab058b507b35cBen Cheng	     + (nelems + 1) * sizeof (struct CONCAT(PREFIX,fshashent)), 1);
11425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  if (result == NULL)
11525b3c049e70834cf33790a28643ab058b507b35cBen Cheng    return NULL;
11625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
11725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  result->nslots = nelems;
11825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
11925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  return result;
12025b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
12125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
12225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
12325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifndef NO_FINI_FCT
12425b3c049e70834cf33790a28643ab058b507b35cBen ChengCLASS void
12525b3c049e70834cf33790a28643ab058b507b35cBen ChengCONCAT(PREFIX,fshash_fini) (struct CONCAT(PREFIX,fshash) *htab)
12625b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
12725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  free (htab);
12825b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
12925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
13025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
13125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
13225b3c049e70834cf33790a28643ab058b507b35cBen Chengstatic struct CONCAT(PREFIX,fshashent) *
13325b3c049e70834cf33790a28643ab058b507b35cBen ChengCONCAT(PREFIX,fshash_lookup) (struct CONCAT(PREFIX,fshash) *htab,
13425b3c049e70834cf33790a28643ab058b507b35cBen Cheng			      HASHTYPE hval, TYPE *data)
13525b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
13625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  size_t idx = 1 + hval % htab->nslots;
13725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
13825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  if (htab->table[idx].hval != 0)
13925b3c049e70834cf33790a28643ab058b507b35cBen Cheng    {
14025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      HASHTYPE hash;
14125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
14225b3c049e70834cf33790a28643ab058b507b35cBen Cheng      /* See whether this is the same entry.  */
14325b3c049e70834cf33790a28643ab058b507b35cBen Cheng      if (htab->table[idx].hval == hval
14425b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  && COMPARE (data, ENTRYP (htab->table[idx])) == 0)
14525b3c049e70834cf33790a28643ab058b507b35cBen Cheng	return &htab->table[idx];
14625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
14725b3c049e70834cf33790a28643ab058b507b35cBen Cheng      /* Second hash function as suggested in [Knuth].  */
14825b3c049e70834cf33790a28643ab058b507b35cBen Cheng      hash = 1 + hval % (htab->nslots - 2);
14925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
15025b3c049e70834cf33790a28643ab058b507b35cBen Cheng      do
15125b3c049e70834cf33790a28643ab058b507b35cBen Cheng	{
15225b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  if (idx <= hash)
15325b3c049e70834cf33790a28643ab058b507b35cBen Cheng	    idx = htab->nslots + idx - hash;
15425b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  else
15525b3c049e70834cf33790a28643ab058b507b35cBen Cheng	    idx -= hash;
15625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
15725b3c049e70834cf33790a28643ab058b507b35cBen Cheng	  if (htab->table[idx].hval == hval
15825b3c049e70834cf33790a28643ab058b507b35cBen Cheng	      && COMPARE (data, ENTRYP(htab->table[idx])) == 0)
15925b3c049e70834cf33790a28643ab058b507b35cBen Cheng	    return &htab->table[idx];
16025b3c049e70834cf33790a28643ab058b507b35cBen Cheng	}
16125b3c049e70834cf33790a28643ab058b507b35cBen Cheng      while (htab->table[idx].hval != 0);
16225b3c049e70834cf33790a28643ab058b507b35cBen Cheng    }
16325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
16425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  return &htab->table[idx];
16525b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
16625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
16725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
16825b3c049e70834cf33790a28643ab058b507b35cBen ChengCLASS int
16925b3c049e70834cf33790a28643ab058b507b35cBen Cheng__attribute__ ((unused))
17025b3c049e70834cf33790a28643ab058b507b35cBen ChengCONCAT(PREFIX,fshash_insert) (struct CONCAT(PREFIX,fshash) *htab,
17125b3c049e70834cf33790a28643ab058b507b35cBen Cheng			      const char *str,
17225b3c049e70834cf33790a28643ab058b507b35cBen Cheng			      size_t len __attribute__ ((unused)), TYPE *data)
17325b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
17425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  HASHTYPE hval = HASHFCT (str, len ?: strlen (str));
17525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  struct CONCAT(PREFIX,fshashent) *slot;
17625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
17725b3c049e70834cf33790a28643ab058b507b35cBen Cheng  slot = CONCAT(PREFIX,fshash_lookup) (htab, hval, data);
17825b3c049e70834cf33790a28643ab058b507b35cBen Cheng if (slot->hval != 0)
17925b3c049e70834cf33790a28643ab058b507b35cBen Cheng    /* We don't want to overwrite the old value.  */
18025b3c049e70834cf33790a28643ab058b507b35cBen Cheng    return -1;
18125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
18225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  slot->hval = hval;
18325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef STORE_POINTER
18425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  slot->entry = data;
18525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#else
18625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  slot->entry = *data;
18725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
18825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
18925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  return 0;
19025b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
19125b3c049e70834cf33790a28643ab058b507b35cBen Cheng
19225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
19325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef INSERT_HASH
19425b3c049e70834cf33790a28643ab058b507b35cBen ChengCLASS int
19525b3c049e70834cf33790a28643ab058b507b35cBen Cheng__attribute__ ((unused))
19625b3c049e70834cf33790a28643ab058b507b35cBen ChengCONCAT(PREFIX,fshash_insert_hash) (struct CONCAT(PREFIX,fshash) *htab,
19725b3c049e70834cf33790a28643ab058b507b35cBen Cheng				   HASHTYPE hval, TYPE *data)
19825b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
19925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  struct CONCAT(PREFIX,fshashent) *slot;
20025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
20125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  slot = CONCAT(PREFIX,fshash_lookup) (htab, hval, data);
20225b3c049e70834cf33790a28643ab058b507b35cBen Cheng  if (slot->hval != 0)
20325b3c049e70834cf33790a28643ab058b507b35cBen Cheng    /* We don't want to overwrite the old value.  */
20425b3c049e70834cf33790a28643ab058b507b35cBen Cheng    return -1;
20525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
20625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  slot->hval = hval;
20725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef STORE_POINTER
20825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  slot->entry = data;
20925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#else
21025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  slot->entry = *data;
21125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
21225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
21325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  return 0;
21425b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
21525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
21625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
21725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
21825b3c049e70834cf33790a28643ab058b507b35cBen ChengCLASS int
21925b3c049e70834cf33790a28643ab058b507b35cBen Cheng__attribute__ ((unused))
22025b3c049e70834cf33790a28643ab058b507b35cBen ChengCONCAT(PREFIX,fshash_overwrite) (struct CONCAT(PREFIX,fshash) *htab,
22125b3c049e70834cf33790a28643ab058b507b35cBen Cheng				 const char *str,
22225b3c049e70834cf33790a28643ab058b507b35cBen Cheng				 size_t len __attribute__ ((unused)),
22325b3c049e70834cf33790a28643ab058b507b35cBen Cheng				 TYPE *data)
22425b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
22525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  HASHTYPE hval = HASHFCT (str, len ?: strlen (str));
22625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  struct CONCAT(PREFIX,fshashent) *slot;
22725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
22825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  slot = CONCAT(PREFIX,fshash_lookup) (htab, hval, data);
22925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  slot->hval = hval;
23025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifdef STORE_POINTER
23125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  slot->entry = data;
23225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#else
23325b3c049e70834cf33790a28643ab058b507b35cBen Cheng  slot->entry = *data;
23425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif
23525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
23625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  return 0;
23725b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
23825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
23925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
24025b3c049e70834cf33790a28643ab058b507b35cBen ChengCLASS const TYPE *
24125b3c049e70834cf33790a28643ab058b507b35cBen ChengCONCAT(PREFIX,fshash_find) (const struct CONCAT(PREFIX,fshash) *htab,
24225b3c049e70834cf33790a28643ab058b507b35cBen Cheng			    const char *str,
24325b3c049e70834cf33790a28643ab058b507b35cBen Cheng			    size_t len __attribute__ ((unused)), TYPE *data)
24425b3c049e70834cf33790a28643ab058b507b35cBen Cheng{
24525b3c049e70834cf33790a28643ab058b507b35cBen Cheng  HASHTYPE hval = HASHFCT (str, len ?: strlen (str));
24625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  struct CONCAT(PREFIX,fshashent) *slot;
24725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
24825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  slot = CONCAT(PREFIX,fshash_lookup) ((struct CONCAT(PREFIX,fshash) *) htab,
24925b3c049e70834cf33790a28643ab058b507b35cBen Cheng				       hval, data);
25025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  if (slot->hval == 0)
25125b3c049e70834cf33790a28643ab058b507b35cBen Cheng    /* Not found.  */
25225b3c049e70834cf33790a28643ab058b507b35cBen Cheng    return NULL;
25325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
25425b3c049e70834cf33790a28643ab058b507b35cBen Cheng  return ENTRYP(*slot);
25525b3c049e70834cf33790a28643ab058b507b35cBen Cheng}
25625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
25725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
25825b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Unset the macros we expect.  */
25925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#undef TYPE
26025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#undef HASHFCT
26125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#undef HASHTYPE
26225b3c049e70834cf33790a28643ab058b507b35cBen Cheng#undef COMPARE
26325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#undef CLASS
26425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#undef PREFIX
26525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#undef INSERT_HASH
26625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#undef STORE_POINTER
26725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#undef NO_FINI_FCT
268