358 lines
14 KiB
C
358 lines
14 KiB
C
|
/* Copyright (c) 2008-2011 Freescale Semiconductor, Inc.
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions are met:
|
||
|
* * Redistributions of source code must retain the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer.
|
||
|
* * 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.
|
||
|
* * Neither the name of Freescale Semiconductor nor the
|
||
|
* names of its contributors may be used to endorse or promote products
|
||
|
* derived from this software without specific prior written permission.
|
||
|
*
|
||
|
*
|
||
|
* ALTERNATIVELY, this software may be distributed under the terms of the
|
||
|
* GNU General Public License ("GPL") as published by the Free Software
|
||
|
* Foundation, either version 2 of that License or (at your option) any
|
||
|
* later version.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``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 Freescale Semiconductor 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.
|
||
|
*/
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
|
||
|
@File list_ext.h
|
||
|
|
||
|
@Description External prototypes for list.c
|
||
|
*//***************************************************************************/
|
||
|
|
||
|
#ifndef __LIST_EXT_H
|
||
|
#define __LIST_EXT_H
|
||
|
|
||
|
|
||
|
#include "std_ext.h"
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Group etc_id Utility Library Application Programming Interface
|
||
|
|
||
|
@Description External routines.
|
||
|
|
||
|
@{
|
||
|
*//***************************************************************************/
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Group list_id List
|
||
|
|
||
|
@Description List module functions,definitions and enums.
|
||
|
|
||
|
@{
|
||
|
*//***************************************************************************/
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Description List structure.
|
||
|
*//***************************************************************************/
|
||
|
typedef struct List
|
||
|
{
|
||
|
struct List *p_Next; /**< A pointer to the next list object */
|
||
|
struct List *p_Prev; /**< A pointer to the previous list object */
|
||
|
} t_List;
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function NCSW_LIST_FIRST/LIST_LAST/NCSW_LIST_NEXT/NCSW_LIST_PREV
|
||
|
|
||
|
@Description Macro to get first/last/next/previous entry in a list.
|
||
|
|
||
|
@Param[in] p_List - A pointer to a list.
|
||
|
*//***************************************************************************/
|
||
|
#define NCSW_LIST_FIRST(p_List) (p_List)->p_Next
|
||
|
#define LIST_LAST(p_List) (p_List)->p_Prev
|
||
|
#define NCSW_LIST_NEXT NCSW_LIST_FIRST
|
||
|
#define NCSW_LIST_PREV LIST_LAST
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function NCSW_LIST_INIT
|
||
|
|
||
|
@Description Macro for initialization of a list struct.
|
||
|
|
||
|
@Param[in] lst - The t_List object to initialize.
|
||
|
*//***************************************************************************/
|
||
|
#define NCSW_LIST_INIT(lst) {&(lst), &(lst)}
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST
|
||
|
|
||
|
@Description Macro to declare of a list.
|
||
|
|
||
|
@Param[in] listName - The list object name.
|
||
|
*//***************************************************************************/
|
||
|
#define LIST(listName) t_List listName = NCSW_LIST_INIT(listName)
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function INIT_LIST
|
||
|
|
||
|
@Description Macro to initialize a list pointer.
|
||
|
|
||
|
@Param[in] p_List - The list pointer.
|
||
|
*//***************************************************************************/
|
||
|
#define INIT_LIST(p_List) NCSW_LIST_FIRST(p_List) = LIST_LAST(p_List) = (p_List)
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_OBJECT
|
||
|
|
||
|
@Description Macro to get the struct (object) for this entry.
|
||
|
|
||
|
@Param[in] type - The type of the struct (object) this list is embedded in.
|
||
|
@Param[in] member - The name of the t_List object within the struct.
|
||
|
|
||
|
@Return The structure pointer for this entry.
|
||
|
*//***************************************************************************/
|
||
|
#define MEMBER_OFFSET(type, member) (PTR_TO_UINT(&((type *)0)->member))
|
||
|
#define LIST_OBJECT(p_List, type, member) \
|
||
|
((type *)((char *)(p_List)-MEMBER_OFFSET(type, member)))
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_FOR_EACH
|
||
|
|
||
|
@Description Macro to iterate over a list.
|
||
|
|
||
|
@Param[in] p_Pos - A pointer to a list to use as a loop counter.
|
||
|
@Param[in] p_Head - A pointer to the head for your list pointer.
|
||
|
|
||
|
@Cautions You can't delete items with this routine.
|
||
|
For deletion use LIST_FOR_EACH_SAFE().
|
||
|
*//***************************************************************************/
|
||
|
#define LIST_FOR_EACH(p_Pos, p_Head) \
|
||
|
for (p_Pos = NCSW_LIST_FIRST(p_Head); p_Pos != (p_Head); p_Pos = NCSW_LIST_NEXT(p_Pos))
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_FOR_EACH_SAFE
|
||
|
|
||
|
@Description Macro to iterate over a list safe against removal of list entry.
|
||
|
|
||
|
@Param[in] p_Pos - A pointer to a list to use as a loop counter.
|
||
|
@Param[in] p_Tmp - Another pointer to a list to use as temporary storage.
|
||
|
@Param[in] p_Head - A pointer to the head for your list pointer.
|
||
|
*//***************************************************************************/
|
||
|
#define LIST_FOR_EACH_SAFE(p_Pos, p_Tmp, p_Head) \
|
||
|
for (p_Pos = NCSW_LIST_FIRST(p_Head), p_Tmp = NCSW_LIST_FIRST(p_Pos); \
|
||
|
p_Pos != (p_Head); \
|
||
|
p_Pos = p_Tmp, p_Tmp = NCSW_LIST_NEXT(p_Pos))
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_FOR_EACH_OBJECT_SAFE
|
||
|
|
||
|
@Description Macro to iterate over list of given type safely.
|
||
|
|
||
|
@Param[in] p_Pos - A pointer to a list to use as a loop counter.
|
||
|
@Param[in] p_Tmp - Another pointer to a list to use as temporary storage.
|
||
|
@Param[in] type - The type of the struct this is embedded in.
|
||
|
@Param[in] p_Head - A pointer to the head for your list pointer.
|
||
|
@Param[in] member - The name of the list_struct within the struct.
|
||
|
|
||
|
@Cautions You can't delete items with this routine.
|
||
|
For deletion use LIST_FOR_EACH_SAFE().
|
||
|
*//***************************************************************************/
|
||
|
#define LIST_FOR_EACH_OBJECT_SAFE(p_Pos, p_Tmp, p_Head, type, member) \
|
||
|
for (p_Pos = LIST_OBJECT(NCSW_LIST_FIRST(p_Head), type, member), \
|
||
|
p_Tmp = LIST_OBJECT(NCSW_LIST_FIRST(&p_Pos->member), type, member); \
|
||
|
&p_Pos->member != (p_Head); \
|
||
|
p_Pos = p_Tmp, \
|
||
|
p_Tmp = LIST_OBJECT(NCSW_LIST_FIRST(&p_Pos->member), type, member))
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_FOR_EACH_OBJECT
|
||
|
|
||
|
@Description Macro to iterate over list of given type.
|
||
|
|
||
|
@Param[in] p_Pos - A pointer to a list to use as a loop counter.
|
||
|
@Param[in] type - The type of the struct this is embedded in.
|
||
|
@Param[in] p_Head - A pointer to the head for your list pointer.
|
||
|
@Param[in] member - The name of the list_struct within the struct.
|
||
|
|
||
|
@Cautions You can't delete items with this routine.
|
||
|
For deletion use LIST_FOR_EACH_SAFE().
|
||
|
*//***************************************************************************/
|
||
|
#define LIST_FOR_EACH_OBJECT(p_Pos, type, p_Head, member) \
|
||
|
for (p_Pos = LIST_OBJECT(NCSW_LIST_FIRST(p_Head), type, member); \
|
||
|
&p_Pos->member != (p_Head); \
|
||
|
p_Pos = LIST_OBJECT(NCSW_LIST_FIRST(&(p_Pos->member)), type, member))
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_Add
|
||
|
|
||
|
@Description Add a new entry to a list.
|
||
|
|
||
|
Insert a new entry after the specified head.
|
||
|
This is good for implementing stacks.
|
||
|
|
||
|
@Param[in] p_New - A pointer to a new list entry to be added.
|
||
|
@Param[in] p_Head - A pointer to a list head to add it after.
|
||
|
|
||
|
@Return none.
|
||
|
*//***************************************************************************/
|
||
|
static __inline__ void LIST_Add(t_List *p_New, t_List *p_Head)
|
||
|
{
|
||
|
NCSW_LIST_PREV(NCSW_LIST_NEXT(p_Head)) = p_New;
|
||
|
NCSW_LIST_NEXT(p_New) = NCSW_LIST_NEXT(p_Head);
|
||
|
NCSW_LIST_PREV(p_New) = p_Head;
|
||
|
NCSW_LIST_NEXT(p_Head) = p_New;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_AddToTail
|
||
|
|
||
|
@Description Add a new entry to a list.
|
||
|
|
||
|
Insert a new entry before the specified head.
|
||
|
This is useful for implementing queues.
|
||
|
|
||
|
@Param[in] p_New - A pointer to a new list entry to be added.
|
||
|
@Param[in] p_Head - A pointer to a list head to add it after.
|
||
|
|
||
|
@Return none.
|
||
|
*//***************************************************************************/
|
||
|
static __inline__ void LIST_AddToTail(t_List *p_New, t_List *p_Head)
|
||
|
{
|
||
|
NCSW_LIST_NEXT(NCSW_LIST_PREV(p_Head)) = p_New;
|
||
|
NCSW_LIST_PREV(p_New) = NCSW_LIST_PREV(p_Head);
|
||
|
NCSW_LIST_NEXT(p_New) = p_Head;
|
||
|
NCSW_LIST_PREV(p_Head) = p_New;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_Del
|
||
|
|
||
|
@Description Deletes entry from a list.
|
||
|
|
||
|
@Param[in] p_Entry - A pointer to the element to delete from the list.
|
||
|
|
||
|
@Return none.
|
||
|
|
||
|
@Cautions LIST_IsEmpty() on entry does not return true after this,
|
||
|
the entry is in an undefined state.
|
||
|
*//***************************************************************************/
|
||
|
static __inline__ void LIST_Del(t_List *p_Entry)
|
||
|
{
|
||
|
NCSW_LIST_PREV(NCSW_LIST_NEXT(p_Entry)) = NCSW_LIST_PREV(p_Entry);
|
||
|
NCSW_LIST_NEXT(NCSW_LIST_PREV(p_Entry)) = NCSW_LIST_NEXT(p_Entry);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_DelAndInit
|
||
|
|
||
|
@Description Deletes entry from list and reinitialize it.
|
||
|
|
||
|
@Param[in] p_Entry - A pointer to the element to delete from the list.
|
||
|
|
||
|
@Return none.
|
||
|
*//***************************************************************************/
|
||
|
static __inline__ void LIST_DelAndInit(t_List *p_Entry)
|
||
|
{
|
||
|
LIST_Del(p_Entry);
|
||
|
INIT_LIST(p_Entry);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_Move
|
||
|
|
||
|
@Description Delete from one list and add as another's head.
|
||
|
|
||
|
@Param[in] p_Entry - A pointer to the list entry to move.
|
||
|
@Param[in] p_Head - A pointer to the list head that will precede our entry.
|
||
|
|
||
|
@Return none.
|
||
|
*//***************************************************************************/
|
||
|
static __inline__ void LIST_Move(t_List *p_Entry, t_List *p_Head)
|
||
|
{
|
||
|
LIST_Del(p_Entry);
|
||
|
LIST_Add(p_Entry, p_Head);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_MoveToTail
|
||
|
|
||
|
@Description Delete from one list and add as another's tail.
|
||
|
|
||
|
@Param[in] p_Entry - A pointer to the entry to move.
|
||
|
@Param[in] p_Head - A pointer to the list head that will follow our entry.
|
||
|
|
||
|
@Return none.
|
||
|
*//***************************************************************************/
|
||
|
static __inline__ void LIST_MoveToTail(t_List *p_Entry, t_List *p_Head)
|
||
|
{
|
||
|
LIST_Del(p_Entry);
|
||
|
LIST_AddToTail(p_Entry, p_Head);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_IsEmpty
|
||
|
|
||
|
@Description Tests whether a list is empty.
|
||
|
|
||
|
@Param[in] p_List - A pointer to the list to test.
|
||
|
|
||
|
@Return 1 if the list is empty, 0 otherwise.
|
||
|
*//***************************************************************************/
|
||
|
static __inline__ int LIST_IsEmpty(t_List *p_List)
|
||
|
{
|
||
|
return (NCSW_LIST_FIRST(p_List) == p_List);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_Append
|
||
|
|
||
|
@Description Join two lists.
|
||
|
|
||
|
@Param[in] p_NewList - A pointer to the new list to add.
|
||
|
@Param[in] p_Head - A pointer to the place to add it in the first list.
|
||
|
|
||
|
@Return none.
|
||
|
*//***************************************************************************/
|
||
|
void LIST_Append(t_List *p_NewList, t_List *p_Head);
|
||
|
|
||
|
|
||
|
/**************************************************************************//**
|
||
|
@Function LIST_NumOfObjs
|
||
|
|
||
|
@Description Counts number of objects in the list
|
||
|
|
||
|
@Param[in] p_List - A pointer to the list which objects are to be counted.
|
||
|
|
||
|
@Return Number of objects in the list.
|
||
|
*//***************************************************************************/
|
||
|
int LIST_NumOfObjs(t_List *p_List);
|
||
|
|
||
|
/** @} */ /* end of list_id group */
|
||
|
/** @} */ /* end of etc_id group */
|
||
|
|
||
|
|
||
|
#endif /* __LIST_EXT_H */
|