/* Copyright (C) 2000, 2001, 2002 Red Hat, Inc. Written by Ulrich Drepper <drepper@redhat.com>, 2000. This program is Open Source software; you can redistribute it and/or modify it under the terms of the Open Software License version 1.0 as published by the Open Source Initiative. You should have received a copy of the Open Software License along with this program; if not, you may obtain a copy of the Open Software License version 1.0 from http://www.opensource.org/licenses/osl.php or by writing the Open Source Initiative c/o Lawrence Rosen, Esq., 3001 King Ranch Road, Ukiah, CA 95482. */ #include <stddef.h> /* Before including this file the following macros must be defined: NAME name of the hash table structure. TYPE data type of the hash table entries The following macros if present select features: ITERATE iterating over the table entries is possible */ /* Optionally include an entry pointing to the first used entry. */ #ifdef ITERATE # define FIRST(name) name##_ent *first; # define NEXT(name) struct name##_ent *next; #else # define FIRST(name) # define NEXT(name) #endif /* Defined separately. */ extern size_t next_prime (size_t seed); /* Table entry type. */ #define _DYNHASHENTTYPE(name) \ typedef struct name##_ent \ { \ unsigned long int hashval; \ TYPE data; \ NEXT (name) \ } name##_ent #define DYNHASHENTTYPE(name) _DYNHASHENTTYPE (name) DYNHASHENTTYPE (NAME); /* Type of the dynamic hash table data structure. */ #define _DYNHASHTYPE(name) \ typedef struct \ { \ unsigned long int size; \ unsigned long int filled; \ name##_ent *table; \ FIRST (name) \ } name #define DYNHASHTYPE(name) _DYNHASHTYPE (name) DYNHASHTYPE (NAME); #define _FUNCTIONS(name) \ /* Initialize the hash table. */ \ extern int name##_init (name *htab, unsigned long int init_size); \ \ /* Free resources allocated for hash table. */ \ extern int name##_free (name *htab); \ \ /* Insert new entry. */ \ extern int name##_insert (name *htab, unsigned long int hval, TYPE data); \ \ /* Insert new entry, possibly overwrite old entry. */ \ extern int name##_overwrite (name *htab, unsigned long int hval, TYPE data); \ \ /* Find entry in hash table. */ \ extern TYPE name##_find (name *htab, unsigned long int hval, TYPE val); #define FUNCTIONS(name) _FUNCTIONS (name) FUNCTIONS (NAME) #ifdef ITERATE # define _XFUNCTIONS(name) \ /* Get next element in table. */ \ extern TYPE name##_iterate (name *htab, void **ptr); # define XFUNCTIONS(name) _XFUNCTIONS (name) XFUNCTIONS (NAME) #endif #ifndef NO_UNDEF # undef DYNHASHENTTYPE # undef DYNHASHTYPE # undef FUNCTIONS # undef _FUNCTIONS # undef XFUNCTIONS # undef _XFUNCTIONS # undef NAME # undef TYPE # undef ITERATE # undef COMPARE # undef FIRST # undef NEXT #endif