From: Alan T. DeKok Date: Sat, 26 Mar 2022 00:57:30 +0000 (-0400) Subject: add cf_item_foreach_prev() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=25f4813c23c04ddaa1c9322b8ef1d67270de67bf;p=thirdparty%2Ffreeradius-server.git add cf_item_foreach_prev() which avoids many manual calls to dlist code --- 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);