--- rb/rb.h	1994-12-05 16:57:58.000000000 -0500
+++ rb/rb.h	2012-04-07 13:21:08.000000000 -0400
@@ -34,38 +34,38 @@
   } v;
 } *Rb_node;
 
-#ifndef __P
-#if defined(__STDC__) || defined(__cplusplus)
-#define __P(protos)	protos
-#else 
-#define __P(protos)	()
-#endif
-#endif
-
+#ifndef EXTERN
 #ifdef __cplusplus
 #define EXTERN extern "C"
 #else
 #define EXTERN extern
 #endif
+#endif
 
-EXTERN Rb_node make_rb __P(());
-EXTERN Rb_node rb_insert_b __P((Rb_node node, char *key, char *value));
-
-EXTERN Rb_node rb_find_key __P((Rb_node tree, char *key));
-EXTERN Rb_node rb_find_ikey __P((Rb_node tree, int ikey));
-EXTERN Rb_node rb_find_ukey __P((Rb_node tree, unsigned long ukey));
-EXTERN Rb_node rb_find_gkey __P((Rb_node tree, char *key, int (*fxn)()));
-
-EXTERN Rb_node rb_find_key_n __P((Rb_node tree, char *key, int *found));
-EXTERN Rb_node rb_find_ikey_n __P((Rb_node tree, int ikey, int *found));
-EXTERN Rb_node rb_find_ukey_n __P((Rb_node tree, unsigned long ukey,
-    int *found));
-EXTERN Rb_node rb_find_gkey_n __P((Rb_node tree, char *key, int (*fxn)(),
-    int *found));
-EXTERN void rb_delete_node __P((Rb_node node));
-EXTERN void rb_free_tree __P((Rb_node node));  /* Deletes and frees an entire tree */
-EXTERN char *rb_val __P((Rb_node node));  /* Returns node->v.val
+typedef int (*Rb_cmp)(const char *key1, const char *key2);
+EXTERN Rb_node make_rb(void);
+EXTERN Rb_node rb_insert_b(Rb_node node, char *key, char *value);
+
+EXTERN Rb_node rb_find_key(Rb_node tree, const char *key);
+EXTERN Rb_node rb_find_ikey(Rb_node tree, int ikey);
+EXTERN Rb_node rb_find_ukey(Rb_node tree, unsigned long ukey);
+EXTERN Rb_node rb_find_gkey(Rb_node tree, const char *key, Rb_cmp);
+
+EXTERN Rb_node rb_find_key_n(Rb_node tree, const char *key, int *found);
+EXTERN Rb_node rb_find_ikey_n(Rb_node tree, int ikey, int *found);
+EXTERN Rb_node rb_find_ukey_n(Rb_node tree, unsigned long ukey,
+    int *found);
+EXTERN Rb_node rb_find_gkey_n(Rb_node tree, const char *key, Rb_cmp,
+    int *found);
+EXTERN void rb_delete_node(Rb_node node);
+EXTERN void rb_free_tree(Rb_node node);  /* Deletes and frees an entire tree */
+EXTERN char *rb_val(Rb_node node);  /* Returns node->v.val
 					     (this is to shut lint up */
+EXTERN void rb_print_tree(const struct rb_node * const t, int level);
+EXTERN void rb_iprint_tree(const struct rb_node * const t, int level);
+EXTERN void rb_uprint_tree(const struct rb_node * const t, int level);
+EXTERN int rb_nblack(const struct rb_node *t);
+EXTERN int rb_plength(const struct rb_node *t);
 
 #define rb_insert_a(n, k, v) rb_insert_b(n->c.list.flink, k, v)
 #define rb_insert(t, k, v) rb_insert_b(rb_find_key(t, k), k, v)
@@ -84,5 +84,5 @@
 #define rb_traverse(ptr, lst) \
   for(ptr = rb_first(lst); ptr != nil(lst); ptr = rb_next(ptr))
 
-EXTERN void recolor __P(());
-EXTERN void single_rotate __P(());
+EXTERN void recolor(Rb_node);
+EXTERN void single_rotate(Rb_node, int);
--- rb/rb.c	1994-12-05 16:57:57.000000000 -0500
+++ rb/rb.c	2012-04-07 13:22:05.000000000 -0400
@@ -37,10 +37,8 @@
 	setnormal(new);\
 }
 
-void
-mk_new_int(l, r, p, il)
-	Rb_node l, r, p;
-	int il;
+static void
+mk_new_int(Rb_node l, Rb_node r, Rb_node p, int il)
 {
 	Rb_node new;
 
@@ -71,9 +69,8 @@
 }
 
 
