173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin/*
273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Copyright 2001-2008 Texas Instruments - http://www.ti.com/
373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *
473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Licensed under the Apache License, Version 2.0 (the "License");
573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  you may not use this file except in compliance with the License.
673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  You may obtain a copy of the License at
773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *
873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *     http://www.apache.org/licenses/LICENSE-2.0
973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *
1073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Unless required by applicable law or agreed to in writing, software
1173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  distributed under the License is distributed on an "AS IS" BASIS,
1273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  See the License for the specific language governing permissions and
1473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  limitations under the License.
1573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin */
1673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
1773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
1873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin/*
1973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  ======== list.h ========
2073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  DSP-BIOS Bridge driver support functions for TI OMAP processors.
2173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Purpose:
2273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Declarations of list management control structures and definitions
2373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      of inline list management functions.
2473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *
2573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Public Functions:
2673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST_Create
2773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST_Delete
2873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST_Exit
2973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST_First
3073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST_GetHead
3173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST_InitElem
3273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST_Init
3373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST_InsertBefore
3473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST_IsEmpty
3573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST_Next
3673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST_PutTail
3773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST_RemoveElem
3873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *
3973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Notes:
4073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *
4173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *! Revision History
4273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *! ================
4373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *! 10-Aug-2000 ag:  Added LST_InsertBefore().
4473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *! 29-Oct-1999 kc:  Cleaned up for code review.
4573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *! 16-Aug-1997 cr:  added explicit identifiers.
4673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *! 10-Aug-1996 gp:  Acquired from SMM for WinSPOX v.1.1; renamed identifiers.
4773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *! 21-Oct-1994 dh4: Cleaned / commented for code review.
4873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *! 08-Jun-1994 dh4: Converted to SPM (added extern "C").
4973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin */
5073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
5173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin#ifndef LIST_
5273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin#define LIST_
5373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
5473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin#ifdef __cplusplus
5573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavinextern "C" {
5673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin#endif
5773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
5873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin#include <dspapi.h>
5973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
6073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin#define LST_IsEmpty(l)      (((l)->head.next == &(l)->head))
6173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
6273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	struct LST_ELEM {
6373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin		struct LST_ELEM *next;
6473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin		struct LST_ELEM *prev;
6573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin		struct LST_ELEM *self;
6673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	} ;
6773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
6873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	/*typedef LST_ELEM *LST_PELEM;*/
6973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
7073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	struct LST_LIST {
7173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin		struct LST_ELEM head;
7273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	} ;
7373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
7473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	/*typedef LST_LIST *LST_PLIST;*/
7573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
7673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin/*
7773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  ======== LST_Create ========
7873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Purpose:
7973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Allocates and initializes a circular list.
8073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Details:
8173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Uses portable MEM_Calloc() function to allocate a list containing
8273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      a single element and initializes that element to indicate that it
8373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      is the "end of the list" (i.e., the list is empty).
8473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      An empty list is indicated by the "next" pointer in the element
8573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      at the head of the list pointing to the head of the list, itself.
8673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Parameters:
8773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Returns:
8873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Pointer to beginning of created list (success)
8973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      NULL --> Allocation failed
9073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Requires:
9173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST initialized.
9273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Ensures:
9373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Notes:
9473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      The created list contains a single element.  This element is the
9573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      "empty" element, because its "next" and "prev" pointers point at
9673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      the same location (the element itself).
9773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin */
9873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	extern struct LST_LIST* LST_Create();
9973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
10073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin/*
10173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  ======== LST_Delete ========
10273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Purpose:
10373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Removes a list by freeing its control structure's memory space.
10473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Details:
10573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Uses portable MEM_Free() function to deallocate the memory
10673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      block pointed at by the input parameter.
10773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Parameters:
10873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pList:  Pointer to list control structure of list to be deleted
10973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Returns:
11073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Void
11173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Requires:
11273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - LST initialized.
11373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - pList != NULL.
11473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Ensures:
11573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Notes:
11673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Must ONLY be used for empty lists, because it does not walk the
11773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      chain of list elements.  Calling this function on a non-empty list
11873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      will cause a memory leak.
11973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin */
12073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	extern VOID LST_Delete(IN struct LST_LIST* pList);
12173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
12273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin/*
12373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  ======== LST_Exit ========
12473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Purpose:
12573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Discontinue usage of module; free resources when reference count
12673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      reaches 0.
12773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Parameters:
12873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Returns:
12973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Requires:
13073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST initialized.
13173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Ensures:
13273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Resources used by module are freed when cRef reaches zero.
13373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin */
13473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	extern VOID LST_Exit();
13573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
13673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin/*
13773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  ======== LST_First ========
13873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Purpose:
13973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Returns a pointer to the first element of the list, or NULL if the list
14073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      is empty.
14173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Parameters:
14273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pList:  Pointer to list control structure.
14373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Returns:
14473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Pointer to first list element, or NULL.
14573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Requires:
14673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - LST initialized.
14773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - pList != NULL.
14873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Ensures:
14973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin */
15073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	extern struct LST_ELEM* LST_First(IN struct LST_LIST* pList);
15173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
15273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin/*
15373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  ======== LST_GetHead ========
15473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Purpose:
15573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Pops the head off the list and returns a pointer to it.
15673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Details:
15773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      If the list is empty, returns NULL.
15873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Else, removes the element at the head of the list, making the next
15973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      element the head of the list.
16073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      The head is removed by making the tail element of the list point its
16173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      "next" pointer at the next element after the head, and by making the
16273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      "prev" pointer of the next element after the head point at the tail
16373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      element.  So the next element after the head becomes the new head of
16473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      the list.
16573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Parameters:
16673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pList:  Pointer to list control structure of list whose head
16773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *              element is to be removed
16873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Returns:
16973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Pointer to element that was at the head of the list (success)
17073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      NULL          No elements in list
17173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Requires:
17273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - head.self must be correctly set to &head.
17373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - LST initialized.
17473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - pList != NULL.
17573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Ensures:
17673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Notes:
17773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Because the tail of the list points forward (its "next" pointer) to
17873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      the head of the list, and the head of the list points backward (its
17973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      "prev" pointer) to the tail of the list, this list is circular.
18073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin */
18173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	extern struct LST_ELEM* LST_GetHead(IN struct LST_LIST* pList);
18273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
18373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin/*
18473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  ======== LST_Init ========
18573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Purpose:
18673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Initializes private state of LST module.
18773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Parameters:
18873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Returns:
18973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      TRUE if initialized; FALSE otherwise.
19073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Requires:
19173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Ensures:
19273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST initialized.
19373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin */
19473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	extern bool LST_Init();
19573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
19673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin/*
19773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  ======== LST_InitElem ========
19873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Purpose:
19973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Initializes a list element to default (cleared) values
20073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Details:
20173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Parameters:
20273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pElem:  Pointer to list element to be reset
20373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Returns:
20473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Requires:
20573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST initialized.
20673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Ensures:
20773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Notes:
20873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      This function must not be called to "reset" an element in the middle
20973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      of a list chain -- that would break the chain.
21073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *
21173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin */
21273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	extern VOID LST_InitElem(IN struct LST_ELEM* pListElem);
21373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
21473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin/*
21573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  ======== LST_InsertBefore ========
21673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Purpose:
21773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *     Insert the element before the existing element.
21873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Parameters:
21973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pList:          Pointer to list control structure.
22073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pElem:          Pointer to element in list to insert.
22173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pElemExisting:  Pointer to existing list element.
22273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Returns:
22373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Requires:
22473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - LST initialized.
22573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - pList != NULL.
22673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - pElem != NULL.
22773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - pElemExisting != NULL.
22873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Ensures:
22973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin */
23073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	extern VOID LST_InsertBefore(IN struct LST_LIST* pList,
23173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin				     IN struct LST_ELEM* pElem,
23273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin				     IN struct LST_ELEM* pElemExisting);
23373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
23473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin/*
23573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  ======== LST_Next ========
23673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Purpose:
23773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Returns a pointer to the next element of the list, or NULL if the next
23873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      element is the head of the list or the list is empty.
23973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Parameters:
24073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pList:      Pointer to list control structure.
24173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pCurElem:   Pointer to element in list to remove.
24273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Returns:
24373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Pointer to list element, or NULL.
24473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Requires:
24573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - LST initialized.
24673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - pList != NULL.
24773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - pCurElem != NULL.
24873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Ensures:
24973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin */
25073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	extern struct LST_ELEM* LST_Next(IN struct LST_LIST* pList,
25173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin											IN struct LST_ELEM* pCurElem);
25273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
25373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin/*
25473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  ======== LST_PutTail ========
25573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Purpose:
25673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Adds the specified element to the tail of the list
25773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Details:
25873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Sets new element's "prev" pointer to the address previously held by
25973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      the head element's prev pointer.  This is the previous tail member of
26073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      the list.
26173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Sets the new head's prev pointer to the address of the element.
26273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Sets next pointer of the previous tail member of the list to point to
26373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      the new element (rather than the head, which it had been pointing at).
26473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Sets new element's next pointer to the address of the head element.
26573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Sets head's prev pointer to the address of the new element.
26673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Parameters:
26773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pList:  Pointer to list control structure to which *pElem will be
26873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *              added
26973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pElem:  Pointer to list element to be added
27073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Returns:
27173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Void
27273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Requires:
27373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      *pElem and *pList must both exist.
27473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pElem->self = pElem before pElem is passed to this function.
27573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      LST initialized.
27673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Ensures:
27773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Notes:
27873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Because the tail is always "just before" the head of the list (the
27973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      tail's "next" pointer points at the head of the list, and the head's
28073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      "prev" pointer points at the tail of the list), the list is circular.
28173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Warning: if pElem->self is not set beforehand, LST_GetHead() will
28273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      return an erroneous pointer when it is called for this element.
28373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin */
28473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin	extern VOID LST_PutTail(IN struct LST_LIST* pList,
28573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin										IN struct LST_ELEM* pListElem);
28673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
28773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin/*
28873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  ======== LST_RemoveElem ========
28973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Purpose:
29073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      Removes (unlinks) the given element from the list, if the list is not
29173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      empty.  Does not free the list element.
29273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Parameters:
29373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pList:      Pointer to list control structure.
29473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      pCurElem:   Pointer to element in list to remove.
29573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Returns:
29673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Requires:
29773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - LST initialized.
29873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - pList != NULL.
29973b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *      - pCurElem != NULL.
30073b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin *  Ensures:
30173b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin */
30273b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavinextern VOID LST_RemoveElem(IN struct LST_LIST* pList,
30373b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin											IN struct LST_ELEM* pCurElem);
30473b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin
30573b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin#ifdef __cplusplus
30673b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin}
30773b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin#endif
30873b11d6e96b6d49896738a1a1c87b295c1b96be2Rebecca Schultz Zavin#endif				/* LIST_ */
309