/* @configure_input@ */

/*
**  Copyright 1998-2002 University of Illinois Board of Trustees
**  Copyright 1998-2002 Mark D. Roth
**  All rights reserved.
**
**  @LISTHASH_PREFIX@_listhash.h - header file for listhash module
**
**  Mark D. Roth <roth@uiuc.edu>
**  Campus Information Technologies and Educational Services
**  University of Illinois at Urbana-Champaign
*/

#ifndef @LISTHASH_PREFIX@_LISTHASH_H
#define @LISTHASH_PREFIX@_LISTHASH_H


/***** list.c **********************************************************/

/*
** Comparison function (used to determine order of elements in a list)
** returns less than, equal to, or greater than 0
** if data1 is less than, equal to, or greater than data2
*/
typedef int (*@LISTHASH_PREFIX@_cmpfunc_t)(void *, void *);

/*
** Free function (for freeing allocated memory in each element)
*/
typedef void (*@LISTHASH_PREFIX@_freefunc_t)(void *);

/*
** Plugin function for @LISTHASH_PREFIX@_list_iterate()
*/
typedef int (*@LISTHASH_PREFIX@_iterate_func_t)(void *, void *);

/*
** Matching function (used to find elements in a list)
** first argument is the data to search for
** second argument is the list element it's being compared to
** returns 0 if no match is found, non-zero otherwise
*/
typedef int (*@LISTHASH_PREFIX@_matchfunc_t)(void *, void *);


struct @LISTHASH_PREFIX@_node
{
  void *data;
  struct @LISTHASH_PREFIX@_node *next;
  struct @LISTHASH_PREFIX@_node *prev;
};
typedef struct @LISTHASH_PREFIX@_node *@LISTHASH_PREFIX@_listptr_t;

struct @LISTHASH_PREFIX@_list
{
  @LISTHASH_PREFIX@_listptr_t first;
  @LISTHASH_PREFIX@_listptr_t last;
  @LISTHASH_PREFIX@_cmpfunc_t cmpfunc;
  int flags;
  unsigned int nents;
};
typedef struct @LISTHASH_PREFIX@_list @LISTHASH_PREFIX@_list_t;


/* values for flags */
#define LIST_USERFUNC  0  /* use cmpfunc() to order */
#define LIST_STACK  1  /* new elements go in front */
#define LIST_QUEUE  2  /* new elements go at the end */


/* reset a list pointer */
void @LISTHASH_PREFIX@_listptr_reset(@LISTHASH_PREFIX@_listptr_t *);

/* retrieve the data being pointed to */
void *@LISTHASH_PREFIX@_listptr_data(@LISTHASH_PREFIX@_listptr_t *);

/* creates a new, empty list */
@LISTHASH_PREFIX@_list_t *@LISTHASH_PREFIX@_list_new(int, @LISTHASH_PREFIX@_cmpfunc_t);

/* call a function for every element in a list */
int @LISTHASH_PREFIX@_list_iterate(@LISTHASH_PREFIX@_list_t *,
           @LISTHASH_PREFIX@_iterate_func_t, void *);

/* empty the list */
void @LISTHASH_PREFIX@_list_empty(@LISTHASH_PREFIX@_list_t *,
          @LISTHASH_PREFIX@_freefunc_t);

/* remove and free() the entire list */
void @LISTHASH_PREFIX@_list_free(@LISTHASH_PREFIX@_list_t *,
         @LISTHASH_PREFIX@_freefunc_t);

/* add elements */
int @LISTHASH_PREFIX@_list_add(@LISTHASH_PREFIX@_list_t *, void *);

/* removes an element from the list - returns -1 on error */
void @LISTHASH_PREFIX@_list_del(@LISTHASH_PREFIX@_list_t *,
        @LISTHASH_PREFIX@_listptr_t *);

/* returns 1 when valid data is returned, or 0 at end of list */
int @LISTHASH_PREFIX@_list_next(@LISTHASH_PREFIX@_list_t *,
        @LISTHASH_PREFIX@_listptr_t *);

/* returns 1 when valid data is returned, or 0 at end of list */
int @LISTHASH_PREFIX@_list_prev(@LISTHASH_PREFIX@_list_t *,
        @LISTHASH_PREFIX@_listptr_t *);

