Newer
Older
tree-os / src / kernel / util / list.c
#include <alloc.h>
#include <list.h>

void memset(void *buffer, uint8_t byte, uint32_t count) {
    uint8_t *byteBuffer = buffer;
    for (uint32_t i = 0; i < count; i++) {
        byteBuffer[i] = byte;
    }
}

void listAdd(ListElement **list, void *data) {
    ListElement *element = *list;
    if (element == NULL) {
        *list = malloc(sizeof(ListElement));
        element = *list;
    } else {
        for (; element->next; element = element->next) {
        }
        element->next = malloc(sizeof(ListElement));
        element = element->next;
    }
    element->next = NULL;
    element->data = data;
}

void listAddSet(ListElement **list, void *data) {
    ListElement *element = *list;
    if (element == NULL) {
        *list = malloc(sizeof(ListElement));
        element = *list;
    } else {
        for (; element->next; element = element->next) {
            if (element->data == data) {
                return;
            }
        }
        element->next = malloc(sizeof(ListElement));
        element = element->next;
    }
    element->next = NULL;
    element->data = data;
}

uint32_t listCount(ListElement *list) {
    int count = 0;
    for (ListElement *current = list; current; current = current->next) {
        count++;
    }
    return count;
}

void *popBeginning(ListElement **list) {
    if (*list == NULL) {
        return NULL;
    }
    ListElement *element = *list;
    void *result = (*list)->data;
    *list = (*list)->next;
    free(element);
    return result;
}

void *listPopEnd(ListElement **list) {
    if (list == NULL) {
        return NULL;
    }
    ListElement *before = NULL;
    ListElement *current = *list;
    for (; current->next; current = current->next) {
        before = current;
    }
    void *result = current->data;
    free(current);
    if (before != NULL) {
        before->next = NULL;
    } else {
        *list = NULL;
    }
    return result;
}

void *listGet(ListElement **list, uint32_t index) {
    ListElement *current = *list;
    if (!current) {
        return NULL;
    }
    for (uint32_t i = 0; i < index && current; i++) {
        current = current->next;
    }
    if (!current) {
        return NULL;
    }
    return current->data;
}

void listClear(ListElement **list, bool freeData) {
    ListElement *current = *list, *next;
    while (current) {
        next = current->next;
        if (freeData) {
            free(current->data);
        }
        free(current);
        current = next;
    }
    *list = NULL;
}