*/
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;
}
CONF_PAIR cp_find;
CONF_DATA cd_find;
CONF_ITEM *find;
- CONF_ITEM *ci;
if (!parent) return NULL;
}
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
#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);