/* return 1 if the data matches a list entry, 0 otherwise */
int @LISTHASH_PREFIX@_list_search(@LISTHASH_PREFIX@_list_t *,
          @LISTHASH_PREFIX@_listptr_t *, void *,
          @LISTHASH_PREFIX@_matchfunc_t);

/* return number of elements from list */
unsigned int @LISTHASH_PREFIX@_list_nents(@LISTHASH_PREFIX@_list_t *);

/* adds elements from a string delimited by delim */
int @LISTHASH_PREFIX@_list_add_str(@LISTHASH_PREFIX@_list_t *, char *, char *);

/* string matching function */
int @LISTHASH_PREFIX@_str_match(char *, char *);


/***** hash.c **********************************************************/

/*
** Hashing function (determines which bucket the given key hashes into)
** first argument is the key to hash
** second argument is the total number of buckets
** returns the bucket number
*/
typedef unsigned int (*@LISTHASH_PREFIX@_hashfunc_t)(void *, unsigned int);


struct @LISTHASH_PREFIX@_hashptr
{
  int bucket;
  @LISTHASH_PREFIX@_listptr_t node;
};
typedef struct @LISTHASH_PREFIX@_hashptr @LISTHASH_PREFIX@_hashptr_t;

struct @LISTHASH_PREFIX@_hash
{
  int numbuckets;
  @LISTHASH_PREFIX@_list_t **table;
  @LISTHASH_PREFIX@_hashfunc_t hashfunc;
  unsigned int nents;
};
typedef struct @LISTHASH_PREFIX@_hash @LISTHASH_PREFIX@_hash_t;


/* reset a hash pointer */
void @LISTHASH_PREFIX@_hashptr_reset(@LISTHASH_PREFIX@_hashptr_t *);

/* retrieve the data being pointed to */
void *@LISTHASH_PREFIX@_hashptr_data(@LISTHASH_PREFIX@_hashptr_t *);

/* default hash function, optimized for 7-bit strings */
unsigned int @LISTHASH_PREFIX@_str_hashfunc(char *, unsigned int);

/* return number of elements from hash */
unsigned int @LISTHASH_PREFIX@_hash_nents(@LISTHASH_PREFIX@_hash_t *);

/* create a new hash */
@LISTHASH_PREFIX@_hash_t *@LISTHASH_PREFIX@_hash_new(int, @LISTHASH_PREFIX@_hashfunc_t);

/* empty the hash */
void @LISTHASH_PREFIX@_hash_empty(@LISTHASH_PREFIX@_hash_t *,
          @LISTHASH_PREFIX@_freefunc_t);

/* delete all the @LISTHASH_PREFIX@_nodes of the hash and clean up */
void @LISTHASH_PREFIX@_hash_free(@LISTHASH_PREFIX@_hash_t *,
         @LISTHASH_PREFIX@_freefunc_t);

/* returns 1 when valid data is returned, or 0 at end of list */
int @LISTHASH_PREFIX@_hash_next(@LISTHASH_PREFIX@_hash_t *,
        @LISTHASH_PREFIX@_hashptr_t *);

/* return 1 if the data matches a list entry, 0 otherwise */
int @LISTHASH_PREFIX@_hash_search(@LISTHASH_PREFIX@_hash_t *,
          @LISTHASH_PREFIX@_hashptr_t *, void *,
          @LISTHASH_PREFIX@_matchfunc_t);

/* return 1 if the key matches a list entry, 0 otherwise */
int @LISTHASH_PREFIX@_hash_getkey(@LISTHASH_PREFIX@_hash_t *,
          @LISTHASH_PREFIX@_hashptr_t *, void *,
          @LISTHASH_PREFIX@_matchfunc_t);

/* inserting data */
int @LISTHASH_PREFIX@_hash_add(@LISTHASH_PREFIX@_hash_t *, void *);

/* delete an entry */
int @LISTHASH_PREFIX@_hash_del(@LISTHASH_PREFIX@_hash_t *,
             @LISTHASH_PREFIX@_hashptr_t *);

#endif /* ! @LISTHASH_PREFIX@_LISTHASH_H */

