diff options
Diffstat (limited to 'cpukit/libdl/rtl-chain-iterator.c')
-rw-r--r-- | cpukit/libdl/rtl-chain-iterator.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/cpukit/libdl/rtl-chain-iterator.c b/cpukit/libdl/rtl-chain-iterator.c new file mode 100644 index 0000000000..39184ee513 --- /dev/null +++ b/cpukit/libdl/rtl-chain-iterator.c @@ -0,0 +1,57 @@ +/* + * COPYRIGHT (c) 2012 Chris Johns <chrisj@rtems.org> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ +/** + * @file + * + * @ingroup rtems_rtld + * + * @brief RTEMS Run-Time Link Editor Chain Iterator + * + * A means of executing an iterator on a chain. + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include "rtl-chain-iterator.h" + +bool +rtems_rtl_chain_iterate (rtems_chain_control* chain, + rtems_chain_iterator iterator, + void* data) +{ + rtems_chain_node* node = rtems_chain_first (chain); + while (!rtems_chain_is_tail (chain, node)) + { + rtems_chain_node* next_node = rtems_chain_next (node); + if (!iterator (node, data)) + return false; + node = next_node; + } + return true; +} + +/** + * Count iterator. + */ +static bool +rtems_rtl_count_iterator (rtems_chain_node* node, void* data) +{ + int* count = data; + ++(*count); + return true; +} + +int +rtems_rtl_chain_count (rtems_chain_control* chain) +{ + int count = 0; + rtems_rtl_chain_iterate (chain, rtems_rtl_count_iterator, &count); + return count; +} |