Browse Source

Plan 9 from Bell Labs 2011-03-04

David du Colombier 13 years ago
parent
commit
f52b12093c
2 changed files with 26 additions and 6 deletions
  1. 13 3
      sys/src/cmd/replica/avl.c
  2. 13 3
      sys/src/libavl/avl.c

+ 13 - 3
sys/src/cmd/replica/avl.c

@@ -92,6 +92,16 @@ balance(Avl **tp, Avl *p)
 	}
 }
 
+static int
+canoncmp(int cmp)
+{
+	if(cmp < 0)
+		return -1;
+	else if(cmp > 0)
+		return 1;
+	return 0;
+}
+
 static int
 _insertavl(Avl **tp, Avl *p, Avl *r, int (*cmp)(Avl*,Avl*), Avl **rfree)
 {
@@ -106,7 +116,7 @@ _insertavl(Avl **tp, Avl *p, Avl *r, int (*cmp)(Avl*,Avl*), Avl **rfree)
 		return 1;
 	}
 	ob = (*tp)->bal;
-	if((i=cmp(r, *tp)) != 0){
+	if((i=canoncmp(cmp(r, *tp))) != 0){
 		(*tp)->bal += i*_insertavl(&(*tp)->n[(i+1)/2], *tp, r, cmp, rfree);
 		balance(tp, p);
 		return ob==0 && (*tp)->bal != 0;
@@ -133,7 +143,7 @@ _lookupavl(Avl *t, Avl *r, int (*cmp)(Avl*,Avl*))
 	p = nil;
 	while(t != nil){
 		assert(t->p == p);
-		if((i=cmp(r, t))==0)
+		if((i=canoncmp(cmp(r, t)))==0)
 			return t;
 		p = t;
 		t = t->n[(i+1)/2];
@@ -169,7 +179,7 @@ _deleteavl(Avl **tp, Avl *p, Avl *rx, int(*cmp)(Avl*,Avl*), Avl **del, void (*pr
 		return 0;
 
 	ob = (*tp)->bal;
-	if((i=cmp(rx, *tp)) != 0){
+	if((i=canoncmp(cmp(rx, *tp))) != 0){
 		(*tp)->bal += i*_deleteavl(&(*tp)->n[(i+1)/2], *tp, rx, cmp, del, predel, arg);
 		balance(tp, p);
 		return -(ob!=0 && (*tp)->bal==0);

+ 13 - 3
sys/src/libavl/avl.c

@@ -96,6 +96,16 @@ balance(Avl **tp, Avl *p)
 	}
 }
 
+static int
+canoncmp(int cmp)
+{
+	if(cmp < 0)
+		return -1;
+	else if(cmp > 0)
+		return 1;
+	return 0;
+}
+
 static int
 _insertavl(Avl **tp, Avl *p, Avl *r, int (*cmp)(Avl*,Avl*), Avl **rfree)
 {
@@ -110,7 +120,7 @@ _insertavl(Avl **tp, Avl *p, Avl *r, int (*cmp)(Avl*,Avl*), Avl **rfree)
 		return 1;
 	}
 	ob = (*tp)->bal;
-	if((i = cmp(r, *tp)) != 0){
+	if((i = canoncmp(cmp(r, *tp))) != 0){
 		(*tp)->bal += i * _insertavl(&(*tp)->n[(i+1)/2], *tp, r, cmp,
 			rfree);
 		balance(tp, p);
@@ -158,7 +168,7 @@ _deleteavl(Avl **tp, Avl *p, Avl *rx, int(*cmp)(Avl*,Avl*), Avl **del,
 		return 0;
 
 	ob = (*tp)->bal;
-	if((i=cmp(rx, *tp)) != 0){
+	if((i=canoncmp(cmp(rx, *tp))) != 0){
 		(*tp)->bal += i * _deleteavl(&(*tp)->n[(i+1)/2], *tp, rx, cmp,
 			del, predel, arg);
 		balance(tp, p);
@@ -289,7 +299,7 @@ _lookupavl(Avl *t, Avl *r, int (*cmp)(Avl*,Avl*), int neighbor)
 		return nil;
 	do{
 		assert(t->p == p);
-		if((i = cmp(r, t)) == 0)
+		if((i = canoncmp(cmp(r, t))) == 0)
 			return t;
 		p = t;
 		t = t->n[(i+1)/2];