From d2e84a4b9713b85beaf5604ff67f3530c5a96a15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Thu, 19 Oct 2023 10:21:20 +0200 Subject: [PATCH] Add ISC_LIST_FOREACH_REV(_SAFE) macros Add complementary macros to ISC_LIST_FOREACH(_SAFE) that walk the lists in reverse. * ISC_LIST_FOREACH_REV(list, elt, link) - walk the static list from tail to head * ISC_LIST_FOREACH_REV_SAFE(list, elt, link, next) - walk the list from tail to head in a manner that's safe against list member deletions --- .clang-format | 2 +- lib/isc/include/isc/list.h | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.clang-format b/.clang-format index 124d82a269..54a39fdb4d 100644 --- a/.clang-format +++ b/.clang-format @@ -78,4 +78,4 @@ PenaltyBreakString: 80 PenaltyExcessCharacter: 100 Standard: Cpp11 ContinuationIndentWidth: 8 -ForEachMacros: [ 'cds_lfs_for_each', 'cds_lfs_for_each_safe', 'cds_list_for_each_entry_safe', 'ISC_LIST_FOREACH', 'ISC_LIST_FOREACH_SAFE' ] +ForEachMacros: [ 'cds_lfs_for_each', 'cds_lfs_for_each_safe', 'cds_list_for_each_entry_safe', 'ISC_LIST_FOREACH', 'ISC_LIST_FOREACH_SAFE', 'ISC_LIST_FOREACH_REV', 'ISC_LIST_FOREACH_REV_SAFE' ] diff --git a/lib/isc/include/isc/list.h b/lib/isc/include/isc/list.h index a168254d40..67ed208c2c 100644 --- a/lib/isc/include/isc/list.h +++ b/lib/isc/include/isc/list.h @@ -241,3 +241,17 @@ elt != NULL; \ elt = next, next = (elt != NULL) ? ISC_LIST_NEXT(elt, link) : NULL) /* clang-format on */ + +/* clang-format off */ +#define ISC_LIST_FOREACH_REV(list, elt, link) \ + for (elt = ISC_LIST_TAIL(list); \ + elt != NULL; \ + elt = ISC_LIST_PREV(elt, link)) +/* clang-format on */ + +/* clang-format off */ +#define ISC_LIST_FOREACH_REV_SAFE(list, elt, link, prev) \ + for (elt = ISC_LIST_TAIL(list), prev = (elt != NULL) ? ISC_LIST_PREV(elt, link) : NULL; \ + elt != NULL; \ + elt = prev, prev = (elt != NULL) ? ISC_LIST_PREV(elt, link) : NULL) +/* clang-format on */