From eebf2dd89ba905c52ec00ed321a9c246e00598f8 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Fri, 5 May 2017 12:12:43 +0200 Subject: [PATCH] libsmartcols: add scols_line_is_ancestor() Signed-off-by: Karel Zak --- libsmartcols/docs/libsmartcols-sections.txt | 1 + libsmartcols/src/libsmartcols.h.in | 1 + libsmartcols/src/libsmartcols.sym | 1 + libsmartcols/src/line.c | 19 +++++++++++++++++++ 4 files changed, 22 insertions(+) diff --git a/libsmartcols/docs/libsmartcols-sections.txt b/libsmartcols/docs/libsmartcols-sections.txt index a55716db9..13a35646b 100644 --- a/libsmartcols/docs/libsmartcols-sections.txt +++ b/libsmartcols/docs/libsmartcols-sections.txt @@ -71,6 +71,7 @@ scols_line_get_ncells scols_line_get_parent scols_line_get_userdata scols_line_has_children +scols_line_is_ancestor scols_line_next_child scols_line_refer_column_data scols_line_refer_data diff --git a/libsmartcols/src/libsmartcols.h.in b/libsmartcols/src/libsmartcols.h.in index 1ff465e44..e77af857a 100644 --- a/libsmartcols/src/libsmartcols.h.in +++ b/libsmartcols/src/libsmartcols.h.in @@ -193,6 +193,7 @@ extern void *scols_line_get_userdata(struct libscols_line *ln); extern int scols_line_remove_child(struct libscols_line *ln, struct libscols_line *child); extern int scols_line_add_child(struct libscols_line *ln, struct libscols_line *child); extern int scols_line_has_children(struct libscols_line *ln); +extern int scols_line_is_ancestor(struct libscols_line *ln, struct libscols_line *parent); extern int scols_line_next_child(struct libscols_line *ln, struct libscols_iter *itr, struct libscols_line **chld); extern struct libscols_line *scols_line_get_parent(const struct libscols_line *ln); diff --git a/libsmartcols/src/libsmartcols.sym b/libsmartcols/src/libsmartcols.sym index 95fcc3167..174122e49 100644 --- a/libsmartcols/src/libsmartcols.sym +++ b/libsmartcols/src/libsmartcols.sym @@ -164,4 +164,5 @@ global: scols_cell_get_alignment; scols_table_move_column; scols_sort_table_by_tree; + scols_line_is_ancestor; } SMARTCOLS_2.29; diff --git a/libsmartcols/src/line.c b/libsmartcols/src/line.c index 1c3141a16..134bf2d8e 100644 --- a/libsmartcols/src/line.c +++ b/libsmartcols/src/line.c @@ -307,6 +307,25 @@ int scols_line_next_child(struct libscols_line *ln, return rc; } + +/** + * scols_line_is_ancestor: + * @ln: line + * @parent: potential parent + * + * The function is designed to detect circular dependencies between @ln and + * @parent. It checks if @ln is not any (grand) parent in the @parent's tree. + */ +int scols_line_is_ancestor(struct libscols_line *ln, struct libscols_line *parent) +{ + while (parent) { + if (parent == ln) + return 1; + parent = scols_line_get_parent(parent); + }; + return 0; +} + /** * scols_line_set_color: * @ln: a pointer to a struct libscols_line instance