xref: /freebsd/sys/dev/pms/RefTisa/sallsdk/spc/sallist.h (revision 2ff63af9b88c7413b7d71715b5532625752a248e)
14e1bc9a0SAchim Leubner /*******************************************************************************
24e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
34e1bc9a0SAchim Leubner *
44e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
54e1bc9a0SAchim Leubner *that the following conditions are met:
64e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
74e1bc9a0SAchim Leubner *following disclaimer.
84e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
94e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
104e1bc9a0SAchim Leubner *with the distribution.
114e1bc9a0SAchim Leubner *
124e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
134e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
144e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
154e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
164e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
174e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
184e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
194e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
204e1bc9a0SAchim Leubner *
214e1bc9a0SAchim Leubner *
224e1bc9a0SAchim Leubner ********************************************************************************/
234e1bc9a0SAchim Leubner /*******************************************************************************/
244e1bc9a0SAchim Leubner /*! \file sallist.h
254e1bc9a0SAchim Leubner  *  \brief The file contains link list manipulation helper routines
264e1bc9a0SAchim Leubner  *
274e1bc9a0SAchim Leubner  */
284e1bc9a0SAchim Leubner /*******************************************************************************/
294e1bc9a0SAchim Leubner 
304e1bc9a0SAchim Leubner #ifndef __SALLIST_H__
314e1bc9a0SAchim Leubner #define __SALLIST_H__
324e1bc9a0SAchim Leubner 
334e1bc9a0SAchim Leubner 
344e1bc9a0SAchim Leubner /********************************************************************
354e1bc9a0SAchim Leubner *********************************************************************
364e1bc9a0SAchim Leubner **   DATA STRUCTURES
374e1bc9a0SAchim Leubner ********************************************************************/
384e1bc9a0SAchim Leubner 
394e1bc9a0SAchim Leubner /** \brief Structure of Link Data
404e1bc9a0SAchim Leubner  *
414e1bc9a0SAchim Leubner  *  link data, need to be included at the start (offset 0)
42*17db4b52SGordon Bergling  *  of any structures that are to be stored in the link list
434e1bc9a0SAchim Leubner  *
444e1bc9a0SAchim Leubner  */
454e1bc9a0SAchim Leubner typedef struct _SALINK
464e1bc9a0SAchim Leubner {
474e1bc9a0SAchim Leubner   struct _SALINK *pNext;
484e1bc9a0SAchim Leubner   struct _SALINK *pPrev;
494e1bc9a0SAchim Leubner 
504e1bc9a0SAchim Leubner   /*
514e1bc9a0SAchim Leubner   ** for assertion purpose only
524e1bc9a0SAchim Leubner   */
534e1bc9a0SAchim Leubner   struct _SALINK * pHead;     /* track the link list the link is a member of */
544e1bc9a0SAchim Leubner 
554e1bc9a0SAchim Leubner } SALINK, * PSALINK;
564e1bc9a0SAchim Leubner 
574e1bc9a0SAchim Leubner /** \brief Structure of Link List
584e1bc9a0SAchim Leubner  *
594e1bc9a0SAchim Leubner  * link list basic pointers
604e1bc9a0SAchim Leubner  *
614e1bc9a0SAchim Leubner  */
624e1bc9a0SAchim Leubner typedef struct _SALINK_LIST
634e1bc9a0SAchim Leubner {
644e1bc9a0SAchim Leubner   PSALINK pHead;
654e1bc9a0SAchim Leubner   bit32   Count;
664e1bc9a0SAchim Leubner 
674e1bc9a0SAchim Leubner   SALINK  Head; /* allways one link to speed up insert and delete */
684e1bc9a0SAchim Leubner 
694e1bc9a0SAchim Leubner } SALINK_LIST, * PSALINK_LIST;
704e1bc9a0SAchim Leubner 
714e1bc9a0SAchim Leubner 
724e1bc9a0SAchim Leubner /********************************************************************
734e1bc9a0SAchim Leubner *********************************************************************
744e1bc9a0SAchim Leubner ** MACROS
754e1bc9a0SAchim Leubner ********************************************************************/
764e1bc9a0SAchim Leubner 
774e1bc9a0SAchim Leubner /*! \def saLlistInitialize(pList)
784e1bc9a0SAchim Leubner * \brief saLlistInitialize macro
794e1bc9a0SAchim Leubner *
804e1bc9a0SAchim Leubner * use to initialize a Link List
814e1bc9a0SAchim Leubner */
824e1bc9a0SAchim Leubner /*******************************************************************************
834e1bc9a0SAchim Leubner ********************************************************************************
844e1bc9a0SAchim Leubner **
854e1bc9a0SAchim Leubner ** MODULE NAME: saLlistInitialize
864e1bc9a0SAchim Leubner **
874e1bc9a0SAchim Leubner ** PURPOSE:     Initialize a link list.
884e1bc9a0SAchim Leubner **
894e1bc9a0SAchim Leubner ** PARAMETERS:  PSALINK_LIST  OUT - Link list definition.
904e1bc9a0SAchim Leubner **
914e1bc9a0SAchim Leubner ** SIDE EFFECTS & CAVEATS:
924e1bc9a0SAchim Leubner **
934e1bc9a0SAchim Leubner ** ALGORITHM:
944e1bc9a0SAchim Leubner **
954e1bc9a0SAchim Leubner ********************************************************************************/
964e1bc9a0SAchim Leubner /*lint -emacro(613,saLlistInitialize) */
974e1bc9a0SAchim Leubner 
984e1bc9a0SAchim Leubner #define saLlistInitialize(pList) {(pList)->pHead        = &((pList)->Head); \
994e1bc9a0SAchim Leubner                                   (pList)->pHead->pNext = (pList)->pHead;   \
1004e1bc9a0SAchim Leubner                                   (pList)->pHead->pPrev = (pList)->pHead;   \
1014e1bc9a0SAchim Leubner                                   (pList)->Count        = 0;                \
1024e1bc9a0SAchim Leubner                                  }
1034e1bc9a0SAchim Leubner 
1044e1bc9a0SAchim Leubner #define saLlistIOInitialize(pList){(pList)->pHead        = &((pList)->Head); \
1054e1bc9a0SAchim Leubner                                   (pList)->pHead->pNext = (pList)->pHead;   \
1064e1bc9a0SAchim Leubner                                   (pList)->pHead->pPrev = (pList)->pHead;   \
1074e1bc9a0SAchim Leubner                                   (pList)->Count        = 0;                \
1084e1bc9a0SAchim Leubner                                  }
1094e1bc9a0SAchim Leubner /*! \def saLlinkInitialize(pLink)
1104e1bc9a0SAchim Leubner * \brief saLlinkInitialize macro
1114e1bc9a0SAchim Leubner *
1124e1bc9a0SAchim Leubner * use to initialize a Link
1134e1bc9a0SAchim Leubner */
1144e1bc9a0SAchim Leubner /********************************************************************************
1154e1bc9a0SAchim Leubner ********************************************************************************
1164e1bc9a0SAchim Leubner **
1174e1bc9a0SAchim Leubner ** MODULE NAME: saLlinkInitialize
1184e1bc9a0SAchim Leubner **
1194e1bc9a0SAchim Leubner ** PURPOSE:     Initialize a link.
1204e1bc9a0SAchim Leubner **              This function should be used to initialize a new link before it
1214e1bc9a0SAchim Leubner **              is used in the linked list. This will initialize the link so
1224e1bc9a0SAchim Leubner **              the assertion will work
1234e1bc9a0SAchim Leubner **
1244e1bc9a0SAchim Leubner ** PARAMETERS:  PSALINK      IN  - Link to be initialized.
1254e1bc9a0SAchim Leubner **
1264e1bc9a0SAchim Leubner ** SIDE EFFECTS & CAVEATS:
1274e1bc9a0SAchim Leubner **
1284e1bc9a0SAchim Leubner ** ALGORITHM:
1294e1bc9a0SAchim Leubner **
1304e1bc9a0SAchim Leubner ********************************************************************************
1314e1bc9a0SAchim Leubner *******************************************************************************/
1324e1bc9a0SAchim Leubner 
1334e1bc9a0SAchim Leubner /*lint -emacro(613,saLlinkInitialize) */
1344e1bc9a0SAchim Leubner 
1354e1bc9a0SAchim Leubner #define saLlinkInitialize(pLink) { (pLink)->pHead = agNULL;    \
1364e1bc9a0SAchim Leubner                                    (pLink)->pNext = agNULL;    \
1374e1bc9a0SAchim Leubner                                    (pLink)->pPrev = agNULL;    \
1384e1bc9a0SAchim Leubner                                  }
1394e1bc9a0SAchim Leubner 
1404e1bc9a0SAchim Leubner #define saLlinkIOInitialize(pLink) { (pLink)->pHead = agNULL;    \
1414e1bc9a0SAchim Leubner                                    (pLink)->pNext = agNULL;    \
1424e1bc9a0SAchim Leubner                                    (pLink)->pPrev = agNULL;    \
1434e1bc9a0SAchim Leubner                                  }
1444e1bc9a0SAchim Leubner /*! \def saLlistAdd(pList, pLink)
1454e1bc9a0SAchim Leubner * \brief saLlistAdd macro
1464e1bc9a0SAchim Leubner *
1474e1bc9a0SAchim Leubner * use to add a link to the tail of list
1484e1bc9a0SAchim Leubner */
1494e1bc9a0SAchim Leubner /********************************************************************************
1504e1bc9a0SAchim Leubner ********************************************************************************
1514e1bc9a0SAchim Leubner **
1524e1bc9a0SAchim Leubner ** MODULE NAME: saLlistAdd
1534e1bc9a0SAchim Leubner **
1544e1bc9a0SAchim Leubner ** PURPOSE:     add a link at the tail of the list
1554e1bc9a0SAchim Leubner **
1564e1bc9a0SAchim Leubner ** PARAMETERS:  PSALINK_LIST OUT - Link list definition.
1574e1bc9a0SAchim Leubner **              PSALINK      IN  - Link to be inserted.
1584e1bc9a0SAchim Leubner **
1594e1bc9a0SAchim Leubner ** SIDE EFFECTS & CAVEATS:
1604e1bc9a0SAchim Leubner **   !!! assumes that fcllistInitialize has been called on the linklist
1614e1bc9a0SAchim Leubner **   !!! if not, this function behavior is un-predictable
1624e1bc9a0SAchim Leubner **
1634e1bc9a0SAchim Leubner **   The OS_ASSERT() is an assignment for debug code only
1644e1bc9a0SAchim Leubner **
1654e1bc9a0SAchim Leubner ** ALGORITHM:
1664e1bc9a0SAchim Leubner **
1674e1bc9a0SAchim Leubner ********************************************************************************
1684e1bc9a0SAchim Leubner *******************************************************************************/
1694e1bc9a0SAchim Leubner 
1704e1bc9a0SAchim Leubner /*lint -emacro(506,saLlistAdd) */
1714e1bc9a0SAchim Leubner /*lint -emacro(613,saLlistAdd) */
1724e1bc9a0SAchim Leubner /*lint -emacro(666,saLlistAdd) */
1734e1bc9a0SAchim Leubner /*lint -emacro(720,saLlistAdd) */
1744e1bc9a0SAchim Leubner 
1754e1bc9a0SAchim Leubner #define saLlistAdd(pList, pLink) {                                          \
1764e1bc9a0SAchim Leubner                              (pLink)->pNext        = (pList)->pHead;        \
1774e1bc9a0SAchim Leubner                              (pLink)->pPrev        = (pList)->pHead->pPrev; \
1784e1bc9a0SAchim Leubner                              (pLink)->pPrev->pNext = (pLink);               \
1794e1bc9a0SAchim Leubner                              (pList)->pHead->pPrev = (pLink);               \
1804e1bc9a0SAchim Leubner                              (pList)->Count ++;                             \
1814e1bc9a0SAchim Leubner                              (pLink)->pHead = (pList)->pHead;               \
1824e1bc9a0SAchim Leubner                              }
1834e1bc9a0SAchim Leubner 
1844e1bc9a0SAchim Leubner #define saLlistIOAdd(pList, pLink) {                                        \
1854e1bc9a0SAchim Leubner                              (pLink)->pNext        = (pList)->pHead;        \
1864e1bc9a0SAchim Leubner                              (pLink)->pPrev        = (pList)->pHead->pPrev; \
1874e1bc9a0SAchim Leubner                              (pLink)->pPrev->pNext = (pLink);               \
1884e1bc9a0SAchim Leubner                              (pList)->pHead->pPrev = (pLink);               \
1894e1bc9a0SAchim Leubner                              (pList)->Count ++;                             \
1904e1bc9a0SAchim Leubner                              (pLink)->pHead = (pList)->pHead;               \
1914e1bc9a0SAchim Leubner                              }
1924e1bc9a0SAchim Leubner 
1934e1bc9a0SAchim Leubner /*! \def saLlistInsert(pList, pLink, pNew)
1944e1bc9a0SAchim Leubner * \brief saLlistInsert macro
1954e1bc9a0SAchim Leubner *
1964e1bc9a0SAchim Leubner * use to insert a link preceding the given one
1974e1bc9a0SAchim Leubner */
1984e1bc9a0SAchim Leubner /********************************************************************************
1994e1bc9a0SAchim Leubner ********************************************************************************
2004e1bc9a0SAchim Leubner **
2014e1bc9a0SAchim Leubner ** MODULE NAME: saLlistInsert
2024e1bc9a0SAchim Leubner **
2034e1bc9a0SAchim Leubner ** PURPOSE:     insert a link preceding the given one
2044e1bc9a0SAchim Leubner **
2054e1bc9a0SAchim Leubner ** PARAMETERS:  PSALINK_LIST OUT - Link list definition.
2064e1bc9a0SAchim Leubner **              PSALINK      IN  - Link to be inserted after.
2074e1bc9a0SAchim Leubner **              PSALINK      IN  - Link to be inserted.
2084e1bc9a0SAchim Leubner **
2094e1bc9a0SAchim Leubner ** SIDE EFFECTS & CAVEATS:
2104e1bc9a0SAchim Leubner **   !!! assumes that fcllistInitialize has been called on the linklist
2114e1bc9a0SAchim Leubner **   !!! if not, this function behavior is un-predictable
2124e1bc9a0SAchim Leubner **
2134e1bc9a0SAchim Leubner **   The OS_ASSERT() is an assignment for debug code only
2144e1bc9a0SAchim Leubner **
2154e1bc9a0SAchim Leubner ** ALGORITHM:
2164e1bc9a0SAchim Leubner **
2174e1bc9a0SAchim Leubner ********************************************************************************
2184e1bc9a0SAchim Leubner *******************************************************************************/
2194e1bc9a0SAchim Leubner 
2204e1bc9a0SAchim Leubner /*lint -emacro(506,saLlistInsert) */
2214e1bc9a0SAchim Leubner /*lint -emacro(613,saLlistInsert) */
2224e1bc9a0SAchim Leubner /*lint -emacro(666,saLlistInsert) */
2234e1bc9a0SAchim Leubner /*lint -emacro(720,saLlistInsert) */
2244e1bc9a0SAchim Leubner 
2254e1bc9a0SAchim Leubner #define saLlistInsert(pList, pLink, pNew) {                                 \
2264e1bc9a0SAchim Leubner                                  (pNew)->pNext        = (pLink);            \
2274e1bc9a0SAchim Leubner                                  (pNew)->pPrev        = (pLink)->pPrev;     \
2284e1bc9a0SAchim Leubner                                  (pNew)->pPrev->pNext = (pNew);             \
2294e1bc9a0SAchim Leubner                                  (pLink)->pPrev       = (pNew);             \
2304e1bc9a0SAchim Leubner                                  (pList)->Count ++;                         \
2314e1bc9a0SAchim Leubner                                  (pNew)->pHead = (pList)->pHead;            \
2324e1bc9a0SAchim Leubner                                  }
2334e1bc9a0SAchim Leubner 
2344e1bc9a0SAchim Leubner /*! \def saLlistRemove(pList, pLink)
2354e1bc9a0SAchim Leubner * \brief saLlistRemove macro
2364e1bc9a0SAchim Leubner *
2374e1bc9a0SAchim Leubner * use to remove the link from the list
2384e1bc9a0SAchim Leubner */
2394e1bc9a0SAchim Leubner /********************************************************************************
2404e1bc9a0SAchim Leubner ********************************************************************************
2414e1bc9a0SAchim Leubner **
2424e1bc9a0SAchim Leubner ** MODULE NAME: saLlistRemove
2434e1bc9a0SAchim Leubner **
2444e1bc9a0SAchim Leubner ** PURPOSE:     remove the link from the list.
2454e1bc9a0SAchim Leubner **
2464e1bc9a0SAchim Leubner ** PARAMETERS:  PSALINK_LIST OUT  - Link list definition.
2474e1bc9a0SAchim Leubner **              PSALINK      IN   - Link to delet from list
2484e1bc9a0SAchim Leubner **
2494e1bc9a0SAchim Leubner ** SIDE EFFECTS & CAVEATS:
2504e1bc9a0SAchim Leubner **   !!! assumes that fcllistInitialize has been called on the linklist
2514e1bc9a0SAchim Leubner **   !!! if not, this function behavior is un-predictable
2524e1bc9a0SAchim Leubner **
2534e1bc9a0SAchim Leubner **   !!! No validation is made on the list or the validity of the link
2544e1bc9a0SAchim Leubner **   !!! the caller must make sure that the link is in the list
2554e1bc9a0SAchim Leubner **
2564e1bc9a0SAchim Leubner **
2574e1bc9a0SAchim Leubner ** ALGORITHM:
2584e1bc9a0SAchim Leubner **
2594e1bc9a0SAchim Leubner ********************************************************************************
2604e1bc9a0SAchim Leubner *******************************************************************************/
2614e1bc9a0SAchim Leubner 
2624e1bc9a0SAchim Leubner /*lint -emacro(506,saLlistRemove) */
2634e1bc9a0SAchim Leubner /*lint -emacro(613,saLlistRemove) */
2644e1bc9a0SAchim Leubner /*lint -emacro(666,saLlistRemove) */
2654e1bc9a0SAchim Leubner /*lint -emacro(720,saLlistRemove) */
2664e1bc9a0SAchim Leubner 
2674e1bc9a0SAchim Leubner #define saLlistRemove(pList, pLink) {                                   \
2684e1bc9a0SAchim Leubner                            (pLink)->pPrev->pNext = (pLink)->pNext;      \
2694e1bc9a0SAchim Leubner                            (pLink)->pNext->pPrev = (pLink)->pPrev;      \
2704e1bc9a0SAchim Leubner                            (pLink)->pHead = agNULL;                     \
2714e1bc9a0SAchim Leubner                            (pList)->Count --;                           \
2724e1bc9a0SAchim Leubner                            }
2734e1bc9a0SAchim Leubner 
2744e1bc9a0SAchim Leubner #define saLlistIORemove(pList, pLink) {                                 \
2754e1bc9a0SAchim Leubner                            (pLink)->pPrev->pNext = (pLink)->pNext;      \
2764e1bc9a0SAchim Leubner                            (pLink)->pNext->pPrev = (pLink)->pPrev;      \
2774e1bc9a0SAchim Leubner                            (pLink)->pHead = agNULL;                     \
2784e1bc9a0SAchim Leubner                            (pList)->Count --;                           \
2794e1bc9a0SAchim Leubner                            }
2804e1bc9a0SAchim Leubner /*! \def saLlistGetHead(pList)
2814e1bc9a0SAchim Leubner * \brief saLlistGetHead macro
2824e1bc9a0SAchim Leubner *
2834e1bc9a0SAchim Leubner * use to get the link following the head link
2844e1bc9a0SAchim Leubner */
2854e1bc9a0SAchim Leubner /********************************************************************************
2864e1bc9a0SAchim Leubner ********************************************************************************
2874e1bc9a0SAchim Leubner **
2884e1bc9a0SAchim Leubner ** MODULE NAME: saLlistGetHead
2894e1bc9a0SAchim Leubner **
2904e1bc9a0SAchim Leubner ** PURPOSE:     get the link following the head link.
2914e1bc9a0SAchim Leubner **
2924e1bc9a0SAchim Leubner ** PARAMETERS:  PSALINK_LIST  OUT - Link list definition.
2934e1bc9a0SAchim Leubner **              RETURNS - PSALINK   the link following the head
2944e1bc9a0SAchim Leubner **                                  agNULL if the following link is the head
2954e1bc9a0SAchim Leubner **
2964e1bc9a0SAchim Leubner ** SIDE EFFECTS & CAVEATS:
2974e1bc9a0SAchim Leubner **   !!! assumes that fcllistInitialize has been called on the linklist
2984e1bc9a0SAchim Leubner **   !!! if not, this function behavior is un-predictable
2994e1bc9a0SAchim Leubner **
3004e1bc9a0SAchim Leubner ** ALGORITHM:
3014e1bc9a0SAchim Leubner **
3024e1bc9a0SAchim Leubner ********************************************************************************
3034e1bc9a0SAchim Leubner *******************************************************************************/
3044e1bc9a0SAchim Leubner #define saLlistGetHead(pList) saLlistGetNext(pList,(pList)->pHead)
3054e1bc9a0SAchim Leubner 
3064e1bc9a0SAchim Leubner #define saLlistIOGetHead(pList) saLlistGetNext(pList,(pList)->pHead)
3074e1bc9a0SAchim Leubner 
3084e1bc9a0SAchim Leubner /*! \def saLlistGetTail(pList)
3094e1bc9a0SAchim Leubner * \brief saLlistGetTail macro
3104e1bc9a0SAchim Leubner *
3114e1bc9a0SAchim Leubner * use to get the link preceding the tail link
3124e1bc9a0SAchim Leubner */
3134e1bc9a0SAchim Leubner /********************************************************************************
3144e1bc9a0SAchim Leubner ********************************************************************************
3154e1bc9a0SAchim Leubner **
3164e1bc9a0SAchim Leubner ** MODULE NAME: saLlistGetTail
3174e1bc9a0SAchim Leubner **
3184e1bc9a0SAchim Leubner ** PURPOSE:     get the link preceding the tail link.
3194e1bc9a0SAchim Leubner **
3204e1bc9a0SAchim Leubner ** PARAMETERS:  PSALINK_LIST  OUT - Link list definition.
3214e1bc9a0SAchim Leubner **              RETURNS - PSALINK   the link preceding the head
3224e1bc9a0SAchim Leubner **                                  agNULL if the preceding link is the head
3234e1bc9a0SAchim Leubner **
3244e1bc9a0SAchim Leubner ** SIDE EFFECTS & CAVEATS:
3254e1bc9a0SAchim Leubner **
3264e1bc9a0SAchim Leubner ** ALGORITHM:
3274e1bc9a0SAchim Leubner **
3284e1bc9a0SAchim Leubner ********************************************************************************
3294e1bc9a0SAchim Leubner *******************************************************************************/
3304e1bc9a0SAchim Leubner #define saLlistGetTail(pList) saLlistGetPrev((pList), (pList)->pHead)
3314e1bc9a0SAchim Leubner 
3324e1bc9a0SAchim Leubner /*! \def saLlistGetCount(pList)
3334e1bc9a0SAchim Leubner * \brief saLlistGetCount macro
3344e1bc9a0SAchim Leubner *
3354e1bc9a0SAchim Leubner * use to get the number of links in the list excluding head and tail
3364e1bc9a0SAchim Leubner */
3374e1bc9a0SAchim Leubner /********************************************************************************
3384e1bc9a0SAchim Leubner ********************************************************************************
3394e1bc9a0SAchim Leubner **
3404e1bc9a0SAchim Leubner ** MODULE NAME: saLlistGetCount
3414e1bc9a0SAchim Leubner **
3424e1bc9a0SAchim Leubner ** PURPOSE:     get the number of links in the list excluding head and tail.
3434e1bc9a0SAchim Leubner **
3444e1bc9a0SAchim Leubner ** PARAMETERS:  PSALINK_LIST  OUT - Link list definition.
3454e1bc9a0SAchim Leubner **
3464e1bc9a0SAchim Leubner ** SIDE EFFECTS & CAVEATS:
3474e1bc9a0SAchim Leubner **   !!! assumes that fcllistInitialize has been called on the linklist
3484e1bc9a0SAchim Leubner **   !!! if not, this function behavior is un-predictable
3494e1bc9a0SAchim Leubner **
3504e1bc9a0SAchim Leubner ** ALGORITHM:
3514e1bc9a0SAchim Leubner **
3524e1bc9a0SAchim Leubner ********************************************************************************
3534e1bc9a0SAchim Leubner *******************************************************************************/
3544e1bc9a0SAchim Leubner 
3554e1bc9a0SAchim Leubner /*lint -emacro(613,saLlistGetCount) */
3564e1bc9a0SAchim Leubner /*lint -emacro(666,saLlistGetCount) */
3574e1bc9a0SAchim Leubner 
3584e1bc9a0SAchim Leubner #define saLlistGetCount(pList) ((pList)->Count)
3594e1bc9a0SAchim Leubner 
3604e1bc9a0SAchim Leubner #define saLlistIOGetCount(pList) ((pList)->Count)
3614e1bc9a0SAchim Leubner 
3624e1bc9a0SAchim Leubner /*! \def saLlistGetNext(pList, pLink)
3634e1bc9a0SAchim Leubner * \brief saLlistGetNext macro
3644e1bc9a0SAchim Leubner *
3654e1bc9a0SAchim Leubner * use to get the next link in the list
3664e1bc9a0SAchim Leubner */
3674e1bc9a0SAchim Leubner /********************************************************************************
3684e1bc9a0SAchim Leubner ********************************************************************************
3694e1bc9a0SAchim Leubner **
3704e1bc9a0SAchim Leubner ** MODULE NAME: saLlistGetNext
3714e1bc9a0SAchim Leubner **
3724e1bc9a0SAchim Leubner ** PURPOSE:     get the next link in the list. (one toward tail)
3734e1bc9a0SAchim Leubner **
3744e1bc9a0SAchim Leubner ** PARAMETERS:  PSALINK_LIST  OUT - Link list definition.
3754e1bc9a0SAchim Leubner **              PSALINK       IN  - Link to get next to
3764e1bc9a0SAchim Leubner **
3774e1bc9a0SAchim Leubner **           return PLINK  - points to next link
3784e1bc9a0SAchim Leubner **                           agNULL if next link is head
3794e1bc9a0SAchim Leubner **
3804e1bc9a0SAchim Leubner ** SIDE EFFECTS & CAVEATS:
3814e1bc9a0SAchim Leubner **   !!! assumes that fcllistInitialize has been called on the linklist
3824e1bc9a0SAchim Leubner **   !!! if not, this function behavior is un-predictable
3834e1bc9a0SAchim Leubner **
3844e1bc9a0SAchim Leubner **   !!! No validation is made on the list or the validity of the link
3854e1bc9a0SAchim Leubner **   !!! the caller must make sure that the link is in the list
3864e1bc9a0SAchim Leubner **
3874e1bc9a0SAchim Leubner ** ALGORITHM:
3884e1bc9a0SAchim Leubner **
3894e1bc9a0SAchim Leubner ********************************************************************************
3904e1bc9a0SAchim Leubner *******************************************************************************/
3914e1bc9a0SAchim Leubner 
3924e1bc9a0SAchim Leubner /*lint -emacro(613,saLlistGetNext) */
3934e1bc9a0SAchim Leubner 
3944e1bc9a0SAchim Leubner #define saLlistGetNext(pList, pLink) (((pLink)->pNext == (pList)->pHead) ?  \
3954e1bc9a0SAchim Leubner                                       agNULL : (pLink)->pNext)
3964e1bc9a0SAchim Leubner 
3974e1bc9a0SAchim Leubner #define saLlistIOGetNext(pList, pLink) (((pLink)->pNext == (pList)->pHead) ?  \
3984e1bc9a0SAchim Leubner                                         agNULL : (pLink)->pNext)
3994e1bc9a0SAchim Leubner 
4004e1bc9a0SAchim Leubner /*! \def saLlistGetPrev(pList, pLink)
4014e1bc9a0SAchim Leubner * \brief saLlistGetPrev macro
4024e1bc9a0SAchim Leubner *
4034e1bc9a0SAchim Leubner * use to get the previous link in the list
4044e1bc9a0SAchim Leubner */
4054e1bc9a0SAchim Leubner /********************************************************************************
4064e1bc9a0SAchim Leubner ********************************************************************************
4074e1bc9a0SAchim Leubner **
4084e1bc9a0SAchim Leubner ** MODULE NAME: saLlistGetPrev
4094e1bc9a0SAchim Leubner **
4104e1bc9a0SAchim Leubner ** PURPOSE:     get the previous link in the list. (one toward head)
4114e1bc9a0SAchim Leubner **
4124e1bc9a0SAchim Leubner ** PARAMETERS:  PSALINK_LIST  OUT - Link list definition.
4134e1bc9a0SAchim Leubner **              PSALINK       IN  - Link to get prev to
4144e1bc9a0SAchim Leubner **
4154e1bc9a0SAchim Leubner **           return PLINK  - points to previous link
4164e1bc9a0SAchim Leubner **                           agNULL if previous link is head
4174e1bc9a0SAchim Leubner **
4184e1bc9a0SAchim Leubner ** SIDE EFFECTS & CAVEATS:
4194e1bc9a0SAchim Leubner **   !!! assumes that fcllistInitialize has been called on the linklist
4204e1bc9a0SAchim Leubner **   !!! if not, this function behavior is un-predictable
4214e1bc9a0SAchim Leubner **
4224e1bc9a0SAchim Leubner **   !!! No validation is made on the list or the validity of the link
4234e1bc9a0SAchim Leubner **   !!! the caller must make sure that the link is in the list
4244e1bc9a0SAchim Leubner **
4254e1bc9a0SAchim Leubner ** ALGORITHM:
4264e1bc9a0SAchim Leubner **
4274e1bc9a0SAchim Leubner ********************************************************************************
4284e1bc9a0SAchim Leubner *******************************************************************************/
4294e1bc9a0SAchim Leubner 
4304e1bc9a0SAchim Leubner /*lint -emacro(613,saLlistGetPrev) */
4314e1bc9a0SAchim Leubner 
4324e1bc9a0SAchim Leubner #define saLlistGetPrev(pList, pLink) (((pLink)->pPrev == (pList)->pHead) ?  \
4334e1bc9a0SAchim Leubner                                       agNULL : (pLink)->pPrev)
4344e1bc9a0SAchim Leubner 
4354e1bc9a0SAchim Leubner 
4364e1bc9a0SAchim Leubner 
4374e1bc9a0SAchim Leubner #define agObjectBase(baseType,fieldName,fieldPtr) \
4384e1bc9a0SAchim Leubner             (void * ) fieldPtr == (void *) 0 ? (baseType *) 0 : \
4394e1bc9a0SAchim Leubner             ((baseType *)((bit8 *)(fieldPtr) - ((bitptr)(&(((baseType *)0)->fieldName)))))
4404e1bc9a0SAchim Leubner 
4414e1bc9a0SAchim Leubner 
4424e1bc9a0SAchim Leubner #endif /* #ifndef __SALLIST_H__*/
443