From 25f4813c23c04ddaa1c9322b8ef1d67270de67bf Mon Sep 17 00:00:00 2001 From: "Alan T. DeKok" Date: Fri, 25 Mar 2022 20:57:30 -0400 Subject: [PATCH] add cf_item_foreach_prev() which avoids many manual calls to dlist code --- src/lib/server/cf_util.c | 30 +++++++++++++----------------- src/lib/server/cf_util.h | 10 ++++++++++ 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/lib/server/cf_util.c b/src/lib/server/cf_util.c index 36c3f058a8..7bc249d837 100644 --- a/src/lib/server/cf_util.c +++ b/src/lib/server/cf_util.c @@ -47,9 +47,7 @@ static int8_t _cf_ident2_cmp(void const *a, void const *b); */ static CONF_ITEM *cf_next(CONF_ITEM const *parent, CONF_ITEM const *prev, CONF_ITEM_TYPE type) { - CONF_ITEM *ci = UNCONST(CONF_ITEM *, prev); - - while ((ci = fr_dlist_next(&parent->children, ci))) { + cf_item_foreach_prev(parent, ci, UNCONST(CONF_ITEM *, prev)) { if (ci->type == type) return ci; } @@ -158,7 +156,6 @@ static CONF_ITEM *cf_find_next(CONF_ITEM const *parent, CONF_ITEM const *prev, CONF_PAIR cp_find; CONF_DATA cd_find; CONF_ITEM *find; - CONF_ITEM *ci; if (!parent) return NULL; @@ -203,28 +200,27 @@ static CONF_ITEM *cf_find_next(CONF_ITEM const *parent, CONF_ITEM const *prev, } if (IS_WILDCARD(ident1)) { - for (ci = fr_dlist_next(&parent->children, prev); - ci && (cf_ident2_cmp(ci, find) != 0); - ci = fr_dlist_next(&parent->children, ci)); + cf_item_foreach_prev(parent, ci, prev) { + if (cf_ident2_cmp(ci, find) == 0) return ci; + } - return ci; + return NULL; } if (IS_WILDCARD(ident2)) { - for (ci = fr_dlist_next(&parent->children, prev); - ci && (_cf_ident1_cmp(ci, find) != 0); - ci = fr_dlist_next(&parent->children, ci)) { - fr_assert(fr_dlist_next(&parent->children, ci) != ci); + cf_item_foreach_prev(parent, ci, prev) { + if (_cf_ident1_cmp(ci, find) == 0) return ci; + } - return ci; + return NULL; } - for (ci = fr_dlist_next(&parent->children, prev); - ci && (_cf_ident2_cmp(ci, find) != 0); - ci = fr_dlist_next(&parent->children, ci)); + cf_item_foreach_prev(parent, ci, prev) { + if (_cf_ident2_cmp(ci, find) == 0) return ci; + } - return ci; + return NULL; } /** Compare the first identifier of a child diff --git a/src/lib/server/cf_util.h b/src/lib/server/cf_util.h index 6237153494..c7620bb141 100644 --- a/src/lib/server/cf_util.h +++ b/src/lib/server/cf_util.h @@ -101,6 +101,16 @@ CONF_ITEM *_cf_item_next(CONF_ITEM const *ci, CONF_ITEM const *prev); #define cf_item_foreach(_ci, _iter) \ for (CONF_ITEM *_iter = fr_dlist_head(&(_ci)->children); _iter; _iter = fr_dlist_next(&(_ci)->children, _iter)) +/** Iterate over the contents of a list + * + * @param[in] _ci to iterate over. + * @param[in] _iter Name of iteration variable. + * Will be declared in the scope of the loop. + * @param[in] _prev previous pointer + */ +#define cf_item_foreach_prev(_ci, _iter, _prev) \ + for (CONF_ITEM *_iter = fr_dlist_next(&(_ci)->children, _prev); _iter; _iter = fr_dlist_next(&(_ci)->children, _iter)) + #define cf_root(_cf) _cf_root(CF_TO_ITEM(_cf)) CONF_SECTION *_cf_root(CONF_ITEM const *ci); -- 2.47.2