]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add cf_item_foreach_prev()
authorAlan T. DeKok <aland@freeradius.org>
Sat, 26 Mar 2022 00:57:30 +0000 (20:57 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Sat, 26 Mar 2022 01:52:07 +0000 (21:52 -0400)
which avoids many manual calls to dlist code

src/lib/server/cf_util.c
src/lib/server/cf_util.h

index 36c3f058a886e9f5819ae1895cb09b89c5721afb..7bc249d8379397b836def5672bdaf3231340cfa1 100644 (file)
@@ -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
index 6237153494d44f192a77070cc13a96dd2108533e..c7620bb14133bf822885c0e4eaf4ed103875ef55 100644 (file)
@@ -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);