diff --git a/src/list.c b/src/list.c index 02a2ee1..7649d03 100644 --- a/src/list.c +++ b/src/list.c @@ -30,6 +30,17 @@ struct list* list_create(void) { return list; } +struct list* list_copy(struct list *list) { + + if (list && list->nr) { + struct list *copy = xmalloc(sizeof(struct list)); + copy->items = xmemdup(list->items, sizeof(list->items) * list->nr); + copy->nr = list->nr; + return copy; + } + return NULL; +} + int list_destroy(struct list *list) { list_clear_fn(list, NULL); diff --git a/src/list.h b/src/list.h index 74af5e1..9aa55d9 100644 --- a/src/list.h +++ b/src/list.h @@ -23,6 +23,8 @@ typedef int (cmp_fn_t)(const void *, const void *b); struct list* list_create(void); +struct list* list_copy(struct list *list); + int list_destroy(struct list *list); void list_clear(struct list *list); diff --git a/test/t_list.c b/test/t_list.c index 6524f3f..b9a352a 100644 --- a/test/t_list.c +++ b/test/t_list.c @@ -46,6 +46,25 @@ void test_remove() { list_destroy(l); } +void test_copy() { + + int i; + char ref[4] = { 'a', 'b', 'c', 'd' }; + struct list *c, *l = list_create(); + + for(i=0; i < 4; i++) + list_insert(l, &ref[i]); + + c = list_copy(l); + assert(list_size(c) == 4); + assert(c->items[0] == &ref[0]); + assert(c->items[1] == &ref[1]); + assert(c->items[2] == &ref[2]); + assert(c->items[3] == &ref[3]); + + list_destroy(l); + list_destroy(c); +} void test_isempty() { @@ -125,6 +144,7 @@ int main() { test_insert(); test_remove(); + test_copy(); test_isempty(); test_size(); test_indexof();