00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef lint
00037 static const char libbu_rb_free_RCSid[] = "@(#) $Header: /cvsroot/brlcad/brlcad/src/libbu/rb_free.c,v 14.12 2006/08/31 23:16:38 lbutler Exp $";
00038 #endif
00039
00040 #include "common.h"
00041
00042
00043
00044 #include <stdio.h>
00045 #include <math.h>
00046 #include "machine.h"
00047 #include "bu.h"
00048 #include "./rb_internals.h"
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 void bu_rb_free (bu_rb_tree *tree, void (*free_data) ())
00062 {
00063 struct bu_rb_list *rblp;
00064 struct bu_rb_node *node;
00065 struct bu_rb_package *package;
00066
00067 BU_CKMAG(tree, BU_RB_TREE_MAGIC, "red-black tree");
00068
00069
00070
00071
00072 while (BU_LIST_WHILE(rblp, bu_rb_list, &(tree -> rbt_nodes.l)))
00073 {
00074 BU_CKMAG(rblp, BU_RB_LIST_MAGIC, "red-black list element");
00075 bu_rb_free_node(rblp -> rbl_node);
00076 }
00077
00078
00079
00080
00081 while (BU_LIST_WHILE(rblp, bu_rb_list, &(tree -> rbt_packages.l)))
00082 {
00083 BU_CKMAG(rblp, BU_RB_LIST_MAGIC, "red-black list element");
00084 package = rblp -> rbl_package;
00085 BU_CKMAG(package, BU_RB_PKG_MAGIC, "red-black package");
00086 if (free_data)
00087 (*free_data)(package -> rbp_data);
00088 bu_rb_free_package(package);
00089 }
00090
00091
00092
00093
00094 node = tree -> rbt_empty_node;
00095 bu_free((genptr_t) node -> rbn_left, "red-black left children");
00096 bu_free((genptr_t) node -> rbn_right, "red-black right children");
00097 bu_free((genptr_t) node -> rbn_parent, "red-black parents");
00098 bu_free((genptr_t) node -> rbn_color, "red-black colors");
00099 bu_free((genptr_t) node -> rbn_package, "red-black packages");
00100 bu_free((genptr_t) node, "red-black empty node");
00101
00102
00103
00104
00105 bu_free((genptr_t) tree -> rbt_root, "red-black roots");
00106 bu_free((genptr_t) tree -> rbt_unique, "red-black uniqueness flags");
00107 bu_free((genptr_t) tree, "red-black tree");
00108 }
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 void bu_rb_free_node (struct bu_rb_node *node)
00119 {
00120 bu_rb_tree *tree;
00121
00122 BU_CKMAG(node, BU_RB_NODE_MAGIC, "red-black node");
00123
00124 tree = node -> rbn_tree;
00125 if (bu_rb_current(tree) == node)
00126 bu_rb_current(tree) = bu_rb_null(tree);
00127 BU_CKMAG(node, BU_RB_NODE_MAGIC, "red-black node");
00128
00129
00130
00131
00132 BU_CKMAG(node -> rbn_list_pos, BU_RB_LIST_MAGIC, "red-black list element");
00133 BU_LIST_DEQUEUE(&(node -> rbn_list_pos -> l));
00134
00135 bu_free((genptr_t) node -> rbn_parent, "red-black parents");
00136 bu_free((genptr_t) node -> rbn_left, "red-black left children");
00137 bu_free((genptr_t) node -> rbn_right, "red-black right children");
00138 bu_free((genptr_t) node -> rbn_color, "red-black colors");
00139 bu_free((genptr_t) node -> rbn_package, "red-black packages");
00140 bu_free((genptr_t) node -> rbn_list_pos, "red-black list element");
00141 bu_free((genptr_t) node, "red-black node");
00142 }
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 void bu_rb_free_package (struct bu_rb_package *package)
00154 {
00155 BU_CKMAG(package, BU_RB_PKG_MAGIC, "red-black package");
00156
00157
00158
00159
00160 BU_CKMAG(package -> rbp_list_pos, BU_RB_LIST_MAGIC,
00161 "red-black list element");
00162 BU_LIST_DEQUEUE(&(package -> rbp_list_pos -> l));
00163
00164 bu_free((genptr_t) package -> rbp_node, "red-black package nodes");
00165 bu_free((genptr_t) package -> rbp_list_pos, "red-black list element");
00166 bu_free((genptr_t) package, "red-black package");
00167 }
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177