diff options
Diffstat (limited to 'kernel/lib')
-rw-r--r-- | kernel/lib/list.c | 39 | ||||
-rw-r--r-- | kernel/lib/list.h | 13 |
2 files changed, 52 insertions, 0 deletions
diff --git a/kernel/lib/list.c b/kernel/lib/list.c new file mode 100644 index 0000000..12104d8 --- /dev/null +++ b/kernel/lib/list.c @@ -0,0 +1,39 @@ +#include <assert.h> +#include <kmalloc.h> +#include <lib/list.h> + +int list_init(struct list *list) { + // TODO: Make it dynamic + list->entries = kmalloc(sizeof(void *) * 100); + if (!list->entries) { + return 0; + } + list->tail_index = -1; + return 1; +} + +void list_reset(struct list *list) { + list->tail_index = -1; +} + +int list_add(struct list *list, void *entry) { + if (list->tail_index > 100 - 1) { + kprintf("Error: list has run out of space\n"); + assert(0); + } + list->tail_index++; + list->entries[list->tail_index] = entry; + return 1; +} + +int list_get(const struct list *list, int index, void **out) { + if (index > list->tail_index) { + return 0; + } + *out = list->entries[index]; + return 1; +} + +void list_free(struct list *list) { + kfree(list->entries); +} diff --git a/kernel/lib/list.h b/kernel/lib/list.h new file mode 100644 index 0000000..8c3cce4 --- /dev/null +++ b/kernel/lib/list.h @@ -0,0 +1,13 @@ +#ifndef LIST_H +#define LIST_H +struct list { + void **entries; + int tail_index; +}; + +int list_init(struct list *list); +void list_reset(struct list *list); +void list_free(struct list *list); +int list_add(struct list *list, void *entry); +int list_get(const struct list *list, int index, void **out); +#endif |