#include <ubixos/lists.h>
#include <lib/kmalloc.h>
#include <assert.h>
#define NULL 0x0
/* checked */
List_t *
InitializeList()
{
List_t * TList;
TList = (List_t *)kmalloc( sizeof (List_t) );
TList->First = NULL;
TList->Last = NULL;
return TList;
}
/* checked */
Item_t *
CreateItem()
{
Item_t * p;
p = (Item_t *)kmalloc(sizeof (Item_t));
p->Next = NULL;
p->Previous = NULL;
p->data = (void *)kmalloc(sizeof (p->data));
return p;
}
/* checked */
int
InsertItemAtFront( IN List_t *TList,
IN Item_t *kItem)
{
if(TList->First == NULL)
{
TList->First = (Item_t *)kItem;
TList->Last = (Item_t *)kItem;
kItem->Previous = NULL;
kItem->Next = NULL;
}
else
{
Item_t *FirstItem;
FirstItem = (Item_t *)TList->First;
kItem->Next = (Item_t *)FirstItem;
TList->First = (Item_t *)kItem;
FirstItem->Previous = (Item_t *)kItem;
}
return STATUS_SUCCESS;
}
/* checked */
int
InsertItemBetweenItems( IN List_t * TList,
IN Item_t * Previous,
IN Item_t * Next,
IN Item_t * Insert)
{
if(Previous == NULL || Next == NULL)
return STATUS_FAILURE;
else
{
Previous->Next = Insert;
Next->Previous = Insert;
Insert->Previous = Previous;
Insert->Next = Next;
}
return STATUS_SUCCESS;
}
/* checked */
int
RemoveItem( IN List_t * TList,
IN Item_t * kItem)
{
kItem->Previous->Next = kItem->Next;
kItem->Next->Previous = kItem->Previous;
kItem->Previous = NULL;
kItem->Next = NULL;
return STATUS_SUCCESS;
}
/* checked */
int
DestroyItemsInList(IN List_t * ItemList)
{
Item_t * z, *tmp;
z = ItemList->Last;
while(z != NULL)
{
tmp = z->Previous;
kfree(z);
z = tmp;
}
ItemList->First = NULL;
ItemList->Last = NULL;
return STATUS_SUCCESS;
}
int
DestroyItemList(IN List_t * ItemList)
{
kfree(ItemList);
return STATUS_SUCCESS;
}
/* checked */
Item_t *
GetFirstItem(IN List_t * kItem)
{
return kItem->First;
}
/* checked */
Item_t *
GetLastItem(IN List_t * kItem)
{
return kItem->Last;
}
/* checked */
List_t *
RemoveItemListBetweenItems( IN Item_t * Previous,
IN Item_t * Next)
{
List_t * NewList;
NewList = InitializeList();
NewList->First = Previous->Next;
NewList->Last = Next->Previous;
NewList->First->Previous = NULL;
NewList->Last->Next = NULL;
Previous->Next = Next;
Next->Previous = Previous;
return NewList;
}
/* checked */
void
InsertItemListBetweenItems( IN Item_t * Previous,
IN Item_t * Next,
IN List_t * Insert)
{
assert(Previous != NULL);
assert(Next != NULL);
Previous->Next = Insert->First;
Next->Previous = Insert->Last;
Insert->First->Previous = Previous;
Insert->Last->Next = Next;
return;
}
/*
e = CreateItem();
InsertItemAtFront(High, a);
InsertItemAtFront(High, b);
InsertItemAtFront(High, c);
InsertItemAtFront(High, d);
InsertItemAtFront(High, e);
z = High->Last;
while(z != NULL)
{
printf("Priority! equals %d\n", z->Priority);
z = z->Previous;
}
return 0;
}
*/