/*
 * Revision Control Information
 *
 * /projects/hsis/CVS/utilities/avl/avl.doc,v
 * rajeev
 * 1.3
 * 1995/08/08 22:36:22
 *
 */
avl_tree *
avl_init_table(compare)
int (*compare)();
	Initialize and return a new avl_tree.  Use the function `compare' to
	compare items in the tree.  `compare' should be of the form:

		int
		compare(a,b)
		char *a, *b;

	and return a number < 0, == 0, > 0 depending on whether a < b,
	a == b, or a > b, respectively.


void
avl_free_table(tree, key_delete_func, value_delete_func)
avl_tree *tree;
void (*key_delete_func)();
void (*value_delete_func)();

	Delete all storage associated with `tree'.  The functions 
	key_delete_func and value_delete_func, if non-null, are called
	to free each (key, value) pair.  They are declared as:

		void
		key_delete_func(key)
		char *key;
		{}

		void
		value_delete_func(value)
		char *value;
		{}

	The C-library function free is often suitable as a free function.


avl_first(tree, key_p, value_p)
avl_tree *tree;
char **key_p;
char **value_p;
	Retrieves the smallest element in the tree.  Returns 0 if there
	are no elements in the tree.


avl_last(tree, key_p, value_p)
avl_tree *tree;
char **key_p;
char **value_p;
	Retrieves the largest element in the tree.  Returns 0 if there
	are no elements in the tree.


avl_lookup(tree, key, value_p)
avl_tree *tree;
char *key;
char **value_p;
	Search for an entry matching `key'.  If found, set `value_p' to
	the associated value field and return 1.  If not found, return
	0 and leave `value_p' unchanged.


avl_insert(tree, key, value);
avl_tree *tree;
char *key;
char *value;
	Insert the value `value' under the key `key'.  Multiple items
	are allowed with the same value; all are inserted.


avl_delete(tree, key_p, value_p)
avl_tree *tree;
char **key_p;
char **value_p;
	Search for the item with key `*key_p' in `tree'.  If found, set
	`key_p' and `value_p' to point to the key and value of item,
	delete the item and return 1.  Otherwise return 0 and leave
	`key_p' and `value_p' unchanged.  WARNING: This interface is
	buggy; in particular, if identical keys are in the table, it is
	not possible to delete a particular (key, value) pair.  This
	will be fixed either with 'handles' or a separate delete
	function.


avl_find_or_add(tree, key, slot_p)
avl_tree *tree;
char *key;
char ***slot_p;
	Search for an entry matching key; if not found, insert key and
	return the address of the value slot for this entry.  If found,
	do not insert key, and return the address of the value slot for
	the existing entry.  slot_p can be used to associate a value with
	the key.


void
avl_foreach(tree, func, direction)
avl_tree *tree;
int (*func)();
int direction;

	Apply `func' to each item in the tree `tree' in turn.  If
	direction is AVL_FORWARD, the tree is traversed from smallest
	to largest. Otherwise it is traversed from largest to smallest.

	func should be of the form:

	     void 
	     func(key, value)
	     char *key;
	     char *value;

	where `key' is the key the item was stored under, and `value'
	the value of the item.


avl_count(tree)
avl_tree *tree;
	Returns the number of entries in the avl tree.


avl_generator *
avl_init_gen(tree, direction)
avl_tree *tree;
int direction;
	Start up a generator on an avl-tree.  direction is either 
	AVL_FORWARD or AVL_BACKWARD indicating the direction of
	generation.


avl_gen(gen, key_p, value_p)
avl_generator *gen;
char **key_p;
char **value_p;
	Generate the next item from the avl-tree.  Returns 0 if there
	are no more items in the tree.  Deletion of last generated item
	(via avl_delete) is supported.  Insertion of items during
	generation will result in these items never being generated
	(until the next avl_init_gen()).  Excercise for the interested
	student: how does one write an avl generator ? 


void
avl_free_gen(gen)
avl_generator *gen;
	Free a generator.


avl_foreach_item(tree, gen, direction, key_p, value_p)
avl_tree *tree;
avl_generator *gen;
int direction;
char **key_p;
char **value_p;
	Generate over all items in an avl-tree.  This macro iterator
	combines avl_init_gen(), avl_gen(), and avl_free_gen() into
	a single statement iterator.