mirror of
git://projects.qi-hardware.com/wernermisc.git
synced 2024-11-22 18:28:07 +02:00
qpkg: renamed "struct jrb_node" to "struct jrb" replaced JRB with "struct jrb *"
This commit is contained in:
parent
da7a6feb4b
commit
47abebe364
66
qpkg/jrb.c
66
qpkg/jrb.c
@ -55,9 +55,9 @@ Fax: 865-974-4404
|
|||||||
#define isext(n) (!isint(n))
|
#define isext(n) (!isint(n))
|
||||||
#define ishead(n) (n->roothead & 2)
|
#define ishead(n) (n->roothead & 2)
|
||||||
#define isroot(n) (n->roothead & 1)
|
#define isroot(n) (n->roothead & 1)
|
||||||
#define getlext(n) ((struct jrb_node *) (n->key))
|
#define getlext(n) ((struct jrb *) (n->key))
|
||||||
#define setlext(node, val) node->key = (void *) (val)
|
#define setlext(node, val) node->key = (void *) (val)
|
||||||
#define getrext(n) ((struct jrb_node *) (n->val))
|
#define getrext(n) ((struct jrb *) (n->val))
|
||||||
#define setrext(node, value) node->val = (void *) (value)
|
#define setrext(node, value) node->val = (void *) (value)
|
||||||
#define setred(n) n->red = 1
|
#define setred(n) n->red = 1
|
||||||
#define setblack(n) n->red = 0
|
#define setblack(n) n->red = 0
|
||||||
@ -71,9 +71,10 @@ Fax: 865-974-4404
|
|||||||
#define sibling(n) (isleft(n) ? n->parent->blink : n->parent->flink)
|
#define sibling(n) (isleft(n) ? n->parent->blink : n->parent->flink)
|
||||||
|
|
||||||
|
|
||||||
static void insert(JRB item, JRB list) /* Inserts to the end of a list */
|
static void insert(struct jrb *item, struct jrb *list)
|
||||||
|
/* Inserts to the end of a list */
|
||||||
{
|
{
|
||||||
JRB last_node;
|
struct jrb *last_node;
|
||||||
|
|
||||||
last_node = list->blink;
|
last_node = list->blink;
|
||||||
|
|
||||||
@ -84,17 +85,17 @@ static void insert(JRB item, JRB list) /* Inserts to the end of a list */
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void delete_item(JRB item) /* Deletes an arbitrary iterm */
|
static void delete_item(struct jrb *item) /* Deletes an arbitrary iterm */
|
||||||
{
|
{
|
||||||
item->flink->blink = item->blink;
|
item->flink->blink = item->blink;
|
||||||
item->blink->flink = item->flink;
|
item->blink->flink = item->flink;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void single_rotate(JRB y, int l)
|
static void single_rotate(struct jrb *y, int l)
|
||||||
{
|
{
|
||||||
int rl = 0 /* for gcc */, ir;
|
int rl = 0 /* for gcc */, ir;
|
||||||
JRB x, yp;
|
struct jrb *x, *yp;
|
||||||
|
|
||||||
ir = isroot(y);
|
ir = isroot(y);
|
||||||
yp = y->parent;
|
yp = y->parent;
|
||||||
@ -135,9 +136,9 @@ static void single_rotate(JRB y, int l)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void recolor(JRB n)
|
static void recolor(struct jrb *n)
|
||||||
{
|
{
|
||||||
JRB p, gp, s;
|
struct jrb *p, *gp, *s;
|
||||||
int done = 0;
|
int done = 0;
|
||||||
|
|
||||||
while (!done) {
|
while (!done) {
|
||||||
@ -182,11 +183,11 @@ static void recolor(JRB n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static JRB mk_new_ext(void *key, void *val)
|
static struct jrb *mk_new_ext(void *key, void *val)
|
||||||
{
|
{
|
||||||
JRB new;
|
struct jrb *new;
|
||||||
|
|
||||||
new = (JRB) malloc(sizeof(struct jrb_node));
|
new = (struct jrb *) malloc(sizeof(struct jrb));
|
||||||
new->val = val;
|
new->val = val;
|
||||||
new->key = key;
|
new->key = key;
|
||||||
setext(new);
|
setext(new);
|
||||||
@ -196,11 +197,11 @@ static JRB mk_new_ext(void *key, void *val)
|
|||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mk_new_int(JRB l, JRB r, JRB p, int il)
|
static void mk_new_int(struct jrb *l, struct jrb *r, struct jrb *p, int il)
|
||||||
{
|
{
|
||||||
JRB newnode;
|
struct jrb *newnode;
|
||||||
|
|
||||||
newnode = (JRB) malloc(sizeof(struct jrb_node));
|
newnode = (struct jrb *) malloc(sizeof(struct jrb));
|
||||||
setint(newnode);
|
setint(newnode);
|
||||||
setred(newnode);
|
setred(newnode);
|
||||||
setnormal(newnode);
|
setnormal(newnode);
|
||||||
@ -227,7 +228,7 @@ static void mk_new_int(JRB l, JRB r, JRB p, int il)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JRB lprev(JRB n)
|
struct jrb *lprev(struct jrb *n)
|
||||||
{
|
{
|
||||||
if (ishead(n))
|
if (ishead(n))
|
||||||
return n;
|
return n;
|
||||||
@ -240,7 +241,7 @@ JRB lprev(JRB n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JRB rprev(JRB n)
|
struct jrb *rprev(struct jrb *n)
|
||||||
{
|
{
|
||||||
if (ishead(n))
|
if (ishead(n))
|
||||||
return n;
|
return n;
|
||||||
@ -253,11 +254,11 @@ JRB rprev(JRB n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JRB make_jrb(void)
|
struct jrb *make_jrb(void)
|
||||||
{
|
{
|
||||||
JRB head;
|
struct jrb *head;
|
||||||
|
|
||||||
head = (JRB) malloc(sizeof(struct jrb_node));
|
head = (struct jrb *) malloc(sizeof(struct jrb));
|
||||||
head->flink = head;
|
head->flink = head;
|
||||||
head->blink = head;
|
head->blink = head;
|
||||||
head->parent = head;
|
head->parent = head;
|
||||||
@ -267,7 +268,7 @@ JRB make_jrb(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JRB jrb_find_gte(JRB n, const void *key,
|
struct jrb *jrb_find_gte(struct jrb *n, const void *key,
|
||||||
int (*fxn)(const void *, const void *), int *fnd)
|
int (*fxn)(const void *, const void *), int *fnd)
|
||||||
{
|
{
|
||||||
int cmp;
|
int cmp;
|
||||||
@ -304,10 +305,11 @@ JRB jrb_find_gte(JRB n, const void *key,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JRB jrb_find(JRB n, const void *key, int (*fxn)(const void *, const void *))
|
struct jrb *jrb_find(struct jrb *n, const void *key,
|
||||||
|
int (*fxn)(const void *a, const void *b))
|
||||||
{
|
{
|
||||||
int fnd;
|
int fnd;
|
||||||
JRB j;
|
struct jrb *j;
|
||||||
|
|
||||||
j = jrb_find_gte(n, key, fxn, &fnd);
|
j = jrb_find_gte(n, key, fxn, &fnd);
|
||||||
if (fnd)
|
if (fnd)
|
||||||
@ -317,9 +319,9 @@ JRB jrb_find(JRB n, const void *key, int (*fxn)(const void *, const void *))
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static JRB jrb_insert_b(JRB n, void *key, void *val)
|
static struct jrb *jrb_insert_b(struct jrb *n, void *key, void *val)
|
||||||
{
|
{
|
||||||
JRB newleft, newright, newnode, p;
|
struct jrb *newleft, *newright, *newnode, *p;
|
||||||
|
|
||||||
if (ishead(n)) {
|
if (ishead(n)) {
|
||||||
if (n->parent == n) { /* Tree is empty */
|
if (n->parent == n) { /* Tree is empty */
|
||||||
@ -354,9 +356,9 @@ static JRB jrb_insert_b(JRB n, void *key, void *val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void jrb_delete_node(JRB n)
|
void jrb_delete_node(struct jrb *n)
|
||||||
{
|
{
|
||||||
JRB s, p, gp, x, z;
|
struct jrb *s, *p, *gp, *x, *z;
|
||||||
char ir, il;
|
char ir, il;
|
||||||
|
|
||||||
if (isint(n)) {
|
if (isint(n)) {
|
||||||
@ -486,7 +488,7 @@ void jrb_delete_node(JRB n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int jrb_nblack(JRB n)
|
int jrb_nblack(struct jrb *n)
|
||||||
{
|
{
|
||||||
int nb;
|
int nb;
|
||||||
|
|
||||||
@ -504,7 +506,7 @@ int jrb_nblack(JRB n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int jrb_plength(JRB n)
|
int jrb_plength(struct jrb *n)
|
||||||
{
|
{
|
||||||
int pl;
|
int pl;
|
||||||
|
|
||||||
@ -522,7 +524,7 @@ int jrb_plength(JRB n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void jrb_free_tree(JRB n)
|
void jrb_free_tree(struct jrb *n)
|
||||||
{
|
{
|
||||||
if (!ishead(n)) {
|
if (!ishead(n)) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
@ -537,13 +539,13 @@ void jrb_free_tree(JRB n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void *jrb_val(JRB n)
|
void *jrb_val(struct jrb *n)
|
||||||
{
|
{
|
||||||
return n->val;
|
return n->val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JRB jrb_insert(JRB tree, void *key, void *val,
|
struct jrb *jrb_insert(struct jrb *tree, void *key, void *val,
|
||||||
int (*func)(const void *a, const void *b))
|
int (*func)(const void *a, const void *b))
|
||||||
{
|
{
|
||||||
int fnd;
|
int fnd;
|
||||||
|
28
qpkg/jrb.h
28
qpkg/jrb.h
@ -49,40 +49,40 @@ Fax: 865-974-4404
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
typedef struct jrb_node {
|
struct jrb {
|
||||||
unsigned char red;
|
unsigned char red;
|
||||||
unsigned char internal;
|
unsigned char internal;
|
||||||
unsigned char left;
|
unsigned char left;
|
||||||
unsigned char roothead; /* (bit 1 is root, bit 2 is head) */
|
unsigned char roothead; /* (bit 1 is root, bit 2 is head) */
|
||||||
struct jrb_node *flink;
|
struct jrb *flink;
|
||||||
struct jrb_node *blink;
|
struct jrb *blink;
|
||||||
struct jrb_node *parent;
|
struct jrb *parent;
|
||||||
void *key;
|
void *key;
|
||||||
void *val;
|
void *val;
|
||||||
} *JRB;
|
};
|
||||||
|
|
||||||
|
|
||||||
JRB make_jrb(void); /* Creates a new rb-tree */
|
struct jrb *make_jrb(void); /* Creates a new rb-tree */
|
||||||
|
|
||||||
|
|
||||||
/* Creates a node with key key and val val and inserts it into the tree.
|
/* Creates a node with key key and val val and inserts it into the tree.
|
||||||
jrb_insert uses strcmp() as comparison funcion. jrb_inserti uses <>=,
|
jrb_insert uses strcmp() as comparison funcion. jrb_inserti uses <>=,
|
||||||
jrb_insertg uses func() */
|
jrb_insertg uses func() */
|
||||||
|
|
||||||
JRB jrb_insert(JRB tree, void *key, void *val,
|
struct jrb *jrb_insert(struct jrb *tree, void *key, void *val,
|
||||||
int (*func)(const void *a, const void *b));
|
int (*func)(const void *a, const void *b));
|
||||||
|
|
||||||
/* returns an external node in t whose value is equal k. Returns NULL if
|
/* returns an external node in t whose value is equal k. Returns NULL if
|
||||||
there is no such node in the tree */
|
there is no such node in the tree */
|
||||||
|
|
||||||
JRB jrb_find(JRB root, const void *key,
|
struct jrb *jrb_find(struct jrb *root, const void *key,
|
||||||
int (*func)(const void *a, const void *b));
|
int (*func)(const void *a, const void *b));
|
||||||
|
|
||||||
/* returns an external node in t whose value is equal
|
/* returns an external node in t whose value is equal
|
||||||
k or whose value is the smallest value greater than k. Sets found to
|
k or whose value is the smallest value greater than k. Sets found to
|
||||||
1 if the key was found, and 0 otherwise. */
|
1 if the key was found, and 0 otherwise. */
|
||||||
|
|
||||||
JRB jrb_find_gte(JRB root, const void *key,
|
struct jrb *jrb_find_gte(struct jrb *root, const void *key,
|
||||||
int (*func)(const void *a, const void *b), int *found);
|
int (*func)(const void *a, const void *b), int *found);
|
||||||
|
|
||||||
|
|
||||||
@ -90,16 +90,16 @@ JRB jrb_find_gte(JRB root, const void *key,
|
|||||||
tree before/after node nd. Does not check to ensure that you are
|
tree before/after node nd. Does not check to ensure that you are
|
||||||
keeping the correct order */
|
keeping the correct order */
|
||||||
|
|
||||||
void jrb_delete_node(JRB node); /* Deletes and frees a node (but
|
void jrb_delete_node(struct jrb *node); /* Deletes and frees a node (but
|
||||||
not the key or val) */
|
not the key or val) */
|
||||||
void jrb_free_tree(JRB root); /* Deletes and frees an entire tree */
|
void jrb_free_tree(struct jrb *root); /* Deletes and frees an entire tree */
|
||||||
|
|
||||||
void *jrb_val(JRB node); /* Returns node->v.val -- this is to shut
|
void *jrb_val(struct jrb *node); /* Returns node->v.val -- this is to shut
|
||||||
lint up */
|
lint up */
|
||||||
|
|
||||||
int jrb_nblack(JRB n); /* returns # of black nodes in path from
|
int jrb_nblack(struct jrb *n); /* returns # of black nodes in path from
|
||||||
n to the root */
|
n to the root */
|
||||||
int jrb_plength(JRB n); /* returns the # of nodes in path from
|
int jrb_plength(struct jrb *n); /* returns the # of nodes in path from
|
||||||
n to the root */
|
n to the root */
|
||||||
|
|
||||||
#define jrb_first(n) ((n)->flink)
|
#define jrb_first(n) ((n)->flink)
|
||||||
|
@ -17,8 +17,8 @@ static int cmp(const void *a, const void *b)
|
|||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
JRB tree = make_jrb();
|
struct jrb *tree = make_jrb();
|
||||||
JRB p;
|
struct jrb *p;
|
||||||
|
|
||||||
INSERT("ab", "have");
|
INSERT("ab", "have");
|
||||||
INSERT("ac", "NOT");
|
INSERT("ac", "NOT");
|
||||||
|
Loading…
Reference in New Issue
Block a user