The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/ncsw/inc/etc/list_ext.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* Copyright (c) 2008-2012 Freescale Semiconductor, Inc
    2  * All rights reserved.
    3  *
    4  * Redistribution and use in source and binary forms, with or without
    5  * modification, are permitted provided that the following conditions are met:
    6  *     * Redistributions of source code must retain the above copyright
    7  *       notice, this list of conditions and the following disclaimer.
    8  *     * Redistributions in binary form must reproduce the above copyright
    9  *       notice, this list of conditions and the following disclaimer in the
   10  *       documentation and/or other materials provided with the distribution.
   11  *     * Neither the name of Freescale Semiconductor nor the
   12  *       names of its contributors may be used to endorse or promote products
   13  *       derived from this software without specific prior written permission.
   14  *
   15  *
   16  * ALTERNATIVELY, this software may be distributed under the terms of the
   17  * GNU General Public License ("GPL") as published by the Free Software
   18  * Foundation, either version 2 of that License or (at your option) any
   19  * later version.
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
   22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   24  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
   25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   31  */
   32 
   33 
   34 /**************************************************************************//**
   35 
   36  @File          list_ext.h
   37 
   38  @Description   External prototypes for list.c
   39 *//***************************************************************************/
   40 
   41 #ifndef __LIST_EXT_H
   42 #define __LIST_EXT_H
   43 
   44 
   45 #include "std_ext.h"
   46 
   47 
   48 /**************************************************************************//**
   49  @Group         etc_id   Utility Library Application Programming Interface
   50 
   51  @Description   External routines.
   52 
   53  @{
   54 *//***************************************************************************/
   55 
   56 /**************************************************************************//**
   57  @Group         list_id List
   58 
   59  @Description   List module functions,definitions and enums.
   60 
   61  @{
   62 *//***************************************************************************/
   63 
   64 /**************************************************************************//**
   65  @Description   List structure.
   66 *//***************************************************************************/
   67 typedef struct List
   68 {
   69     struct List *p_Next;  /**< A pointer to the next list object     */
   70     struct List *p_Prev;  /**< A pointer to the previous list object */
   71 } t_List;
   72 
   73 
   74 /**************************************************************************//**
   75  @Function      NCSW_LIST_FIRST/NCSW_LIST_LAST/NCSW_LIST_NEXT/NCSW_LIST_PREV
   76 
   77  @Description   Macro to get first/last/next/previous entry in a list.
   78 
   79  @Param[in]     p_List - A pointer to a list.
   80 *//***************************************************************************/
   81 #define NCSW_LIST_FIRST(p_List) (p_List)->p_Next
   82 #define NCSW_LIST_LAST(p_List)  (p_List)->p_Prev
   83 #define NCSW_LIST_NEXT          NCSW_LIST_FIRST
   84 #define NCSW_LIST_PREV          NCSW_LIST_LAST
   85 
   86 
   87 /**************************************************************************//**
   88  @Function      NCSW_LIST_INIT
   89 
   90  @Description   Macro for initialization of a list struct.
   91 
   92  @Param[in]     lst - The t_List object to initialize.
   93 *//***************************************************************************/
   94 #define NCSW_LIST_INIT(lst) {&(lst), &(lst)}
   95 
   96 
   97 /**************************************************************************//**
   98  @Function      NCSW_LIST
   99 
  100  @Description   Macro to declare of a list.
  101 
  102  @Param[in]     listName - The list object name.
  103 *//***************************************************************************/
  104 #define NCSW_LIST(listName) t_List listName = NCSW_LIST_INIT(listName)
  105 
  106 
  107 /**************************************************************************//**
  108  @Function      INIT_LIST
  109 
  110  @Description   Macro to initialize a list pointer.
  111 
  112  @Param[in]     p_List - The list pointer.
  113 *//***************************************************************************/
  114 #define INIT_LIST(p_List)   NCSW_LIST_FIRST(p_List) = NCSW_LIST_LAST(p_List) = (p_List)
  115 
  116 
  117 /**************************************************************************//**
  118  @Function      NCSW_LIST_OBJECT
  119 
  120  @Description   Macro to get the struct (object) for this entry.
  121 
  122  @Param[in]     type   - The type of the struct (object) this list is embedded in.
  123  @Param[in]     member - The name of the t_List object within the struct.
  124 
  125  @Return        The structure pointer for this entry.
  126 *//***************************************************************************/
  127 #define MEMBER_OFFSET(type, member) (PTR_TO_UINT(&((type *)0)->member))
  128 #define NCSW_LIST_OBJECT(p_List, type, member) \
  129     ((type *)((char *)(p_List)-MEMBER_OFFSET(type, member)))
  130 
  131 
  132 /**************************************************************************//**
  133  @Function      NCSW_LIST_FOR_EACH
  134 
  135  @Description   Macro to iterate over a list.
  136 
  137  @Param[in]     p_Pos  - A pointer to a list to use as a loop counter.
  138  @Param[in]     p_Head - A pointer to the head for your list pointer.
  139 
  140  @Cautions      You can't delete items with this routine.
  141                 For deletion use NCSW_LIST_FOR_EACH_SAFE().
  142 *//***************************************************************************/
  143 #define NCSW_LIST_FOR_EACH(p_Pos, p_Head) \
  144     for (p_Pos = NCSW_LIST_FIRST(p_Head); p_Pos != (p_Head); p_Pos = NCSW_LIST_NEXT(p_Pos))
  145 
  146 
  147 /**************************************************************************//**
  148  @Function      NCSW_LIST_FOR_EACH_SAFE
  149 
  150  @Description   Macro to iterate over a list safe against removal of list entry.
  151 
  152  @Param[in]     p_Pos  - A pointer to a list to use as a loop counter.
  153  @Param[in]     p_Tmp  - Another pointer to a list to use as temporary storage.
  154  @Param[in]     p_Head - A pointer to the head for your list pointer.
  155 *//***************************************************************************/
  156 #define NCSW_LIST_FOR_EACH_SAFE(p_Pos, p_Tmp, p_Head)                \
  157     for (p_Pos = NCSW_LIST_FIRST(p_Head), p_Tmp = NCSW_LIST_FIRST(p_Pos); \
  158          p_Pos != (p_Head);                                     \
  159          p_Pos = p_Tmp, p_Tmp = NCSW_LIST_NEXT(p_Pos))
  160 
  161 
  162 /**************************************************************************//**
  163  @Function      NCSW_LIST_FOR_EACH_OBJECT_SAFE
  164 
  165  @Description   Macro to iterate over list of given type safely.
  166 
  167  @Param[in]     p_Pos  - A pointer to a list to use as a loop counter.
  168  @Param[in]     p_Tmp  - Another pointer to a list to use as temporary storage.
  169  @Param[in]     type   - The type of the struct this is embedded in.
  170  @Param[in]     p_Head - A pointer to the head for your list pointer.
  171  @Param[in]     member - The name of the list_struct within the struct.
  172 
  173  @Cautions      You can't delete items with this routine.
  174                 For deletion use NCSW_LIST_FOR_EACH_SAFE().
  175 *//***************************************************************************/
  176 #define NCSW_LIST_FOR_EACH_OBJECT_SAFE(p_Pos, p_Tmp, p_Head, type, member)      \
  177     for (p_Pos = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(p_Head), type, member),            \
  178          p_Tmp = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(&p_Pos->member), type, member);    \
  179          &p_Pos->member != (p_Head);                                       \
  180          p_Pos = p_Tmp,                                                    \
  181          p_Tmp = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(&p_Pos->member), type, member))
  182 
  183 /**************************************************************************//**
  184  @Function      NCSW_LIST_FOR_EACH_OBJECT
  185 
  186  @Description   Macro to iterate over list of given type.
  187 
  188  @Param[in]     p_Pos  - A pointer to a list to use as a loop counter.
  189  @Param[in]     type   - The type of the struct this is embedded in.
  190  @Param[in]     p_Head - A pointer to the head for your list pointer.
  191  @Param[in]     member - The name of the list_struct within the struct.
  192 
  193  @Cautions      You can't delete items with this routine.
  194                 For deletion use NCSW_LIST_FOR_EACH_SAFE().
  195 *//***************************************************************************/
  196 #define NCSW_LIST_FOR_EACH_OBJECT(p_Pos, type, p_Head, member)                  \
  197     for (p_Pos = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(p_Head), type, member);            \
  198          &p_Pos->member != (p_Head);                                       \
  199          p_Pos = NCSW_LIST_OBJECT(NCSW_LIST_FIRST(&(p_Pos->member)), type, member))
  200 
  201 
  202 /**************************************************************************//**
  203  @Function      NCSW_LIST_Add
  204 
  205  @Description   Add a new entry to a list.
  206 
  207                 Insert a new entry after the specified head.
  208                 This is good for implementing stacks.
  209 
  210  @Param[in]     p_New  - A pointer to a new list entry to be added.
  211  @Param[in]     p_Head - A pointer to a list head to add it after.
  212 
  213  @Return        none.
  214 *//***************************************************************************/
  215 static __inline__ void NCSW_LIST_Add(t_List *p_New, t_List *p_Head)
  216 {
  217     NCSW_LIST_PREV(NCSW_LIST_NEXT(p_Head)) = p_New;
  218     NCSW_LIST_NEXT(p_New)             = NCSW_LIST_NEXT(p_Head);
  219     NCSW_LIST_PREV(p_New)             = p_Head;
  220     NCSW_LIST_NEXT(p_Head)            = p_New;
  221 }
  222 
  223 
  224 /**************************************************************************//**
  225  @Function      NCSW_LIST_AddToTail
  226 
  227  @Description   Add a new entry to a list.
  228 
  229                 Insert a new entry before the specified head.
  230                 This is useful for implementing queues.
  231 
  232  @Param[in]     p_New  - A pointer to a new list entry to be added.
  233  @Param[in]     p_Head - A pointer to a list head to add it before.
  234 
  235  @Return        none.
  236 *//***************************************************************************/
  237 static __inline__ void NCSW_LIST_AddToTail(t_List *p_New, t_List *p_Head)
  238 {
  239     NCSW_LIST_NEXT(NCSW_LIST_PREV(p_Head)) = p_New;
  240     NCSW_LIST_PREV(p_New)             = NCSW_LIST_PREV(p_Head);
  241     NCSW_LIST_NEXT(p_New)             = p_Head;
  242     NCSW_LIST_PREV(p_Head)            = p_New;
  243 }
  244 
  245 
  246 /**************************************************************************//**
  247  @Function      NCSW_LIST_Del
  248 
  249  @Description   Deletes entry from a list.
  250 
  251  @Param[in]     p_Entry - A pointer to the element to delete from the list.
  252 
  253  @Return        none.
  254 
  255  @Cautions      NCSW_LIST_IsEmpty() on entry does not return true after this,
  256                 the entry is in an undefined state.
  257 *//***************************************************************************/
  258 static __inline__ void NCSW_LIST_Del(t_List *p_Entry)
  259 {
  260     NCSW_LIST_PREV(NCSW_LIST_NEXT(p_Entry)) = NCSW_LIST_PREV(p_Entry);
  261     NCSW_LIST_NEXT(NCSW_LIST_PREV(p_Entry)) = NCSW_LIST_NEXT(p_Entry);
  262 }
  263 
  264 
  265 /**************************************************************************//**
  266  @Function      NCSW_LIST_DelAndInit
  267 
  268  @Description   Deletes entry from list and reinitialize it.
  269 
  270  @Param[in]     p_Entry - A pointer to the element to delete from the list.
  271 
  272  @Return        none.
  273 *//***************************************************************************/
  274 static __inline__ void NCSW_LIST_DelAndInit(t_List *p_Entry)
  275 {
  276     NCSW_LIST_Del(p_Entry);
  277     INIT_LIST(p_Entry);
  278 }
  279 
  280 
  281 /**************************************************************************//**
  282  @Function      NCSW_LIST_Move
  283 
  284  @Description   Delete from one list and add as another's head.
  285 
  286  @Param[in]     p_Entry - A pointer to the list entry to move.
  287  @Param[in]     p_Head  - A pointer to the list head that will precede our entry.
  288 
  289  @Return        none.
  290 *//***************************************************************************/
  291 static __inline__ void NCSW_LIST_Move(t_List *p_Entry, t_List *p_Head)
  292 {
  293     NCSW_LIST_Del(p_Entry);
  294     NCSW_LIST_Add(p_Entry, p_Head);
  295 }
  296 
  297 
  298 /**************************************************************************//**
  299  @Function      NCSW_LIST_MoveToTail
  300 
  301  @Description   Delete from one list and add as another's tail.
  302 
  303  @Param[in]     p_Entry - A pointer to the entry to move.
  304  @Param[in]     p_Head  - A pointer to the list head that will follow our entry.
  305 
  306  @Return        none.
  307 *//***************************************************************************/
  308 static __inline__ void NCSW_LIST_MoveToTail(t_List *p_Entry, t_List *p_Head)
  309 {
  310     NCSW_LIST_Del(p_Entry);
  311     NCSW_LIST_AddToTail(p_Entry, p_Head);
  312 }
  313 
  314 
  315 /**************************************************************************//**
  316  @Function      NCSW_LIST_IsEmpty
  317 
  318  @Description   Tests whether a list is empty.
  319 
  320  @Param[in]     p_List - A pointer to the list to test.
  321 
  322  @Return        1 if the list is empty, 0 otherwise.
  323 *//***************************************************************************/
  324 static __inline__ int NCSW_LIST_IsEmpty(t_List *p_List)
  325 {
  326     return (NCSW_LIST_FIRST(p_List) == p_List);
  327 }
  328 
  329 
  330 /**************************************************************************//**
  331  @Function      NCSW_LIST_Append
  332 
  333  @Description   Join two lists.
  334 
  335  @Param[in]     p_NewList - A pointer to the new list to add.
  336  @Param[in]     p_Head    - A pointer to the place to add it in the first list.
  337 
  338  @Return        none.
  339 *//***************************************************************************/
  340 void NCSW_LIST_Append(t_List *p_NewList, t_List *p_Head);
  341 
  342 
  343 /**************************************************************************//**
  344  @Function      NCSW_LIST_NumOfObjs
  345 
  346  @Description   Counts number of objects in the list
  347 
  348  @Param[in]     p_List - A pointer to the list which objects are to be counted.
  349 
  350  @Return        Number of objects in the list.
  351 *//***************************************************************************/
  352 int NCSW_LIST_NumOfObjs(t_List *p_List);
  353 
  354 /** @} */ /* end of list_id group */
  355 /** @} */ /* end of etc_id group */
  356 
  357 
  358 #endif /* __LIST_EXT_H */

Cache object: c510d430a0cf12e7813b9b7f08453ec7


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.