diff options
author | Kenny Levinsen <kl@kl.wtf> | 2020-07-31 00:22:18 +0200 |
---|---|---|
committer | Kenny Levinsen <kl@kl.wtf> | 2020-07-31 00:22:18 +0200 |
commit | 61716a2c77dfde9addf6b41a6d72d26a8584150e (patch) | |
tree | 537cd84661955497bdb304f88896e36896df4e5f /common/list.c | |
parent | f85434de666f10da0cbcaccdbb7d88917c5fa887 (diff) |
Initial implementation of seatd and libseat
Diffstat (limited to 'common/list.c')
-rw-r--r-- | common/list.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/common/list.c b/common/list.c new file mode 100644 index 0000000..1a86837 --- /dev/null +++ b/common/list.c @@ -0,0 +1,76 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "list.h" + +void list_init(struct list *list) { + list->capacity = 10; + list->length = 0; + list->items = malloc(sizeof(void *) * list->capacity); +} + +static void list_resize(struct list *list) { + if (list->length == list->capacity) { + list->capacity *= 2; + list->items = realloc(list->items, sizeof(void *) * list->capacity); + } +} + +void list_free(struct list *list) { + list->capacity = 0; + list->length = 0; + free(list->items); +} + +void list_add(struct list *list, void *item) { + list_resize(list); + list->items[list->length++] = item; +} + +void list_insert(struct list *list, size_t index, void *item) { + list_resize(list); + memmove(&list->items[index + 1], &list->items[index], + sizeof(void *) * (list->length - index)); + list->length++; + list->items[index] = item; +} + +void list_del(struct list *list, size_t index) { + list->length--; + memmove(&list->items[index], &list->items[index + 1], + sizeof(void *) * (list->length - index)); +} + +size_t list_find(struct list *list, const void *item) { + for (size_t i = 0; i < list->length; i++) { + if (list->items[i] == item) { + return i; + } + } + return -1; +} + +void list_concat(struct list *list, struct list *source) { + if (list->length + source->length > list->capacity) { + while (list->length + source->length > list->capacity) { + list->capacity *= 2; + } + list->items = realloc(list->items, sizeof(void *) * list->capacity); + } + memmove(&list->items[list->length], source->items, sizeof(void *) * (source->length)); + list->length += source->length; +} + +void list_truncate(struct list *list) { + list->length = 0; +} + +void *list_pop_front(struct list *list) { + if (list->length == 0) { + return NULL; + } + void *item = list->items[0]; + list_del(list, 0); + return item; +} |