aboutsummaryrefslogtreecommitdiff
path: root/common/list.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/list.c')
-rw-r--r--common/list.c76
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;
+}