diff options
author | Danny Holman <dholman@gymli.org> | 2024-05-27 13:53:52 -0500 |
---|---|---|
committer | Danny Holman <dholman@gymli.org> | 2024-05-27 13:53:52 -0500 |
commit | aaf7355c5ededfcdc877c7f2989fb1ba02dfb848 (patch) | |
tree | 0c4588650fe1fc1fa1af2972353a2bc920cf1e68 /include/libk/data | |
parent | 41cff28f5447b5f669db62ce2a73be98bc5bce37 (diff) |
libk: create a subset libc for kernel use
Create a subset of the C library for use inside the kernel.
Signed-off-by: Danny Holman <dholman@gymli.org>
Diffstat (limited to 'include/libk/data')
-rw-r--r-- | include/libk/data/list.h | 32 | ||||
-rw-r--r-- | include/libk/data/ringbuf.h | 50 |
2 files changed, 82 insertions, 0 deletions
diff --git a/include/libk/data/list.h b/include/libk/data/list.h new file mode 100644 index 0000000..69eee3a --- /dev/null +++ b/include/libk/data/list.h @@ -0,0 +1,32 @@ +#ifndef LIBK_LIST_H +#define LIBK_LIST_H + +#include <stddef.h> + +struct list_head { + struct list_head *next; + struct list_head *prev; +}; + +static inline void list_add(struct list_head *new, struct list_head *head) { + struct list_head *temp = head; + while (temp->next != NULL) + temp = temp->next; + + temp->next = new; + new->prev = temp; + new->next = NULL; +} + +static inline void list_del(struct list_head *item) { + struct list_head *next = item->next; + struct list_head *prev = item->prev; + if (next != NULL) + next->prev = prev; + if (prev != NULL) + prev->next = next; + item->next = NULL; + item->prev = NULL; +} + +#endif diff --git a/include/libk/data/ringbuf.h b/include/libk/data/ringbuf.h new file mode 100644 index 0000000..cc6d77b --- /dev/null +++ b/include/libk/data/ringbuf.h @@ -0,0 +1,50 @@ +#ifndef LIBK_RINGBUF_H +#define LIBK_RINGBUF_H + +#include <kernel/kmalloc.h> +#include <kernel/string.h> +#include <stdint.h> + +struct ringbuf { + void *buffer; + void *buf_end; + uint32_t capacity; + uint32_t count; + uint32_t size; + void *head; + void *tail; +}; + +static inline void rb_init(struct ringbuf *rb, uint32_t capacity, uint32_t size) { + rb->buffer = kmalloc(capacity * size); + rb->buf_end = (char*)rb->buffer + (capacity * size); + rb->capacity = capacity; + rb->size = size; + rb->head = rb->buffer; + rb->tail = rb->buffer; +} + +static inline int rb_push_back(struct ringbuf *rb, const void *item, size_t size) { + if (rb->count == rb->capacity) + return -1; + if (size > rb->size) + return -1; + + void *tmp = rb->tail + rb->size; + if (tmp > rb->head + rb->capacity * rb->size) + rb->tail = rb->head; + memcpy(rb->tail, item, size); + rb->tail += rb->size; + rb->count++; + return 0; +} + +static inline void rb_pop_front(struct ringbuf *rb, void *item) { + memcpy(item, rb->tail, rb->size); + rb->tail = (char*)rb->tail + rb->size; + if (rb->tail == rb->buf_end) + rb->tail = rb->buffer; + rb->count--; +} + +#endif |