1/* Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
2   Written by Ulrich Drepper <drepper@redhat.com>, 2000.
3
4   This program is Open Source software; you can redistribute it and/or
5   modify it under the terms of the Open Software License version 1.0 as
6   published by the Open Source Initiative.
7
8   You should have received a copy of the Open Software License along
9   with this program; if not, you may obtain a copy of the Open Software
10   License version 1.0 from http://www.opensource.org/licenses/osl.php or
11   by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
12   3001 King Ranch Road, Ukiah, CA 95482.   */
13
14#include <stddef.h>
15
16/* Before including this file the following macros must be defined:
17
18   NAME      name of the hash table structure.
19   TYPE      data type of the hash table entries
20
21   The following macros if present select features:
22
23   ITERATE   iterating over the table entries is possible
24 */
25
26
27/* Optionally include an entry pointing to the first used entry.  */
28#ifdef ITERATE
29# define FIRST(name)	name##_ent *first;
30# define NEXT(name)	struct name##_ent *next;
31#else
32# define FIRST(name)
33# define NEXT(name)
34#endif
35
36
37/* Defined separately.  */
38extern size_t next_prime (size_t seed);
39
40
41/* Table entry type.  */
42#define _DYNHASHENTTYPE(name) \
43  typedef struct name##_ent						      \
44  {									      \
45    unsigned long int hashval;						      \
46    TYPE data;								      \
47    NEXT (name)								      \
48  } name##_ent
49#define DYNHASHENTTYPE(name) _DYNHASHENTTYPE (name)
50DYNHASHENTTYPE (NAME);
51
52
53/* Type of the dynamic hash table data structure.  */
54#define _DYNHASHTYPE(name) \
55typedef struct								      \
56{									      \
57  unsigned long int size;						      \
58  unsigned long int filled;						      \
59  name##_ent *table;							      \
60  FIRST	(name)								      \
61} name
62#define DYNHASHTYPE(name) _DYNHASHTYPE (name)
63DYNHASHTYPE (NAME);
64
65
66
67#define _FUNCTIONS(name) \
68/* Initialize the hash table.  */					      \
69extern int name##_init (name *htab, unsigned long int init_size);	      \
70									      \
71/* Free resources allocated for hash table.  */				      \
72extern int name##_free (name *htab);					      \
73									      \
74/* Insert new entry.  */						      \
75extern int name##_insert (name *htab, unsigned long int hval, TYPE data);     \
76									      \
77/* Insert new entry, possibly overwrite old entry.  */			      \
78extern int name##_overwrite (name *htab, unsigned long int hval, TYPE data);  \
79									      \
80/* Find entry in hash table.  */					      \
81extern TYPE name##_find (name *htab, unsigned long int hval, TYPE val);
82#define FUNCTIONS(name) _FUNCTIONS (name)
83FUNCTIONS (NAME)
84
85
86#ifdef ITERATE
87# define _XFUNCTIONS(name) \
88/* Get next element in table.  */					      \
89extern TYPE name##_iterate (name *htab, void **ptr);
90# define XFUNCTIONS(name) _XFUNCTIONS (name)
91XFUNCTIONS (NAME)
92#endif
93
94#ifndef NO_UNDEF
95# undef DYNHASHENTTYPE
96# undef DYNHASHTYPE
97# undef FUNCTIONS
98# undef _FUNCTIONS
99# undef XFUNCTIONS
100# undef _XFUNCTIONS
101# undef NAME
102# undef TYPE
103# undef ITERATE
104# undef COMPARE
105# undef FIRST
106# undef NEXT
107#endif
108