should have done this a long time ago. allow compare to return <0, 0 or >0, not just -1, 0, 1. Reference: /n/atom/patch/applied/avlcannoncmp Date: Thu Mar 20 19:55:50 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/libavl/avl.c Thu Mar 20 19:55:22 2014 +++ /sys/src/libavl/avl.c Thu Mar 20 19:55:22 2014 @@ -97,6 +97,16 @@ } 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) { int i, ob; @@ -110,7 +120,7 @@ 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 @@ 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 @@ 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];