#include <ubixos/lists.h> #include <lib/kmalloc.h> #include <assert.h> #define NULL 0x0 /* checked */ List_t * InitializeList() { List_t * TList; TList = kmalloc(sizeof *TList); TList->First = NULL; TList->Last = NULL; return TList; } /* checked */ Item_t * CreateItem() { Item_t * p; p = kmalloc(sizeof *p); p->Next = NULL; p->Previous = NULL; p->data = NULL; return p; } /* checked */ int InsertItemAtFront( IN List_t * TList, IN Item_t * kItem) { if(TList->First == NULL) { TList->First = kItem; TList->Last = kItem; kItem->Previous = NULL; kItem->Next = NULL; } else { Item_t * FirstItem; FirstItem = TList->First; kItem->Next = FirstItem; TList->First = kItem; FirstItem->Previous = 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(); SetItemPriority(a, 1); SetItemPriority(b, 2); SetItemPriority(c, 3); SetItemPriority(d, 4); SetItemPriority(e, 5); 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; } */