diff options
author | Chris Davis <cd.rattan@gmail.com> | 2014-08-02 17:29:31 -0700 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2014-10-01 14:32:09 +0200 |
commit | fd95b0aa96067d4c9ce60b73168bf9fe5c95ffac (patch) | |
tree | ecf924a9d5d12054cd1cb5c4c635e951e87d2d24 /source3/utils/regedit_treeview.c | |
parent | bcab659516382d5dc51b1558a895a9a26d81c6b8 (diff) | |
download | samba-fd95b0aa96067d4c9ce60b73168bf9fe5c95ffac.tar.gz samba-fd95b0aa96067d4c9ce60b73168bf9fe5c95ffac.tar.xz samba-fd95b0aa96067d4c9ce60b73168bf9fe5c95ffac.zip |
regedit: find previous items
Signed-off-by: Chris Davis <cd.rattan@gmail.com>
Reviewed-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
Diffstat (limited to 'source3/utils/regedit_treeview.c')
-rw-r--r-- | source3/utils/regedit_treeview.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/source3/utils/regedit_treeview.c b/source3/utils/regedit_treeview.c index cf071de3d8..4c68feab8b 100644 --- a/source3/utils/regedit_treeview.c +++ b/source3/utils/regedit_treeview.c @@ -342,6 +342,30 @@ static WERROR next_depth_first(struct tree_node **node) return rv; } +static WERROR prev_depth_first(struct tree_node **node) +{ + WERROR rv = WERR_OK; + + SMB_ASSERT(node != NULL && *node != NULL); + + if ((*node)->previous) { + *node = (*node)->previous; + while (tree_node_has_children(*node)) { + rv = tree_node_load_children(*node); + if (W_ERROR_IS_OK(rv)) { + SMB_ASSERT((*node)->child_head != NULL); + *node = tree_node_last((*node)->child_head); + } + } + } else if (!tree_node_is_top_level(*node)) { + *node = (*node)->parent; + } else { + *node = NULL; + } + + return rv; +} + bool tree_node_next(struct tree_node **node, bool depth, WERROR *err) { *err = WERR_OK; @@ -359,6 +383,23 @@ bool tree_node_next(struct tree_node **node, bool depth, WERROR *err) return *node != NULL && W_ERROR_IS_OK(*err); } +bool tree_node_prev(struct tree_node **node, bool depth, WERROR *err) +{ + *err = WERR_OK; + + if (*node == NULL) { + return false; + } + + if (depth) { + *err = prev_depth_first(node); + } else { + *node = (*node)->previous; + } + + return *node != NULL && W_ERROR_IS_OK(*err); +} + void tree_view_clear(struct tree_view *view) { multilist_set_data(view->list, NULL); |