-Rb_node 
-lprev(n)
-	Rb_node n;
+static Rb_node 
+lprev(Rb_node n)
 {
 	if (ishead(n))
 		return (n);
@@ -85,9 +82,8 @@
 	return (n->p.parent);
 }
 
-Rb_node 
-rprev(n)
-	Rb_node n;
+static Rb_node 
+rprev(Rb_node n)
 {
 	if (ishead(n))
 		return (n);
@@ -109,24 +105,20 @@
 	head->c.list.flink = head;
 	head->c.list.blink = head;
 	head->p.root = head;
-	head->k.key = "";
+	/* head->k.key = ""; */
 	head->v.val = NULL;
 	sethead(head);
 	return (head);
 }
 
 Rb_node 
-rb_find_key_n(n, key, fnd)
-	Rb_node n;
-	char *key;
-	int *fnd;
+rb_find_key_n(Rb_node n, const char *key, int *fnd)
 {
 	int cmp;
 
 	*fnd = 0;
 	if (!ishead(n)) {
-		fprintf(stderr, "rb_find_key_n called on non-head 0x%x\n",
-		    (int)n);
+		fprintf(stderr, "%s called on non-head %p\n", __func__, n);
 		exit(1);
 	}
 	if (n->p.root == n)
@@ -156,9 +148,7 @@
 }
 
 Rb_node 
