diff --git a/include/queue.h b/include/queue.h index e18d9f0b7f..d0953ed848 100644 --- a/include/queue.h +++ b/include/queue.h @@ -135,6 +135,8 @@ extern "C" #define EXTERN extern #endif +/* Add nodes to queues */ + void sq_addfirst(FAR sq_entry_t *node, FAR sq_queue_t *queue); void dq_addfirst(FAR dq_entry_t *node, FAR dq_queue_t *queue); void sq_addlast(FAR sq_entry_t *node, FAR sq_queue_t *queue); @@ -146,9 +148,13 @@ void dq_addafter(FAR dq_entry_t *prev, FAR dq_entry_t *node, void dq_addbefore(FAR dq_entry_t *next, FAR dq_entry_t *node, FAR dq_queue_t *queue); +/* Combine queues */ + void sq_cat(FAR sq_queue_t *queue1, FAR sq_queue_t *queue2); void dq_cat(FAR dq_queue_t *queue1, FAR dq_queue_t *queue2); +/* Remove nodes from queues */ + FAR sq_entry_t *sq_remafter(FAR sq_entry_t *node, FAR sq_queue_t *queue); void sq_rem(FAR sq_entry_t *node, FAR sq_queue_t *queue); void dq_rem(FAR dq_entry_t *node, FAR dq_queue_t *queue); @@ -157,6 +163,11 @@ FAR dq_entry_t *dq_remlast(FAR dq_queue_t *queue); FAR sq_entry_t *sq_remfirst(FAR sq_queue_t *queue); FAR dq_entry_t *dq_remfirst(FAR dq_queue_t *queue); +/* Count nodes in queues */ + +size_t sq_count(FAR sq_queue_t *queue); +size_t dq_count(FAR dq_queue_t *queue); + #undef EXTERN #ifdef __cplusplus } diff --git a/libc/queue/Make.defs b/libc/queue/Make.defs index adc10fd2c5..6b85ffd8a2 100644 --- a/libc/queue/Make.defs +++ b/libc/queue/Make.defs @@ -36,9 +36,9 @@ # Add the queue C files to the build CSRCS += sq_addlast.c sq_addfirst.c sq_addafter.c sq_cat.c -CSRCS += sq_rem.c sq_remlast.c sq_remfirst.c sq_remafter.c +CSRCS += sq_rem.c sq_remlast.c sq_remfirst.c sq_remafter.c sq_count.c CSRCS += dq_addlast.c dq_addfirst.c dq_addafter.c dq_addbefore.c dq_cat.c -CSRCS += dq_rem.c dq_remlast.c dq_remfirst.c +CSRCS += dq_rem.c dq_remlast.c dq_remfirst.c dq_count.c # Add the queue directory to the build diff --git a/libc/queue/dq_count.c b/libc/queue/dq_count.c new file mode 100644 index 0000000000..c62924a360 --- /dev/null +++ b/libc/queue/dq_count.c @@ -0,0 +1,69 @@ +/**************************************************************************** + * libc/queue/dq_count.c + * + * Copyright (C) 2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: dq_count + * + * Description: + * Return the number of nodes in the queue. + * + ****************************************************************************/ + +size_t dq_count(FAR dq_queue_t *queue) +{ + FAR dq_entry_t *node; + size_t count; + + DEBUGASSERT(queue != NULL); + + for (node = queue->head, count = 0; + node != NULL; + node = node->flink, count++); + + return count; +} diff --git a/libc/queue/sq_count.c b/libc/queue/sq_count.c new file mode 100644 index 0000000000..7f7bb155c4 --- /dev/null +++ b/libc/queue/sq_count.c @@ -0,0 +1,69 @@ +/**************************************************************************** + * libc/queue/sq_count.c + * + * Copyright (C) 2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: sq_count + * + * Description: + * Return the number of nodes in the queue. + * + ****************************************************************************/ + +size_t sq_count(FAR sq_queue_t *queue) +{ + FAR sq_entry_t *node; + size_t count; + + DEBUGASSERT(queue != NULL); + + for (node = queue->head, count = 0; + node != NULL; + node = node->flink, count++); + + return count; +}