diff options
-rw-r--r-- | sys/sys/tree.h | 30 |
1 files changed, 11 insertions, 19 deletions
diff --git a/sys/sys/tree.h b/sys/sys/tree.h index c2157eea488a..3af9a2b14406 100644 --- a/sys/sys/tree.h +++ b/sys/sys/tree.h @@ -643,29 +643,21 @@ name##_RB_FIND(struct name *head, struct type *elm) \ attr struct type * \ name##_RB_NFIND(struct name *head, struct type *elm) \ { \ - struct type *ret = RB_ROOT(head); \ - struct type *tmp; \ + struct type *tmp = RB_ROOT(head); \ + struct type *res = NULL; \ int comp; \ - while (ret && (comp = cmp(elm, ret)) != 0) { \ + while (tmp) { \ + comp = cmp(elm, tmp); \ if (comp < 0) { \ - if ((tmp = RB_LEFT(ret, field)) == NULL) \ - break; \ - ret = tmp; \ - } else { \ - if ((tmp = RB_RIGHT(ret, field)) == NULL) { \ - tmp = ret; \ - ret = RB_PARENT(ret, field); \ - while (ret && tmp == RB_RIGHT(ret, \ - field)) { \ - tmp = ret; \ - ret = RB_PARENT(ret, field); \ - } \ - break; \ - } \ - ret = tmp; \ + res = tmp; \ + tmp = RB_LEFT(tmp, field); \ } \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ } \ - return (ret); \ + return (res); \ } \ \ /* ARGSUSED */ \ |