-rb_find_key(n, key)
-	Rb_node n;
-	char *key;
+rb_find_key(Rb_node n, const char *key)
 {
 	int fnd;
 
@@ -173,8 +163,7 @@
 {
 	*fnd = 0;
 	if (!ishead(n)) {
-		fprintf(stderr, "rb_find_ikey_n called on non-head 0x%x\n",
-		    (int)n);
+		fprintf(stderr, "%s called on non-head %p\n", __func__, n);
 		exit(1);
 	}
 	if (n->p.root == n)
@@ -208,8 +197,7 @@
 
 	*fnd = 0;
 	if (!ishead(n)) {
-		fprintf(stderr, "rb_find_ukey_n called on non-head 0x%x\n",
-		    (int)n);
+		fprintf(stderr, "%s called on non-head %p\n", __func__, n);
 		exit(1);
 	}
 	if (n->p.root == n)
@@ -255,18 +243,13 @@
 }
 
 Rb_node 
-rb_find_gkey_n(n, key, fxn, fnd)
-	Rb_node n;
-	char *key;
-	int (*fxn)();
-	int *fnd;
+rb_find_gkey_n(Rb_node n, const char *key, Rb_cmp fxn, int *fnd)
 {
 	int cmp;
 
 	*fnd = 0;
 	if (!ishead(n)) {
-		fprintf(stderr, "rb_find_key_n called on non-head 0x%x\n",
-		    (int)n);
+		fprintf(stderr, "%s called on non-head %p\n", __func__, n);
 		exit(1);
 	}
 	if (n->p.root == n)
@@ -296,20 +279,15 @@
 }
 
 Rb_node 
-rb_find_gkey(n, key, fxn)
-	Rb_node n;
-	char *key;
-	int (*fxn)();
+rb_find_gkey(Rb_node n, const char *key, Rb_cmp fxn)
 {
 	int fnd;
 
 	return (rb_find_gkey_n(n, key, fxn, &fnd));
 }
+
 Rb_node 
-rb_insert_b(n, key, val)
-	Rb_node n;
-	char *key;
-	char *val;
+rb_insert_b(Rb_node n, char *key, char *val)
 {
 	Rb_node newleft, newright, newnode, p;
 
@@ -346,8 +324,7 @@
 }
 
 void
-recolor(n)
-	Rb_node n;
+recolor(Rb_node n)
 {
 	Rb_node p, gp, s;
 	int done = 0;
@@ -392,9 +369,7 @@
 }
 
 void
-single_rotate(y, l)
-	Rb_node y;
-	int l;
+single_rotate(Rb_node y, int l)
 {
 	int rl, ir;
 	Rb_node x, yp;
@@ -440,20 +415,17 @@
 }
 
 void
-rb_delete_node(n)
-	Rb_node n;
+rb_delete_node(Rb_node n)
 {
 	Rb_node s, p, gp;
 	char ir;
 
 	if (isint(n)) {
-		fprintf(stderr, "Cannot delete an internal node: 0x%x\n",
-		    (int)n);
+		fprintf(stderr, "Cannot delete an internal node: %p\n", n);
 		exit(1);
 	}
 	if (ishead(n)) {
-		fprintf(stderr, "Cannot delete the head of an rb_tree: 0x%x\n",
-		    (int)n);
+		fprintf(stderr, "Cannot delete the head of an rb_tree: %p\n", n);
 		exit(1);
 	}
 	delete_item((List)n);	/* Delete it from the list */
@@ -579,120 +551,112 @@
 }
 
 void
-rb_print_tree(t, level)
-	Rb_node t;
-	int level;
+rb_print_tree(const struct rb_node * const t, int level)
 {
 	int i;
 
 	if (ishead(t) && t->p.parent == t) {
-		printf("tree 0x%x is empty\n",
-		    (int)t);
+		printf("tree %p is empty\n", t);
 	} else if (ishead(t)) {
-		printf("Head: 0x%x.  Root = 0x%x\n", (int)t, (int)t->p.root);
+		printf("Head: %p.  Root = %p\n", t, t->p.root);
 		rb_print_tree(t->p.root, 0);
 	} else {
 		if (isext(t)) {
 			for (i = 0; i < level; i++)
 				putchar(' ');
-			printf("Ext node 0x%x: %c,%c: p=0x%x, k=%s\n", (int)t,
+			printf("Ext node %p: %c,%c: p=%p, k=%s\n", t,
 			    isred(t) ? 'R' : 'B', isleft(t) ? 'l' : 'r',
-			    (int)t->p.parent, t->k.key);
+			    t->p.parent, t->k.key);
 		} else {
 			rb_print_tree(t->c.child.left, level + 2);
 			rb_print_tree(t->c.child.right, level + 2);
 			for (i = 0; i < level; i++)
 				putchar(' ');
-			printf("Int node 0x%x: %c,%c: l=0x%x, r=0x%x, p=0x%x, lr=(%s,%s)\n",
-			    (int)t, isred(t) ? 'R' : 'B', isleft(t) ? 'l' : 'r',
-			    (int)t->c.child.left, (int)t->c.child.right,
-			    (int)t->p.parent, t->k.lext->k.key,
+			printf("Int node %p: %c,%c: l=%p, r=%p, p=%p, lr=(%s,%s)\n",
+			    t, isred(t) ? 'R' : 'B', isleft(t) ? 'l' : 'r',
+			    t->c.child.left, t->c.child.right,
+			    t->p.parent, t->k.lext->k.key,
 			    t->v.rext->k.key);
 		}
 	}
 }
 
 void
-rb_iprint_tree(t, level)
-	Rb_node t;
-	int level;
+rb_iprint_tree(const struct rb_node * const t, int level)
 {
 	int i;
 
 	if (ishead(t) && t->p.parent == t) {
-		printf("tree 0x%x is empty\n", (int)t);
+		printf("tree %p is empty\n", t);
 	} else if (ishead(t)) {
-		printf("Head: 0x%x.  Root = 0x%x, < = 0x%x, > = 0x%x\n",
-		    (int)t, (int)t->p.root, (int)t->c.list.blink,
-		    (int)t->c.list.flink);
+		printf("Head: %p.  Root = %p, < = %p, > = %p\n",
+		    t, t->p.root, t->c.list.blink,
+		    t->c.list.flink);
 		rb_iprint_tree(t->p.root, 0);
 	} else {
 		if (isext(t)) {
 			for (i = 0; i < level; i++)
 				putchar(' ');
-			printf("Ext node 0x%x: %c,%c: p=0x%x, <=0x%x, >=0x%x k=%d\n",
-			    (int)t, isred(t) ? 'R' : 'B', isleft(t) ? 'l' : 'r',
-			    (int)t->p.parent, (int)t->c.list.blink,
-			    (int)t->c.list.flink, t->k.ikey);
+			printf("Ext node %p: %c,%c: p=%p, <=%p, >=%p k=%d\n",
+			    t, isred(t) ? 'R' : 'B', isleft(t) ? 'l' : 'r',
+			    t->p.parent, t->c.list.blink,
+			    t->c.list.flink, t->k.ikey);
 		} else {
 			rb_iprint_tree(t->c.child.left, level + 2);
 			rb_iprint_tree(t->c.child.right, level + 2);
 			for (i = 0; i < level; i++)
 				putchar(' ');
-			printf("Int node 0x%x: %c,%c: l=0x%x, r=0x%x, p=0x%x, lr=(%d,%d)\n",
-			    (int)t, isred(t) ? 'R' : 'B', isleft(t) ? 'l' : 'r',
-			    (int)t->c.child.left, (int)t->c.child.right,
-			    (int)t->p.parent, t->k.lext->k.ikey,
+			printf("Int node %p: %c,%c: l=%p, r=%p, p=%p, lr=(%d,%d)\n",
+			    t, isred(t) ? 'R' : 'B', isleft(t) ? 'l' : 'r',
+			    t->c.child.left, t->c.child.right,
+			    t->p.parent, t->k.lext->k.ikey,
 			    t->v.rext->k.ikey);
 		}
 	}
 }
 
 void
-rb_uprint_tree(t, level)
-	Rb_node         t;
-	int             level;
+rb_uprint_tree(const struct rb_node * const t, int level)
 {
 	int             i;
 	if (ishead(t) && t->p.parent == t) {
-		printf("tree 0x%x is empty\n", (int)t);
+		printf("tree %p is empty\n", t);
 	} else if (ishead(t)) {
-		printf("Head: 0x%x.  Root = 0x%x, < = 0x%x, > = 0x%x\n",
-		    (int)t, (int)t->p.root, (int)t->c.list.blink,
-		    (int)t->c.list.flink);
+		printf("Head: %p.  Root = %p, < = %p, > = %p\n",
+		    t, t->p.root, t->c.list.blink,
+		    t->c.list.flink);
 		rb_uprint_tree(t->p.root, 0);
 	} else {
 		if (isext(t)) {
 			for (i = 0; i < level; i++)
 				putchar(' ');
-			printf("Ext node 0x%x: %c,%c: p=0x%x, <=0x%x, >=0x%x k=%lu\n",
-			    (int)t, isred(t) ? 'R' : 'B', isleft(t) ? 'l' : 'r',
-			    (int)t->p.parent, (int)t->c.list.blink,
-			    (int)t->c.list.flink, t->k.ukey);
+			printf("Ext node %p: %c,%c: p=%p, <=%p, >=%p k=%lu\n",
+			    t, isred(t) ? 'R' : 'B', isleft(t) ? 'l' : 'r',
+			    t->p.parent, t->c.list.blink,
+			    t->c.list.flink, t->k.ukey);
 		} else {
 			rb_uprint_tree(t->c.child.left, level + 2);
 			rb_uprint_tree(t->c.child.right, level + 2);
 			for (i = 0; i < level; i++)
 				putchar(' ');
-			printf("Int node 0x%x: %c,%c: l=0x%x, r=0x%x, p=0x%x, lr=(%lu,%lu)\n",
-			    (int)t, isred(t) ? 'R' : 'B', isleft(t) ? 'l' : 'r',
-			    (int)t->c.child.left, (int)t->c.child.right,
-			    (int)t->p.parent, t->k.lext->k.ukey,
+			printf("Int node %p: %c,%c: l=%p, r=%p, p=%p, lr=(%lu,%lu)\n",
+			    t, isred(t) ? 'R' : 'B', isleft(t) ? 'l' : 'r',
+			    t->c.child.left, t->c.child.right,
+			    t->p.parent, t->k.lext->k.ukey,
 			    t->v.rext->k.ukey);
 		}
 	}
 }
 
 int
-rb_nblack(n)
-	Rb_node(n);
+rb_nblack(const struct rb_node *n)
 {
 	int nb;
 
 	if (ishead(n) || isint(n)) {
 		fprintf(stderr,
-		    "ERROR: rb_nblack called on a non-external node 0x%x\n",
-		    (int)n);
+		    "ERROR: %s called on a non-external node %p\n",
+		    __func__, n);
 		exit(1);
 	}
 	nb = 0;
@@ -705,15 +669,14 @@
 }
 
 int
-rb_plength(n)
-	Rb_node(n);
+rb_plength(const struct rb_node *n)
 {
 	int pl;
 
 	if (ishead(n) || isint(n)) {
 		fprintf(stderr,
-		    "ERROR: rb_plength called on a non-external node 0x%x\n",
-		    (int)n);
+		    "ERROR: %s called on a non-external node %p\n",
+		    __func__, n);
 		exit(1);
 	}
 	pl = 0;
@@ -725,13 +688,11 @@
 }
 
 void
-rb_free_tree(n)
-	Rb_node(n);
+rb_free_tree(Rb_node n)
 {
 
 	if (!ishead(n)) {
-		fprintf(stderr,
-		    "ERROR: Rb_free_tree called on a non-head node\n");
+		fprintf(stderr, "%s called on non-head %p\n", __func__, n);
 		exit(1);
 	}
 	while (rb_first(n) != nil(n)) {
