mirror of
https://github.com/tmate-io/tmate.git
synced 2025-04-10 10:58:51 +02:00
tree.h has RB_PREV now, yay!
This commit is contained in:
parent
2c78ea745b
commit
85d520c41e
@ -1,5 +1,4 @@
|
|||||||
/* $Id: tree.h,v 1.1 2007-10-31 14:26:26 nicm Exp $ */
|
/* $OpenBSD: tree.h,v 1.11 2008/05/11 22:19:09 millert Exp $ */
|
||||||
/* $OpenBSD: tree.h,v 1.9 2004/11/24 18:10:42 tdeval Exp $ */
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2002 Niels Provos <provos@citi.umich.edu>
|
* Copyright 2002 Niels Provos <provos@citi.umich.edu>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
@ -375,20 +374,30 @@ struct { \
|
|||||||
|
|
||||||
/* Generates prototypes and inline functions */
|
/* Generates prototypes and inline functions */
|
||||||
#define RB_PROTOTYPE(name, type, field, cmp) \
|
#define RB_PROTOTYPE(name, type, field, cmp) \
|
||||||
void name##_RB_INSERT_COLOR(struct name *, struct type *); \
|
RB_PROTOTYPE_INTERNAL(name, type, field, cmp,)
|
||||||
void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\
|
#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \
|
||||||
struct type *name##_RB_REMOVE(struct name *, struct type *); \
|
RB_PROTOTYPE_INTERNAL(name, type, field, cmp, __attribute__((__unused__)) static)
|
||||||
struct type *name##_RB_INSERT(struct name *, struct type *); \
|
#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \
|
||||||
struct type *name##_RB_FIND(struct name *, struct type *); \
|
attr void name##_RB_INSERT_COLOR(struct name *, struct type *); \
|
||||||
struct type *name##_RB_NEXT(struct type *); \
|
attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\
|
||||||
struct type *name##_RB_MINMAX(struct name *, int); \
|
attr struct type *name##_RB_REMOVE(struct name *, struct type *); \
|
||||||
|
attr struct type *name##_RB_INSERT(struct name *, struct type *); \
|
||||||
|
attr struct type *name##_RB_FIND(struct name *, struct type *); \
|
||||||
|
attr struct type *name##_RB_NFIND(struct name *, struct type *); \
|
||||||
|
attr struct type *name##_RB_NEXT(struct type *); \
|
||||||
|
attr struct type *name##_RB_PREV(struct type *); \
|
||||||
|
attr struct type *name##_RB_MINMAX(struct name *, int); \
|
||||||
\
|
\
|
||||||
|
|
||||||
/* Main rb operation.
|
/* Main rb operation.
|
||||||
* Moves node close to the key of elm to top
|
* Moves node close to the key of elm to top
|
||||||
*/
|
*/
|
||||||
#define RB_GENERATE(name, type, field, cmp) \
|
#define RB_GENERATE(name, type, field, cmp) \
|
||||||
void \
|
RB_GENERATE_INTERNAL(name, type, field, cmp,)
|
||||||
|
#define RB_GENERATE_STATIC(name, type, field, cmp) \
|
||||||
|
RB_GENERATE_INTERNAL(name, type, field, cmp, __attribute__((__unused__)) static)
|
||||||
|
#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \
|
||||||
|
attr void \
|
||||||
name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
|
name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
|
||||||
{ \
|
{ \
|
||||||
struct type *parent, *gparent, *tmp; \
|
struct type *parent, *gparent, *tmp; \
|
||||||
@ -432,7 +441,7 @@ name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
|
|||||||
RB_COLOR(head->rbh_root, field) = RB_BLACK; \
|
RB_COLOR(head->rbh_root, field) = RB_BLACK; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
void \
|
attr void \
|
||||||
name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \
|
name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \
|
||||||
{ \
|
{ \
|
||||||
struct type *tmp; \
|
struct type *tmp; \
|
||||||
@ -508,7 +517,7 @@ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm)
|
|||||||
RB_COLOR(elm, field) = RB_BLACK; \
|
RB_COLOR(elm, field) = RB_BLACK; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
struct type * \
|
attr struct type * \
|
||||||
name##_RB_REMOVE(struct name *head, struct type *elm) \
|
name##_RB_REMOVE(struct name *head, struct type *elm) \
|
||||||
{ \
|
{ \
|
||||||
struct type *child, *parent, *old = elm; \
|
struct type *child, *parent, *old = elm; \
|
||||||
@ -576,7 +585,7 @@ color: \
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
/* Inserts a node into the RB tree */ \
|
/* Inserts a node into the RB tree */ \
|
||||||
struct type * \
|
attr struct type * \
|
||||||
name##_RB_INSERT(struct name *head, struct type *elm) \
|
name##_RB_INSERT(struct name *head, struct type *elm) \
|
||||||
{ \
|
{ \
|
||||||
struct type *tmp; \
|
struct type *tmp; \
|
||||||
@ -607,7 +616,7 @@ name##_RB_INSERT(struct name *head, struct type *elm) \
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
/* Finds the node with the same key as elm */ \
|
/* Finds the node with the same key as elm */ \
|
||||||
struct type * \
|
attr struct type * \
|
||||||
name##_RB_FIND(struct name *head, struct type *elm) \
|
name##_RB_FIND(struct name *head, struct type *elm) \
|
||||||
{ \
|
{ \
|
||||||
struct type *tmp = RB_ROOT(head); \
|
struct type *tmp = RB_ROOT(head); \
|
||||||
@ -624,7 +633,29 @@ name##_RB_FIND(struct name *head, struct type *elm) \
|
|||||||
return (NULL); \
|
return (NULL); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
struct type * \
|
/* Finds the first node greater than or equal to the search key */ \
|
||||||
|
attr struct type * \
|
||||||
|
name##_RB_NFIND(struct name *head, struct type *elm) \
|
||||||
|
{ \
|
||||||
|
struct type *tmp = RB_ROOT(head); \
|
||||||
|
struct type *res = NULL; \
|
||||||
|
int comp; \
|
||||||
|
while (tmp) { \
|
||||||
|
comp = cmp(elm, tmp); \
|
||||||
|
if (comp < 0) { \
|
||||||
|
res = tmp; \
|
||||||
|
tmp = RB_LEFT(tmp, field); \
|
||||||
|
} \
|
||||||
|
else if (comp > 0) \
|
||||||
|
tmp = RB_RIGHT(tmp, field); \
|
||||||
|
else \
|
||||||
|
return (tmp); \
|
||||||
|
} \
|
||||||
|
return (res); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
/* ARGSUSED */ \
|
||||||
|
attr struct type * \
|
||||||
name##_RB_NEXT(struct type *elm) \
|
name##_RB_NEXT(struct type *elm) \
|
||||||
{ \
|
{ \
|
||||||
if (RB_RIGHT(elm, field)) { \
|
if (RB_RIGHT(elm, field)) { \
|
||||||
@ -645,7 +676,29 @@ name##_RB_NEXT(struct type *elm) \
|
|||||||
return (elm); \
|
return (elm); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
struct type * \
|
/* ARGSUSED */ \
|
||||||
|
attr struct type * \
|
||||||
|
name##_RB_PREV(struct type *elm) \
|
||||||
|
{ \
|
||||||
|
if (RB_LEFT(elm, field)) { \
|
||||||
|
elm = RB_LEFT(elm, field); \
|
||||||
|
while (RB_RIGHT(elm, field)) \
|
||||||
|
elm = RB_RIGHT(elm, field); \
|
||||||
|
} else { \
|
||||||
|
if (RB_PARENT(elm, field) && \
|
||||||
|
(elm == RB_RIGHT(RB_PARENT(elm, field), field))) \
|
||||||
|
elm = RB_PARENT(elm, field); \
|
||||||
|
else { \
|
||||||
|
while (RB_PARENT(elm, field) && \
|
||||||
|
(elm == RB_LEFT(RB_PARENT(elm, field), field)))\
|
||||||
|
elm = RB_PARENT(elm, field); \
|
||||||
|
elm = RB_PARENT(elm, field); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
return (elm); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
attr struct type * \
|
||||||
name##_RB_MINMAX(struct name *head, int val) \
|
name##_RB_MINMAX(struct name *head, int val) \
|
||||||
{ \
|
{ \
|
||||||
struct type *tmp = RB_ROOT(head); \
|
struct type *tmp = RB_ROOT(head); \
|
||||||
@ -666,7 +719,9 @@ name##_RB_MINMAX(struct name *head, int val) \
|
|||||||
#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y)
|
#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y)
|
||||||
#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y)
|
#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y)
|
||||||
#define RB_FIND(name, x, y) name##_RB_FIND(x, y)
|
#define RB_FIND(name, x, y) name##_RB_FIND(x, y)
|
||||||
|
#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y)
|
||||||
#define RB_NEXT(name, x, y) name##_RB_NEXT(y)
|
#define RB_NEXT(name, x, y) name##_RB_NEXT(y)
|
||||||
|
#define RB_PREV(name, x, y) name##_RB_PREV(y)
|
||||||
#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF)
|
#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF)
|
||||||
#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF)
|
#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF)
|
||||||
|
|
||||||
@ -675,4 +730,9 @@ name##_RB_MINMAX(struct name *head, int val) \
|
|||||||
(x) != NULL; \
|
(x) != NULL; \
|
||||||
(x) = name##_RB_NEXT(x))
|
(x) = name##_RB_NEXT(x))
|
||||||
|
|
||||||
|
#define RB_FOREACH_REVERSE(x, name, head) \
|
||||||
|
for ((x) = RB_MAX(name, head); \
|
||||||
|
(x) != NULL; \
|
||||||
|
(x) = name##_RB_PREV(x))
|
||||||
|
|
||||||
#endif /* _SYS_TREE_H_ */
|
#endif /* _SYS_TREE_H_ */
|
||||||
|
17
window.c
17
window.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: window.c,v 1.36 2008-05-31 20:04:15 nicm Exp $ */
|
/* $Id: window.c,v 1.37 2008-06-03 18:38:51 nicm Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -139,20 +139,9 @@ winlink_next(unused struct winlinks *wwl, struct winlink *wl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct winlink *
|
struct winlink *
|
||||||
winlink_previous(struct winlinks *wwl, struct winlink *wl)
|
winlink_previous(unused struct winlinks *wwl, struct winlink *wl)
|
||||||
{
|
{
|
||||||
struct winlink *wk;
|
return (RB_PREV(winlinks, wwl, wl));
|
||||||
int idx = wl->idx;
|
|
||||||
|
|
||||||
wk = NULL;
|
|
||||||
wl = RB_MIN(winlinks, wwl);
|
|
||||||
while (wl != NULL && wl->idx < idx) {
|
|
||||||
wk = wl;
|
|
||||||
wl = RB_NEXT(winlinks, wwl, wl);
|
|
||||||
}
|
|
||||||
if (wl == NULL)
|
|
||||||
return (NULL);
|
|
||||||
return (wk);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct window *
|
struct window *
|
||||||
|
Loading…
Reference in New Issue
Block a user