blob: a9753b3ac69ddf9c888928f2a00e27a8f516bbfe [file] [log] [blame]
/*
* 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.