00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef AVL_INCLUDED
00011 #define AVL_INCLUDED
00012
00013
00014 typedef struct avl_node_struct avl_node;
00015 struct avl_node_struct {
00016 avl_node *left, *right;
00017 char *key;
00018 char *value;
00019 int height;
00020 };
00021
00022
00023 typedef struct avl_tree_struct avl_tree;
00024 struct avl_tree_struct {
00025 avl_node *root;
00026 int (*compar)(const void *, const void *);
00027 int num_entries;
00028 int modified;
00029 };
00030
00031
00032 typedef struct avl_generator_struct avl_generator;
00033 struct avl_generator_struct {
00034 avl_tree *tree;
00035 avl_node **nodelist;
00036 int count;
00037 };
00038
00039
00040 #define AVL_FORWARD 0
00041 #define AVL_BACKWARD 1
00042
00043
00044 EXTERN avl_tree *avl_init_table ARGS((int (*)(const void *, const void *)));
00045 EXTERN int avl_delete ARGS((avl_tree *, void *, void *));
00046 EXTERN int avl_insert ARGS((avl_tree *, void *, void *));
00047 EXTERN int avl_lookup ARGS((avl_tree *, const void *, void *));
00048 EXTERN int avl_first ARGS((avl_tree *, char **, char **));
00049 EXTERN int avl_last ARGS((avl_tree *, char **, char **));
00050 EXTERN int avl_find_or_add ARGS((avl_tree *, char *, char ***));
00051 EXTERN int avl_count ARGS((avl_tree *));
00052 EXTERN int avl_numcmp ARGS((const void *, const void *));
00053 EXTERN int avl_check_tree ARGS((avl_tree *tree));
00054 EXTERN int avl_gen ARGS((avl_generator *, char **, char **));
00055 EXTERN void avl_foreach ARGS((avl_tree *, void (*)(const void *, const void *), int));
00056 EXTERN void avl_free_table ARGS((avl_tree *, void (*)(char *), void (*)(char *)));
00057 EXTERN void avl_free_gen ARGS((avl_generator *));
00058 EXTERN avl_generator *avl_init_gen ARGS((avl_tree *, int));
00059
00060 #define avl_is_member(tree, key) avl_lookup(tree, key, (char **) 0)
00061
00062 #define avl_foreach_item(table, gen, dir, key_p, value_p) \
00063 for(gen = avl_init_gen(table, dir); \
00064 avl_gen(gen, key_p, value_p) || (avl_free_gen(gen),0);)
00065
00066 #endif