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