From fb1efe264854e2539d62da1d9dc019ffa8a899da Mon Sep 17 00:00:00 2001 From: Alessandro Iezzi Date: Wed, 17 May 2023 16:51:48 +0200 Subject: Divide in two functions the clist_add In some cases, I need to retrieve the original pointer in list_item. So, the clist_add() just adds the pointer to the list, and, clist_add_s() adds a copy of that pointer to the list. --- src/list.c | 23 ++++++++++++++++------- src/utils.h | 3 ++- test/test_list.c | 32 ++++++++++++++++---------------- 3 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/list.c b/src/list.c index 01a6822..38957e8 100644 --- a/src/list.c +++ b/src/list.c @@ -18,15 +18,11 @@ clist_create() void clist_add(list_t *list, - void *data, - size_t data_s) + void *data) { struct list_item_t *item = malloc(sizeof(struct list_item_t)); - 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->data = data; item->next = NULL; if (list->first == NULL) @@ -39,6 +35,19 @@ clist_add(list_t *list, list->size ++; } +void +clist_add_s(list_t *list, + void *data, + size_t data_s) +{ + void *dest = malloc(data_s); /* allocates memory like data parameter */ + memcpy(dest, data, data_s); /* copies data inside dest */ + + clist_add(list, dest); + + list->last->data_s = data_s; +} + void clist_add_all(list_t *dest, list_t *other) { @@ -48,7 +57,7 @@ void clist_add_all(list_t *dest, iterator_t i = clist_iterator(other); while (clist_iterator_has_next(i)) { list_item_t *item = clist_iterator_next_item(&i); - clist_add(dest, item->data, item->data_s); + clist_add_s(dest, item->data, item->data_s); } } diff --git a/src/utils.h b/src/utils.h index 6c5db92..b92ca1c 100644 --- a/src/utils.h +++ b/src/utils.h @@ -20,7 +20,8 @@ typedef struct iterator_t { } iterator_t; list_t clist_create (void); -void clist_add (list_t *, void *, size_t); +void clist_add (list_t *, void *); +void clist_add_s (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 *); diff --git a/test/test_list.c b/test/test_list.c index 8fa8861..2e2eba1 100644 --- a/test/test_list.c +++ b/test/test_list.c @@ -17,7 +17,7 @@ test_list1() const char *data = "hello"; list_t list = clist_create(); - clist_add(&list, (void *) data, strlen(data) + 1); + clist_add_s(&list, (void *) data, strlen(data) + 1); assert(list.first == list.last); assert(strcmp(list.first->data, data) == 0); @@ -35,7 +35,7 @@ test_list2() char *data1 = strdup("hello"); list_t list = clist_create(); - clist_add(&list, data1, strlen(data1) + 1); + clist_add_s(&list, data1, strlen(data1) + 1); iterator_t it = clist_iterator(&list); assert(clist_iterator_has_next(it)); @@ -61,8 +61,8 @@ test_list3() char *str1 = "test1"; char *str2 = "test2"; - clist_add(&l1, str1, strlen(str1) + 1); - clist_add(&l2, str2, strlen(str2) + 1); + clist_add_s(&l1, str1, strlen(str1) + 1); + clist_add_s(&l2, str2, strlen(str2) + 1); clist_add_all(&l1, &l2); @@ -91,12 +91,12 @@ test_list4() char *s2 = "test2"; char *s3 = "test3"; - clist_add(&l1, s1, strlen(s1) + 1); - clist_add(&l2, s2, strlen(s2) + 1); + clist_add_s(&l1, s1, strlen(s1) + 1); + clist_add_s(&l2, s2, strlen(s2) + 1); clist_add_all(&l1, &l2); /* add a new element */ - clist_add(&l1, s3, strlen(s3) + 1); + clist_add_s(&l1, s3, strlen(s3) + 1); iterator_t i = clist_iterator(&l1); if (clist_iterator_has_next(i)) @@ -130,14 +130,14 @@ list_item_t *r; sprintf(buffer, "%d", i); strcpy(dest, "i"); strcat(dest, buffer); - clist_add(&list1, dest, strlen(dest) + 1); + clist_add_s(&list1, dest, strlen(dest) + 1); } for (int i = 0; i < 5; i++) { sprintf(buffer, "%d", i); strcpy(dest, "j"); strcat(dest, buffer); - clist_add(&list2, dest, strlen(dest) + 1); + clist_add_s(&list2, dest, strlen(dest) + 1); if (i == 3) r = list2.last; } @@ -182,11 +182,11 @@ test_list7() char *str4 = ""; char *str5 = "Long string 4"; - clist_add(&list1, strdup(str1), strlen(str1) + 1); - clist_add(&list1, strdup(str2), strlen(str2) + 1); - clist_add(&list1, strdup(str3), strlen(str3) + 1); - clist_add(&list1, strdup(str4), strlen(str4) + 1); - clist_add(&list1, strdup(str5), strlen(str5) + 1); + clist_add_s(&list1, strdup(str1), strlen(str1) + 1); + clist_add_s(&list1, strdup(str2), strlen(str2) + 1); + clist_add_s(&list1, strdup(str3), strlen(str3) + 1); + clist_add_s(&list1, strdup(str4), strlen(str4) + 1); + clist_add_s(&list1, strdup(str5), strlen(str5) + 1); iterator_t it = clist_iterator(&list1); @@ -227,8 +227,8 @@ test_list8() list_t l = clist_create(); - clist_add(&l, s1, sizeof(s1)); - clist_add(&l, s2, sizeof(s2)); + clist_add_s(&l, s1, sizeof(s1)); + clist_add_s(&l, s2, sizeof(s2)); iterator_t it = clist_iterator(&l); -- cgit v1.2.3