diff options
Diffstat (limited to 'kernel/lib')
-rw-r--r-- | kernel/lib/buffered_write.c | 32 | ||||
-rw-r--r-- | kernel/lib/buffered_write.h | 12 | ||||
-rw-r--r-- | kernel/lib/stack.c | 35 | ||||
-rw-r--r-- | kernel/lib/stack.h | 18 |
4 files changed, 97 insertions, 0 deletions
diff --git a/kernel/lib/buffered_write.c b/kernel/lib/buffered_write.c new file mode 100644 index 0000000..e948e00 --- /dev/null +++ b/kernel/lib/buffered_write.c @@ -0,0 +1,32 @@ +#include <lib/buffered_write.h> +#include <kmalloc.h> + +int buffered_init(struct buffered *ctx, u16 size) { + ctx->data = kmalloc(size); + if (NULL == ctx->data) { + return 0; + } + ctx->buffer_size = size; + ctx->buffer_usage = 0; + return 1; +} + +int buffered_write(struct buffered *ctx, u8 *data, u16 length) { + if (length + ctx->buffer_usage > ctx->buffer_size) { + return 0; + } + u8 *data_ptr = ctx->data; + data_ptr += ctx->buffer_usage; + + memcpy(data_ptr, data, length); + ctx->buffer_usage += length; + return 1; +} + +void buffered_clear(struct buffered *ctx) { + ctx->buffer_usage = 0; +} + +void buffered_free(struct buffered *ctx) { + kfree(ctx->data); +} diff --git a/kernel/lib/buffered_write.h b/kernel/lib/buffered_write.h new file mode 100644 index 0000000..5dc78e7 --- /dev/null +++ b/kernel/lib/buffered_write.h @@ -0,0 +1,12 @@ +#include <typedefs.h> + +struct buffered { + u8 *data; + u16 buffer_usage; + u16 buffer_size; +}; + +int buffered_init(struct buffered *ctx, u16 size); +int buffered_write(struct buffered *ctx, u8 *data, u16 length); +void buffered_clear(struct buffered *ctx); +void buffered_free(struct buffered *ctx); diff --git a/kernel/lib/stack.c b/kernel/lib/stack.c new file mode 100644 index 0000000..7f31867 --- /dev/null +++ b/kernel/lib/stack.c @@ -0,0 +1,35 @@ +#include <kmalloc.h> +#include <lib/stack.h> +#include <stddef.h> + +void stack_init(struct stack *s) { + s->head = NULL; +} + +// 1 = Success +// 0 = Failure +int stack_push(struct stack *s, void *data) { + struct entry *new_entry = kmalloc(sizeof(struct entry)); + if (NULL == new_entry) { + return 0; + } + new_entry->ptr = data; + + new_entry->next = s->head; + s->head = new_entry; + return 1; +} + +// Returns data on success +// Returns NULL on failure +void *stack_pop(struct stack *s) { + struct entry *recieved_entry = s->head; + if (NULL == recieved_entry) { + return NULL; + } + s->head = recieved_entry->next; + + void *r = recieved_entry->ptr; + kfree(recieved_entry); + return r; +} diff --git a/kernel/lib/stack.h b/kernel/lib/stack.h new file mode 100644 index 0000000..e514a04 --- /dev/null +++ b/kernel/lib/stack.h @@ -0,0 +1,18 @@ +#include <stdint.h> + +//struct entry; +//struct stack; + +struct entry { + void *ptr; + // TODO: Maybe don't use a linkedlist + struct entry *next; +}; + +struct stack { + struct entry *head; +}; + +void stack_init(struct stack *s); +int stack_push(struct stack *s, void *data); +void *stack_pop(struct stack *s); |