1.1 --- a/src/linked_list.c Sun Feb 07 20:37:20 2021 +0100 1.2 +++ b/src/linked_list.c Sun Feb 07 21:03:30 2021 +0100 1.3 @@ -51,7 +51,7 @@ 1.4 } 1.5 } 1.6 1.7 -int cx_linked_list_add(void **begin, void **end, ptrdiff_t loc_next, ptrdiff_t loc_prev, void *newnode) { 1.8 +int cx_linked_list_add(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *newnode) { 1.9 // TODO: how do we report error messages? 1.10 if (loc_next < 0 || (begin == NULL && end == NULL)) { 1.11 return 1; 1.12 @@ -79,6 +79,12 @@ 1.13 1.14 /* HIGH LEVEL LINKED LIST IMPLEMENTATION */ 1.15 1.16 +struct cx_linked_list_node { 1.17 + void *prev; 1.18 + void *next; 1.19 + int payload; 1.20 +}; 1.21 + 1.22 typedef struct { 1.23 void *begin; 1.24 void *end; 1.25 @@ -88,24 +94,19 @@ 1.26 cx_linked_list *listdata = list->listdata; 1.27 CxAllocator allocator = list->allocator; 1.28 1.29 - /* 1.30 - * Memory layout: 1.31 - * next : sizeof(void*) 1.32 - * prev : sizeof(void*) 1.33 - * data : itemsize 1.34 - */ 1.35 - void *node = cxMalloc(allocator,2*sizeof(void*)+list->itemsize); 1.36 + struct cx_linked_list_node *node = cxMalloc(allocator, 1.37 + sizeof(struct cx_linked_list_node) - sizeof(int) + list->itemsize); 1.38 if (node == NULL) 1.39 return 1; 1.40 1.41 - memset(node, 0, sizeof(void*)); 1.42 - memcpy(node+2, elem, list->itemsize); 1.43 + node->next = NULL; 1.44 + memcpy(&node->payload, elem, list->itemsize); 1.45 1.46 int ret = cx_linked_list_add( 1.47 &listdata->begin, 1.48 &listdata->end, 1.49 - 0, 1.50 - sizeof(void*), 1.51 + offsetof(struct cx_linked_list_node, prev), 1.52 + offsetof(struct cx_linked_list_node, next), 1.53 node 1.54 ); 1.55 if (ret == 0) {