/*------------------------------------------------------------------ | Return the address of the place for uLen bytes of data in a new | item at the end of lst -------------------------------------------------------------------*/ LPVOID APIENTRY List_NewLast( LIST lst, UINT uLen ) { LIST pit; if (lst==NULL) { TRACE_ERROR("Bug: List_NewLast in bogus list. Continuing...", FALSE); return NULL; } pit = (LIST)list_Alloc(iHeaderSize+uLen); if (pit==NULL) { lst->bOK = FALSE; return NULL; } pit->pBlock = pCurrent; LeaveCriticalSection(&CritSec); pit->iLen = uLen; pit->pitNext = lst; pit->pitPrev = lst->pitPrev; lst->pitPrev->pitNext = pit; /* for empty list that set lst->pitNext */ lst->pitPrev = pit; pit->bAnchor = FALSE; return (char *)&(pit->Data); }
/*------------------------------------------------------------------ | Add an item holding Object to the beginning of * plst -------------------------------------------------------------------*/ void APIENTRY List_AddFirst( LIST lst, LPVOID pObject, UINT uLen ) { LIST pit; /* newly allocated item */ if (lst==NULL) { TRACE_ERROR("Bug: List_AddFirst to bogus list. Continuing...", FALSE); return; } pit = (LIST)list_Alloc(iHeaderSize+uLen); if (pit==NULL) { lst->bOK = FALSE; return; } pit->pBlock = pCurrent; LeaveCriticalSection(&CritSec); pit->iLen = uLen; pit->pitPrev = lst; pit->pitNext = lst->pitNext; lst->pitNext->pitPrev = pit; /* for empty list that set lst->pitPrev */ lst->pitNext = pit; pit->bAnchor = FALSE; memcpy( &(pit->Data), pObject, uLen ); }
/*-------------------------------------------------------------------- | Add an item holding Object to lst immediately before Curs. | List_AddBefore(Lst,NULL,Object,uLen) adds it to the end of the list ---------------------------------------------------------------------*/ void APIENTRY List_AddBefore( LIST lst, LPVOID Curs, LPVOID pObject, UINT uLen ) { LIST pitNew; LIST pitBefore; if (lst==NULL) { TRACE_ERROR("Bug: List_AddBefore in bogus list. Continuing...", FALSE); return; } if (Curs==NULL) { List_AddLast(lst, pObject, uLen); } else { MOVEBACK(Curs); pitBefore = (LIST)Curs; pitNew = (LIST)list_Alloc(iHeaderSize+uLen); if (pitNew==NULL) { lst->bOK = FALSE; return; } pitNew->pBlock = pCurrent; LeaveCriticalSection(&CritSec); pitNew->iLen = uLen; pitNew->pitNext = pitBefore; pitNew->pitPrev = pitBefore->pitPrev; pitBefore->pitPrev->pitNext = pitNew; pitBefore->pitPrev = pitNew; pitNew->bAnchor = FALSE; memcpy( &(pitNew->Data), pObject, uLen ); } }
/*-------------------------------------------------------------------- | Return the address of the place for uLen bytes of data in a new | item immediately after Curs. | List_NewAfter(Lst,NULL,uLen) returns a pointer | to space for uLen bytes in a new first element. ---------------------------------------------------------------------*/ LPVOID APIENTRY List_NewAfter( LIST lst, LPVOID Curs, UINT uLen ) { LIST pitNew; LIST pitAfter; if (lst==NULL) { TRACE_ERROR("Bug: List_NewAfter in bogus list. Continuing...", FALSE); return NULL; } if (Curs==NULL) { return List_NewFirst(lst, uLen); } else { MOVEBACK(Curs); pitAfter = (LIST)Curs; pitNew = (LIST)list_Alloc(iHeaderSize+uLen); if (pitNew==NULL) { lst->bOK = FALSE; return NULL; } pitNew->pBlock = pCurrent; LeaveCriticalSection(&CritSec); pitNew->iLen = uLen; pitNew->pitPrev = pitAfter; pitNew->pitNext = pitAfter->pitNext; pitAfter->pitNext->pitPrev = pitNew; pitAfter->pitNext = pitNew; pitNew->bAnchor = FALSE; return (char *)&(pitNew->Data); } }
/*------------------------------------------------------------------ | Create a list. It will be initially empty -------------------------------------------------------------------*/ LIST APIENTRY List_Create( void ) { LIST lst; if (!bInited) { List_Init(); /* prevent some strange errors */ } lst = (LIST)list_Alloc(iAnchorSize); if (lst==NULL) { return NULL; } lst->pBlock = pCurrent; LeaveCriticalSection(&CritSec); lst->bOK = TRUE; lst->pitNext = lst; lst->pitPrev = lst; lst->bAnchor = TRUE; /* no length field set in an anchor block */ return lst; }