aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/list.c26
-rw-r--r--src/utils.h4
2 files changed, 24 insertions, 6 deletions
diff --git a/src/list.c b/src/list.c
index 87e6960..01a6822 100644
--- a/src/list.c
+++ b/src/list.c
@@ -18,13 +18,15 @@ clist_create()
void
clist_add(list_t *list,
- void *data)
+ void *data,
+ size_t data_s)
{
- struct list_item_t *item = malloc(sizeof(struct list_item_t));
+ struct list_item_t *item = malloc(sizeof(struct list_item_t));
- void *dest = malloc(sizeof(data)); /* allocates memory like data parameter */
- memcpy(dest, data, sizeof(data)); /* copies data inside dest */
+ void *dest = malloc(data_s); /* allocates memory like data parameter */
+ memcpy(dest, data, data_s); /* copies data inside dest */
item->data = dest;
+ item->data_s = data_s;
item->next = NULL;
if (list->first == NULL)
@@ -45,7 +47,8 @@ void clist_add_all(list_t *dest,
iterator_t i = clist_iterator(other);
while (clist_iterator_has_next(i)) {
- clist_add(dest, clist_iterator_next(&i));
+ list_item_t *item = clist_iterator_next_item(&i);
+ clist_add(dest, item->data, item->data_s);
}
}
@@ -98,3 +101,16 @@ clist_iterator_next(iterator_t *i)
return data;
}
+
+list_item_t *
+clist_iterator_next_item(iterator_t *i)
+{
+ if (i == NULL || i->current == NULL)
+ return NULL;
+
+ list_item_t *item = i->current;
+ /* `next` can be NULL */
+ i->current = i->current->next;
+
+ return item;
+}
diff --git a/src/utils.h b/src/utils.h
index e21dd2e..6c5db92 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -5,6 +5,7 @@
typedef struct list_item_t {
void *data;
+ size_t data_s;
struct list_item_t *next;
} list_item_t;
@@ -19,12 +20,13 @@ typedef struct iterator_t {
} iterator_t;
list_t clist_create (void);
-void clist_add (list_t *, void *);
+void clist_add (list_t *, void *, size_t);
void clist_add_all (list_t *, list_t *);
void clist_remove (list_t *, list_item_t *);
iterator_t clist_iterator (list_t *);
int clist_iterator_has_next(iterator_t);
void *clist_iterator_next (iterator_t *);
+list_item_t *clist_iterator_next_item(iterator_t *);
char *cutils_version();