From: Ondřej Surý Date: Thu, 19 Oct 2023 08:21:20 +0000 (+0200) Subject: Add ISC_LIST_FOREACH_REV(_SAFE) macros X-Git-Tag: v9.19.18~24^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d2e84a4b9713b85beaf5604ff67f3530c5a96a15;p=thirdparty%2Fbind9.git 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 --- diff --git a/.clang-format b/.clang-format index 124d82a2696..54a39fdb4d4 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 a168254d40b..67ed208c2c0 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 */