mirror of https://github.com/YosysHQ/abc.git
167 lines
4.0 KiB
Plaintext
167 lines
4.0 KiB
Plaintext
/*
|
|
* 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.
|