src/linked_list.c

changeset 402
a34b93911956
parent 401
e6a8f7fb0c45
child 403
8fa43b732980
     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) {

mercurial