#include <freeradius-devel/util/dcursor.h>
#include <freeradius-devel/util/pair.h>
-static void *fr_dcursor_intersect_next(fr_dcursor_t *a, fr_dcursor_t *b);
-
/** Return the first item matching the iterator in cursor a and cursor b
*
* If a and b are not currently set to the same item, b will be reset,
*
* @hidecallergraph
*/
-static void *fr_dcursor_intersect_head(fr_dcursor_t *a, fr_dcursor_t *b)
+void *fr_dcursor_intersect_head(fr_dcursor_t *a, fr_dcursor_t *b)
{
void *a_item, *b_item;
*
* @hidecallergraph
*/
-static void *fr_dcursor_intersect_next(fr_dcursor_t *a, fr_dcursor_t *b)
+void *fr_dcursor_intersect_next(fr_dcursor_t *a, fr_dcursor_t *b)
{
void *a_next, *b_next;
#include <stddef.h>
#include <stdbool.h>
+DIAG_OFF(unused-function)
typedef struct fr_dcursor_s fr_dcursor_t;
/** Callback for implementing custom iterators
*
* @hidecallergraph
*/
+CC_HINT(nonnull)
static inline void fr_dcursor_copy(fr_dcursor_t *out, fr_dcursor_t const *in)
{
memcpy(out, in, sizeof(*out));
return stack;
}
+void *fr_dcursor_intersect_head(fr_dcursor_t *a, fr_dcursor_t *b);
+
+void *fr_dcursor_intersect_next(fr_dcursor_t *a, fr_dcursor_t *b);
+
+DIAG_OFF(unused-function)
+
/** Expands to the type name used for the dcursor wrapper structure
*
* @param[in] _name Prefix we add to type-specific structures.
\
static inline CC_HINT(nonnull) _element_type *_name ## _next(FR_DCURSOR(_name) *dcursor) \
{ return (_element_type *)fr_dcursor_next(&dcursor->dcursor); } \
+\
+ static inline CC_HINT(nonnull) void _name ## _copy(FR_DCURSOR(_name) *out, \
+ FR_DCURSOR(_name) const *in) \
+ { fr_dcursor_copy(&out->dcursor, &in->dcursor); } \
\
static inline CC_HINT(nonnull) _element_type *_name ## _head(FR_DCURSOR(_name) *dcursor) \
{ return (_element_type *)fr_dcursor_head(&dcursor->dcursor); } \
static inline CC_HINT(nonnull) void _name ## _merge(FR_DCURSOR(_name) *cursor, \
FR_DCURSOR(_name) *to_append) \
{ fr_dcursor_merge(&cursor->dcursor, &to_append->dcursor); } \
-\
- static inline CC_HINT(nonnull) void _name ## _copy(FR_DCURSOR(_name) *out, \
- FR_DCURSOR(_name) const *in) \
- { fr_dcursor_copy(&out->dcursor, &in->dcursor); } \
\
static inline CC_HINT(nonnull) void _name ## _free_list(FR_DCURSOR(_name) *dcursor) \
{ fr_dcursor_free_list(&dcursor->dcursor); } \
#endif
#include <freeradius-devel/build.h>
+#include <freeradius-devel/util/dcursor.h>
#include <freeradius-devel/missing.h>
#include <freeradius-devel/util/dbuff.h>
#include <freeradius-devel/util/debug.h>
#include <freeradius-devel/util/log.h>
#include <freeradius-devel/util/strerror.h>
#include <freeradius-devel/util/table.h>
+#include <freeradius-devel/util/time.h>
#include <freeradius-devel/util/token.h>
#include <freeradius-devel/util/types.h>
-#include <freeradius-devel/util/time.h>
#ifdef __cplusplus
extern "C" {
extern fr_sbuff_escape_rules_t fr_value_escape_unprintables;
+/** @name List and cursor type definitions
+ */
FR_DLIST_TYPES(fr_value_box_list)
+FR_DCURSOR_DLIST_TYPES(fr_value_box_dcursor, fr_value_box_list, fr_value_box_t)
+/** @} */
/** Union containing all data types supported by the server
*
FR_DLIST_ENTRY(fr_value_box_list) entry; //!< Doubly linked list entry.
};
+/** @name List and cursor function definitions
+ */
FR_DLIST_FUNCS(fr_value_box_list, fr_value_box_t, entry)
#define fr_value_box_list_foreach(_list_head, _iter) fr_dlist_foreach(fr_value_box_list_dlist_head(_list_head), fr_value_box_t, _iter)
#define fr_value_box_list_foreach_safe(_list_head, _iter) fr_dlist_foreach_safe(fr_value_box_list_dlist_head(_list_head), fr_value_box_t, _iter)
#define fr_value_box_list_verify(_list_head) _fr_value_box_list_verify(__FILE__, __LINE__, _list_head)
+FR_DCURSOR_FUNCS(fr_value_box_dcursor, fr_value_box_list, fr_value_box_t)
+/** @} */
+
/** Actions to perform when we process a box in a list
*
*/
*
* @{
*/
-#define fr_value_box_foreach(_v, _iv) for (fr_value_box_t *_iv = fr_dlist_head(_v); _iv; _iv = fr_dlist_next(_v, _iv))
-
/** Determines whether a list contains the number of boxes required
*
* @param[in] list of value boxes.