#include "archive_endian.h"
#include "archive_entry.h"
#include "archive_private.h"
+#include "archive_rb.h"
#include "archive_write_private.h"
#if defined(_WIN32) && !defined(__CYGWIN__)
#define ZF_LOG2_BS 15 /* log2 block size; 32K bytes. */
#define ZF_BLOCK_SIZE (1UL << ZF_LOG2_BS)
-#define RB_BLACK 0
-#define RB_RED 1
-
-#define RB_LEFT(elm) (elm)->rbe_left
-#define RB_RIGHT(elm) (elm)->rbe_right
-#define RB_PARENT(elm) (elm)->rbe_parent
-#define RB_COLOR(elm) (elm)->rbe_color
-#define RB_ROOT(head) (head)->rbh_root
-#define RB_EMPTY(head) (RB_ROOT(head) == NULL)
-
-#define RB_SET(elm, parent) do { \
- RB_PARENT(elm) = parent; \
- RB_LEFT(elm) = RB_RIGHT(elm) = NULL; \
- RB_COLOR(elm) = RB_RED; \
-} while (/*CONSTCOND*/ 0)
-
-#define RB_SET_BLACKRED(black, red) do { \
- RB_COLOR(black) = RB_BLACK; \
- RB_COLOR(red) = RB_RED; \
-} while (/*CONSTCOND*/ 0)
-
-#ifndef RB_AUGMENT
-#define RB_AUGMENT(x) do {} while (0)
-#endif
-
-#define RB_ROTATE_LEFT(head, elm, tmp) do { \
- (tmp) = RB_RIGHT(elm); \
- if ((RB_RIGHT(elm) = RB_LEFT(tmp)) != NULL) { \
- RB_PARENT(RB_LEFT(tmp)) = (elm); \
- } \
- RB_AUGMENT(elm); \
- if ((RB_PARENT(tmp) = RB_PARENT(elm)) != NULL) { \
- if ((elm) == RB_LEFT(RB_PARENT(elm))) \
- RB_LEFT(RB_PARENT(elm)) = (tmp); \
- else \
- RB_RIGHT(RB_PARENT(elm)) = (tmp); \
- } else \
- (head)->rbh_root = (tmp); \
- RB_LEFT(tmp) = (elm); \
- RB_PARENT(elm) = (tmp); \
- RB_AUGMENT(tmp); \
- if ((RB_PARENT(tmp))) \
- RB_AUGMENT(RB_PARENT(tmp)); \
-} while (/*CONSTCOND*/ 0)
-
-#define RB_ROTATE_RIGHT(head, elm, tmp) do { \
- (tmp) = RB_LEFT(elm); \
- if ((RB_LEFT(elm) = RB_RIGHT(tmp)) != NULL) { \
- RB_PARENT(RB_RIGHT(tmp)) = (elm); \
- } \
- RB_AUGMENT(elm); \
- if ((RB_PARENT(tmp) = RB_PARENT(elm)) != NULL) { \
- if ((elm) == RB_LEFT(RB_PARENT(elm))) \
- RB_LEFT(RB_PARENT(elm)) = (tmp); \
- else \
- RB_RIGHT(RB_PARENT(elm)) = (tmp); \
- } else \
- (head)->rbh_root = (tmp); \
- RB_RIGHT(tmp) = (elm); \
- RB_PARENT(elm) = (tmp); \
- RB_AUGMENT(tmp); \
- if ((RB_PARENT(tmp))) \
- RB_AUGMENT(RB_PARENT(tmp)); \
-} while (/*CONSTCOND*/ 0)
-
-#define RB_NEGINF -1
-#define RB_FOREACH(x, head) \
- for ((x) = rb_MINMAX(head, RB_NEGINF); \
- (x) != NULL; \
- (x) = rb_NEXT(x))
-
-struct rb_node {
- struct rb_node *rbe_left; /* left element */
- struct rb_node *rbe_right; /* right element */
- struct rb_node *rbe_parent; /* parent element */
- int rbe_color; /* node color */
-};
-
-struct rb_head {
- struct rb_node *rbh_root; /* root of the tree */
-};
-
-typedef int (*rb_cmp_node)(const struct rb_node *, const struct rb_node *);
-typedef int (*rb_cmp_key)(const void *, const struct rb_node *);
-
-
/*
* Manage extra records.
*/
struct isoent {
/* Keep `rbnode' at the first member of struct isoent. */
- struct rb_node rbnode;
+ struct archive_rb_node rbnode;
struct isofile *file;
struct isoent **last;
int cnt;
} children;
- struct rb_head rb_head;
+ struct archive_rb_tree rbtree;
/* A list of sub directories.(use drnext) */
struct {
*/
struct idr {
struct idrent {
- struct rb_node rbnode;
+ struct archive_rb_node rbnode;
/* Used in wait_list. */
struct idrent *wnext;
struct idrent *avail;
int rename_num;
} *idrent_pool;
- struct rb_head head;
- rb_cmp_node cmp_node;
- rb_cmp_key cmp_key;
+ struct archive_rb_tree rbtree;
struct {
struct idrent *first;
static void isoent_free_all(struct isoent *);
static struct isoent * isoent_create_virtual_dir(struct iso9660 *,
const char *);
-static struct isoent *isoent_add_child_head(struct isoent *, struct isoent *);
-static struct isoent *isoent_add_child_tail(struct isoent *, struct isoent *);
+static int isoent_cmp_node(const struct archive_rb_node *,
+ const struct archive_rb_node *);
+static int isoent_cmp_key(const struct archive_rb_node *,
+ const void *);
+static int isoent_add_child_head(struct isoent *, struct isoent *);
+static int isoent_add_child_tail(struct isoent *, struct isoent *);
static void isoent_trim_root_directory(struct iso9660 *);
static void isoent_setup_directory_location(struct iso9660 *,
int, struct vdd *);
static int idr_ensure_poolsize(struct archive_write *, struct idr *,
int);
static int idr_start(struct archive_write *, struct idr *,
- int, int, int, int, rb_cmp_node, rb_cmp_key);
+ int, int, int, int, const struct archive_rb_tree_ops *);
static void idr_register(struct idr *, struct isoent *, int,
int);
static void idr_extend_identifier(struct idrent *, int, int);
struct isoent *, struct idr *);
static int isoent_cmp_iso9660_identifier(const struct isoent *,
const struct isoent *);
-static int isoent_cmp_node_iso9660(const struct rb_node *,
- const struct rb_node *);
-static int isoent_cmp_key_iso9660(const void *,
- const struct rb_node *);
+static int isoent_cmp_node_iso9660(const struct archive_rb_node *,
+ const struct archive_rb_node *);
+static int isoent_cmp_key_iso9660(const struct archive_rb_node *,
+ const void *);
static int isoent_cmp_joliet_identifier(const struct isoent *,
const struct isoent *);
-static int isoent_cmp_node_joliet(const struct rb_node *,
- const struct rb_node *);
-static int isoent_cmp_key_joliet(const void *,
- const struct rb_node *);
+static int isoent_cmp_node_joliet(const struct archive_rb_node *,
+ const struct archive_rb_node *);
+static int isoent_cmp_key_joliet(const struct archive_rb_node *,
+ const void *);
static inline void path_table_add_entry(struct path_table *, struct isoent *);
static inline struct isoent * path_table_last_entry(struct path_table *);
static int isoent_make_path_table(struct archive_write *);
static int zisofs_fix_bootfile(struct archive_write *);
#endif
-static void rb_INSERT_COLOR(struct rb_head *, struct rb_node *);
-static void rb_REMOVE_COLOR(struct rb_head *, struct rb_node *, struct rb_node *);
-static struct rb_node *rb_REMOVE(struct rb_head *, struct rb_node *);
-static struct rb_node *rb_INSERT(struct rb_head *, struct rb_node *, rb_cmp_node);
-static struct rb_node *rb_FIND(struct rb_head *, const void *, rb_cmp_key);
-static struct rb_node *rb_NEXT(struct rb_node *);
-static struct rb_node *rb_MINMAX(struct rb_head *, int);
-
-
-/****************************************************************/
-
int
archive_write_set_format_iso9660(struct archive *_a)
{
isoent_new(struct isofile *file)
{
struct isoent *isoent;
+ static const struct archive_rb_tree_ops rb_ops = {
+ isoent_cmp_node, isoent_cmp_key,
+ };
isoent = calloc(1, sizeof(*isoent));
if (isoent == NULL)
isoent->file = file;
isoent->children.first = NULL;
isoent->children.last = &(isoent->children.first);
- isoent->rb_head.rbh_root = NULL;
+ isoent->rbtree.rbt_root = NULL;
+ isoent->rbtree.rbt_ops = &rb_ops;
isoent->subdirs.first = NULL;
isoent->subdirs.last = &(isoent->subdirs.first);
isoent->extr_rec_list.first = NULL;
}
static int
-isoent_cmp_node(const struct rb_node *n1, const struct rb_node *n2)
+isoent_cmp_node(const struct archive_rb_node *n1,
+ const struct archive_rb_node *n2)
{
struct isoent *e1 = (struct isoent *)n1;
struct isoent *e2 = (struct isoent *)n2;
}
static int
-isoent_cmp_key(const void *key, const struct rb_node *n)
+isoent_cmp_key(const struct archive_rb_node *n, const void *key)
{
struct isoent *e = (struct isoent *)n;
- return (strcmp((const char *)key, e->file->basename.s));
+ return (strcmp(e->file->basename.s, (const char *)key));
}
-static struct isoent *
+static int
isoent_add_child_head(struct isoent *parent, struct isoent *child)
{
- struct isoent *n;
- n = (struct isoent *)rb_INSERT(&(parent->rb_head),
- (struct rb_node *)child, isoent_cmp_node);
- if (n != NULL)
- return (n);
+ if (!__archive_rb_tree_insert_node(
+ &(parent->rbtree), (struct archive_rb_node *)child))
+ return (0);
if ((child->chnext = parent->children.first) == NULL)
parent->children.last = &(child->chnext);
parent->children.first = child;
child->parent = parent;
} else
child->drnext = NULL;
- return (NULL);
+ return (1);
}
-static struct isoent *
+static int
isoent_add_child_tail(struct isoent *parent, struct isoent *child)
{
- struct isoent *n;
- n = (struct isoent *)rb_INSERT(&(parent->rb_head),
- (struct rb_node *)child, isoent_cmp_node);
- if (n != NULL)
- return (n);
+ if (!__archive_rb_tree_insert_node(
+ &(parent->rbtree), (struct archive_rb_node *)child))
+ return (0);
child->chnext = NULL;
*parent->children.last = child;
parent->children.last = &(child->chnext);
parent->subdirs.cnt++;
child->parent = parent;
}
- return (NULL);
+ return (1);
}
/*
if (archive_strlen(&(iso9660->cur_dirstr))
== archive_strlen(&(isoent->file->parentdir)) &&
strcmp(iso9660->cur_dirstr.s, fn) == 0) {
- np = isoent_add_child_tail(iso9660->cur_dirent, isoent);
- if (np != NULL)
+ if (!isoent_add_child_tail(iso9660->cur_dirent, isoent)) {
+ np = (struct isoent *)__archive_rb_tree_find_node(
+ &(iso9660->cur_dirent->rbtree),
+ isoent->file->basename.s);
goto same_entry;
+ }
return (isoent);
}
&(dent->file->basename));
}
- np = isoent_add_child_tail(dent, isoent);
- if (np != NULL)
+ if (!isoent_add_child_tail(dent, isoent)) {
+ np = (struct isoent *)__archive_rb_tree_find_node(
+ &(dent->rbtree), isoent->file->basename.s);
goto same_entry;
+ }
return (isoent);
}
{
struct isoent *np;
- np = (struct isoent *)rb_FIND(&(isoent->rb_head), child_name,
- isoent_cmp_key);
+ np = (struct isoent *)__archive_rb_tree_find_node(
+ &(isoent->rbtree), child_name);
return (np);
}
static int
idr_start(struct archive_write *a, struct idr *idr, int cnt, int ffmax,
- int num_size, int null_size, rb_cmp_node cmp_node, rb_cmp_key cmp_key)
+ int num_size, int null_size, const struct archive_rb_tree_ops *rbt_ops)
{
int r;
r = idr_ensure_poolsize(a, idr, cnt);
if (r != ARCHIVE_OK)
return (r);
- idr->head.rbh_root = NULL;
+ idr->rbtree.rbt_root = NULL;
+ idr->rbtree.rbt_ops = rbt_ops;
idr->wait_list.first = NULL;
idr->wait_list.last = &(idr->wait_list.first);
idr->pool_idx = 0;
idr->num_size = num_size;
idr->null_size = null_size;
- idr->cmp_node = cmp_node;
- idr->cmp_key = cmp_key;
return (ARCHIVE_OK);
}
idrent->noff = noff;
idrent->rename_num = 0;
- n = (struct idrent *)rb_INSERT(&(idr->head), &(idrent->rbnode),
- idr->cmp_node);
- if (n != NULL) {
- /* this `idrent' needs to rename. */
- idrent->avail = n;
- *idr->wait_list.last = idrent;
- idr->wait_list.last = &(idrent->wnext);
+ if (!__archive_rb_tree_insert_node(&(idr->rbtree), &(idrent->rbnode))) {
+ n = (struct idrent *)__archive_rb_tree_find_node(
+ &(idr->rbtree), idrent->isoent);
+ if (n != NULL) {
+ /* this `idrent' needs to rename. */
+ idrent->avail = n;
+ *idr->wait_list.last = idrent;
+ idr->wait_list.last = &(idrent->wnext);
+ }
}
}
p = (unsigned char *)n->isoent->identifier + n->noff;
do {
fsetnum(p, n->avail->rename_num++);
- } while (rb_INSERT(&(idr->head), &(n->rbnode),
- idr->cmp_node) != NULL);
+ } while (!__archive_rb_tree_insert_node(
+ &(idr->rbtree), &(n->rbnode)));
}
}
const char *char_map;
char allow_ldots, allow_multidot, allow_period, allow_vernum;
int fnmax, ffmax, dnmax;
+ static const struct archive_rb_tree_ops rb_ops = {
+ isoent_cmp_node_iso9660, isoent_cmp_key_iso9660
+ };
if (isoent->children.cnt == 0)
return (0);
fnmax = ffmax = dnmax = 207;
}
- r = idr_start(a, idr, isoent->children.cnt, ffmax, 3, 1,
- isoent_cmp_node_iso9660, isoent_cmp_key_iso9660);
+ r = idr_start(a, idr, isoent->children.cnt, ffmax, 3, 1, &rb_ops);
if (r < 0)
return (r);
size_t l;
int r;
int ffmax, parent_len;
+ static const struct archive_rb_tree_ops rb_ops = {
+ isoent_cmp_node_joliet, isoent_cmp_key_joliet
+ };
if (isoent->children.cnt == 0)
return (0);
else
ffmax = 128;
- r = idr_start(a, idr, isoent->children.cnt, ffmax, 6, 2,
- isoent_cmp_node_joliet, isoent_cmp_key_joliet);
+ r = idr_start(a, idr, isoent->children.cnt, ffmax, 6, 2, &rb_ops);
if (r < 0)
return (r);
}
static int
-isoent_cmp_node_iso9660(const struct rb_node *n1, const struct rb_node *n2)
+isoent_cmp_node_iso9660(const struct archive_rb_node *n1,
+ const struct archive_rb_node *n2)
{
struct idrent *e1 = (struct idrent *)n1;
struct idrent *e2 = (struct idrent *)n2;
}
static int
-isoent_cmp_key_iso9660(const void *key, const struct rb_node *node)
+isoent_cmp_key_iso9660(const struct archive_rb_node *node, const void *key)
{
struct isoent *isoent = (struct isoent *)key;
struct idrent *idrent = (struct idrent *)node;
- return (isoent_cmp_iso9660_identifier(isoent, idrent->isoent));
+ return (isoent_cmp_iso9660_identifier(idrent->isoent, isoent));
}
static int
}
static int
-isoent_cmp_node_joliet(const struct rb_node *n1, const struct rb_node *n2)
+isoent_cmp_node_joliet(const struct archive_rb_node *n1,
+ const struct archive_rb_node *n2)
{
struct idrent *e1 = (struct idrent *)n1;
struct idrent *e2 = (struct idrent *)n2;
}
static int
-isoent_cmp_key_joliet(const void *key, const struct rb_node *node)
+isoent_cmp_key_joliet(const struct archive_rb_node *node, const void *key)
{
struct isoent *isoent = (struct isoent *)key;
struct idrent *idrent = (struct idrent *)node;
- return (isoent_cmp_joliet_identifier(isoent, idrent->isoent));
+ return (isoent_cmp_joliet_identifier(idrent->isoent, isoent));
}
static int
isoent_make_sorted_files(struct archive_write *a, struct isoent *isoent,
struct idr *idr)
{
- struct rb_node *rn;
+ struct archive_rb_node *rn;
struct isoent **children;
children = malloc(isoent->children.cnt * sizeof(struct isoent *));
}
isoent->children_sorted = children;
- RB_FOREACH(rn, &(idr->head)) {
+ //ARCHIVE_RB_TREE_FOREACH(rn, &(idr->rbtree)) {
+ for ((rn) = ARCHIVE_RB_TREE_MIN(&(idr->rbtree)); (rn);
+ (rn) = __archive_rb_tree_iterate((&(idr->rbtree)),
+ (rn), ARCHIVE_RB_DIR_LEFT)) {
struct idrent *idrent = (struct idrent *)rn;
*children ++ = idrent->isoent;
}
rootent->subdirs.last = &(ent->drnext);
rootent->subdirs.cnt--;
- rb_REMOVE(&(rootent->rb_head),
- (struct rb_node *)rr_moved);
+ __archive_rb_tree_remove_node(&(rootent->rbtree),
+ (struct archive_rb_node *)rr_moved);
/* Add "rr_moved" entry into the head of children chain. */
isoent_add_child_head(rootent, rr_moved);
#endif /* HAVE_ZLIB_H */
-static void
-rb_INSERT_COLOR(struct rb_head *head, struct rb_node *elm)
-{
- struct rb_node *parent, *gparent, *tmp;
- while ((parent = RB_PARENT(elm)) != NULL &&
- RB_COLOR(parent) == RB_RED) {
- gparent = RB_PARENT(parent);
- if (parent == RB_LEFT(gparent)) {
- tmp = RB_RIGHT(gparent);
- if (tmp && RB_COLOR(tmp) == RB_RED) {
- RB_COLOR(tmp) = RB_BLACK;
- RB_SET_BLACKRED(parent, gparent);
- elm = gparent;
- continue;
- }
- if (RB_RIGHT(parent) == elm) {
- RB_ROTATE_LEFT(head, parent, tmp);
- tmp = parent;
- parent = elm;
- elm = tmp;
- }
- RB_SET_BLACKRED(parent, gparent);
- RB_ROTATE_RIGHT(head, gparent, tmp);
- } else {
- tmp = RB_LEFT(gparent);
- if (tmp && RB_COLOR(tmp) == RB_RED) {
- RB_COLOR(tmp) = RB_BLACK;
- RB_SET_BLACKRED(parent, gparent);
- elm = gparent;
- continue;
- }
- if (RB_LEFT(parent) == elm) {
- RB_ROTATE_RIGHT(head, parent, tmp);
- tmp = parent;
- parent = elm;
- elm = tmp;
- }
- RB_SET_BLACKRED(parent, gparent);
- RB_ROTATE_LEFT(head, gparent, tmp);
- }
- }
- RB_COLOR(head->rbh_root) = RB_BLACK;
-}
-
-static void
-rb_REMOVE_COLOR(struct rb_head *head, struct rb_node *parent,
- struct rb_node *elm)
-{
- struct rb_node *tmp;
- while ((elm == NULL || RB_COLOR(elm) == RB_BLACK) &&
- elm != RB_ROOT(head)) {
- if (RB_LEFT(parent) == elm) {
- tmp = RB_RIGHT(parent);
- if (RB_COLOR(tmp) == RB_RED) {
- RB_SET_BLACKRED(tmp, parent);
- RB_ROTATE_LEFT(head, parent, tmp);
- tmp = RB_RIGHT(parent);
- }
- if ((RB_LEFT(tmp) == NULL ||
- RB_COLOR(RB_LEFT(tmp)) == RB_BLACK) &&
- (RB_RIGHT(tmp) == NULL ||
- RB_COLOR(RB_RIGHT(tmp)) == RB_BLACK)) {
- RB_COLOR(tmp) = RB_RED;
- elm = parent;
- parent = RB_PARENT(elm);
- } else {
- if (RB_RIGHT(tmp) == NULL ||
- RB_COLOR(RB_RIGHT(tmp)) == RB_BLACK) {
- struct rb_node *oleft;
- if ((oleft = RB_LEFT(tmp))
- != NULL)
- RB_COLOR(oleft) = RB_BLACK;
- RB_COLOR(tmp) = RB_RED;
- RB_ROTATE_RIGHT(head, tmp, oleft);
- tmp = RB_RIGHT(parent);
- }
- RB_COLOR(tmp) = RB_COLOR(parent);
- RB_COLOR(parent) = RB_BLACK;
- if (RB_RIGHT(tmp))
- RB_COLOR(RB_RIGHT(tmp)) = RB_BLACK;
- RB_ROTATE_LEFT(head, parent, tmp);
- elm = RB_ROOT(head);
- break;
- }
- } else {
- tmp = RB_LEFT(parent);
- if (RB_COLOR(tmp) == RB_RED) {
- RB_SET_BLACKRED(tmp, parent);
- RB_ROTATE_RIGHT(head, parent, tmp);
- tmp = RB_LEFT(parent);
- }
- if ((RB_LEFT(tmp) == NULL ||
- RB_COLOR(RB_LEFT(tmp)) == RB_BLACK) &&
- (RB_RIGHT(tmp) == NULL ||
- RB_COLOR(RB_RIGHT(tmp)) == RB_BLACK)) {
- RB_COLOR(tmp) = RB_RED;
- elm = parent;
- parent = RB_PARENT(elm);
- } else {
- if (RB_LEFT(tmp) == NULL ||
- RB_COLOR(RB_LEFT(tmp)) == RB_BLACK) {
- struct rb_node *oright;
- if ((oright = RB_RIGHT(tmp))
- != NULL)
- RB_COLOR(oright) = RB_BLACK;
- RB_COLOR(tmp) = RB_RED;
- RB_ROTATE_LEFT(head, tmp, oright);
- tmp = RB_LEFT(parent);
- }
- RB_COLOR(tmp) = RB_COLOR(parent);
- RB_COLOR(parent) = RB_BLACK;
- if (RB_LEFT(tmp))
- RB_COLOR(RB_LEFT(tmp)) = RB_BLACK;
- RB_ROTATE_RIGHT(head, parent, tmp);
- elm = RB_ROOT(head);
- break;
- }
- }
- }
- if (elm)
- RB_COLOR(elm) = RB_BLACK;
-}
-
-static struct rb_node *
-rb_REMOVE(struct rb_head *head, struct rb_node *elm)
-{
- struct rb_node *child, *parent, *old = elm;
- int color;
- if (RB_LEFT(elm) == NULL)
- child = RB_RIGHT(elm);
- else if (RB_RIGHT(elm) == NULL)
- child = RB_LEFT(elm);
- else {
- struct rb_node *left;
- elm = RB_RIGHT(elm);
- while ((left = RB_LEFT(elm)) != NULL)
- elm = left;
- child = RB_RIGHT(elm);
- parent = RB_PARENT(elm);
- color = RB_COLOR(elm);
- if (child)
- RB_PARENT(child) = parent;
- if (parent) {
- if (RB_LEFT(parent) == elm)
- RB_LEFT(parent) = child;
- else
- RB_RIGHT(parent) = child;
- RB_AUGMENT(parent);
- } else
- RB_ROOT(head) = child;
- if (RB_PARENT(elm) == old)
- parent = elm;
- *(elm) = *(old);
- if (RB_PARENT(old)) {
- if (RB_LEFT(RB_PARENT(old)) == old)
- RB_LEFT(RB_PARENT(old)) = elm;
- else
- RB_RIGHT(RB_PARENT(old)) = elm;
- RB_AUGMENT(RB_PARENT(old));
- } else
- RB_ROOT(head) = elm;
- RB_PARENT(RB_LEFT(old)) = elm;
- if (RB_RIGHT(old))
- RB_PARENT(RB_RIGHT(old)) = elm;
- if (parent) {
- left = parent;
- do {
- RB_AUGMENT(left);
- } while ((left = RB_PARENT(left)) != NULL);
- }
- goto color;
- }
- parent = RB_PARENT(elm);
- color = RB_COLOR(elm);
- if (child)
- RB_PARENT(child) = parent;
- if (parent) {
- if (RB_LEFT(parent) == elm)
- RB_LEFT(parent) = child;
- else
- RB_RIGHT(parent) = child;
- RB_AUGMENT(parent);
- } else
- RB_ROOT(head) = child;
-color:
- if (color == RB_BLACK)
- rb_REMOVE_COLOR(head, parent, child);
- return (old);
-}
-
-/* Inserts a node into the RB tree */
-static struct rb_node *
-rb_INSERT(struct rb_head *head, struct rb_node *elm, rb_cmp_node rb_cmp)
-{
- struct rb_node *tmp;
- struct rb_node *parent = NULL;
- int comp = 0;
- tmp = RB_ROOT(head);
- while (tmp) {
- parent = tmp;
- comp = rb_cmp(elm, parent);
- if (comp < 0)
- tmp = RB_LEFT(tmp);
- else if (comp > 0)
- tmp = RB_RIGHT(tmp);
- else
- return (tmp);
- }
- RB_SET(elm, parent);
- if (parent != NULL) {
- if (comp < 0)
- RB_LEFT(parent) = elm;
- else
- RB_RIGHT(parent) = elm;
- RB_AUGMENT(parent);
- } else
- RB_ROOT(head) = elm;
- rb_INSERT_COLOR(head, elm);
- return (NULL);
-}
-
-/* Finds the node with the same key as id */
-static struct rb_node *
-rb_FIND(struct rb_head *head, const void *key, rb_cmp_key rb_cmp)
-{
- struct rb_node *tmp = RB_ROOT(head);
- int comp;
- while (tmp) {
- comp = rb_cmp(key, tmp);
- if (comp < 0)
- tmp = RB_LEFT(tmp);
- else if (comp > 0)
- tmp = RB_RIGHT(tmp);
- else
- return (tmp);
- }
- return (NULL);
-}
-
-/* ARGSUSED */
-static struct rb_node *
-rb_NEXT(struct rb_node *elm)
-{
- if (RB_RIGHT(elm)) {
- elm = RB_RIGHT(elm);
- while (RB_LEFT(elm))
- elm = RB_LEFT(elm);
- } else {
- if (RB_PARENT(elm) &&
- (elm == RB_LEFT(RB_PARENT(elm))))
- elm = RB_PARENT(elm);
- else {
- while (RB_PARENT(elm) &&
- (elm == RB_RIGHT(RB_PARENT(elm))))
- elm = RB_PARENT(elm);
- elm = RB_PARENT(elm);
- }
- }
- return (elm);
-}
-
-static struct rb_node *
-rb_MINMAX(struct rb_head *head, int val)
-{
- struct rb_node *tmp = RB_ROOT(head);
- struct rb_node *parent = NULL;
- while (tmp) {
- parent = tmp;
- if (val < 0)
- tmp = RB_LEFT(tmp);
- else
- tmp = RB_RIGHT(tmp);
- }
- return (parent);
-}