| /* @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 */ |
| |