#include <sys/types.h>
#include <sys/param.h>
#include <sys/debug.h>
#include "ghd_queue.h"
void
L1_add(L1_t *lp, L1el_t *lep, void *datap)
{
lep->le_nextp = NULL;
lep->le_datap = datap;
if (!lp->l1_tailp) {
lp->l1_headp = lep;
} else {
lp->l1_tailp->le_nextp = lep;
}
lp->l1_tailp = lep;
}
void
L1_delete(L1_t *lp, L1el_t *lep)
{
L1el_t *prevp;
if (lp->l1_headp == lep) {
if ((lp->l1_headp = lep->le_nextp) == NULL) {
lp->l1_tailp = NULL;
}
return;
}
for (prevp = lp->l1_headp; prevp != NULL; prevp = prevp->le_nextp) {
if (prevp->le_nextp == lep) {
if ((prevp->le_nextp = lep->le_nextp) == NULL)
lp->l1_tailp = prevp;
return;
}
}
}
void *
L1_remove(L1_t *lp)
{
L1el_t *lep;
if ((lep = lp->l1_headp) == NULL) {
return (NULL);
}
if ((lp->l1_headp = lep->le_nextp) == NULL)
lp->l1_tailp = NULL;
lep->le_nextp = NULL;
return (lep->le_datap);
}
void
L2_add(L2el_t *headp, L2el_t *elementp, void *private)
{
ASSERT(headp != NULL && elementp != NULL);
ASSERT(headp->l2_nextp != NULL);
ASSERT(headp->l2_prevp != NULL);
elementp->l2_private = private;
elementp->l2_nextp = headp;
elementp->l2_prevp = headp->l2_prevp;
headp->l2_prevp->l2_nextp = elementp;
headp->l2_prevp = elementp;
}
void
L2_delete(L2el_t *elementp)
{
ASSERT(elementp != NULL);
ASSERT(elementp->l2_nextp != NULL);
ASSERT(elementp->l2_prevp != NULL);
ASSERT(elementp->l2_nextp->l2_prevp == elementp);
ASSERT(elementp->l2_prevp->l2_nextp == elementp);
elementp->l2_prevp->l2_nextp = elementp->l2_nextp;
elementp->l2_nextp->l2_prevp = elementp->l2_prevp;
elementp->l2_nextp = elementp;
elementp->l2_prevp = elementp;
}
void
L2_add_head(L2el_t *headp, L2el_t *elementp, void *private)
{
ASSERT(headp != NULL && elementp != NULL);
ASSERT(headp->l2_nextp != NULL);
ASSERT(headp->l2_prevp != NULL);
elementp->l2_private = private;
elementp->l2_prevp = headp;
elementp->l2_nextp = headp->l2_nextp;
headp->l2_nextp->l2_prevp = elementp;
headp->l2_nextp = elementp;
}
void *
L2_remove_head(L2el_t *headp)
{
L2el_t *elementp;
ASSERT(headp != NULL);
if (L2_EMPTY(headp))
return (NULL);
elementp = headp->l2_nextp;
headp->l2_nextp = elementp->l2_nextp;
elementp->l2_nextp->l2_prevp = headp;
elementp->l2_nextp = elementp;
elementp->l2_prevp = elementp;
return (elementp->l2_private);
}
void *
L2_next(L2el_t *elementp)
{
ASSERT(elementp != NULL);
if (L2_EMPTY(elementp))
return (NULL);
return (elementp->l2_nextp->l2_private);
}