src/linked_list.c

changeset 456
227c2eabbef8
parent 453
bb144d08cd44
child 457
8f7d3fe9ca40
     1.1 --- a/src/linked_list.c	Sun Oct 03 16:02:53 2021 +0200
     1.2 +++ b/src/linked_list.c	Sun Oct 03 16:30:47 2021 +0200
     1.3 @@ -45,25 +45,27 @@
     1.4      return cur;
     1.5  }
     1.6  
     1.7 -void *cx_linked_list_last(void **begin, void **end, ptrdiff_t loc_next) {
     1.8 -    if (end != NULL) {
     1.9 -        return *end;
    1.10 -    } else {
    1.11 -        if (begin == NULL || *begin == NULL)
    1.12 -            return NULL;
    1.13 +void *cx_linked_list_last(void *begin, ptrdiff_t loc_next) {
    1.14 +    if (begin == NULL)
    1.15 +        return NULL;
    1.16  
    1.17 -        void *cur = *begin;
    1.18 -        void *last;
    1.19 -        do {
    1.20 -            last = cur;
    1.21 -        } while ((cur = *CX_LL_PTR(cur, loc_next)) != NULL);
    1.22 +    void *cur = begin;
    1.23 +    void *last;
    1.24 +    do {
    1.25 +        last = cur;
    1.26 +    } while ((cur = *CX_LL_PTR(cur, loc_next)) != NULL);
    1.27  
    1.28 -        return last;
    1.29 -    }
    1.30 +    return last;
    1.31  }
    1.32  
    1.33  void cx_linked_list_add(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node) {
    1.34 -    void *last = cx_linked_list_last(begin, end, loc_next);
    1.35 +    void *last;
    1.36 +    if (end == NULL) {
    1.37 +        assert(begin != NULL);
    1.38 +        last = cx_linked_list_last(*begin, loc_next);
    1.39 +    } else {
    1.40 +        last = *end;
    1.41 +    }
    1.42      if (last == NULL) {
    1.43          assert(begin != NULL);
    1.44          *begin = new_node;
    1.45 @@ -75,7 +77,7 @@
    1.46  
    1.47      // if there is an end pointer, update it
    1.48      if (end != NULL) {
    1.49 -        *end = cx_linked_list_last(&new_node, NULL, loc_next);
    1.50 +        *end = cx_linked_list_last(new_node, loc_next);
    1.51      }
    1.52  
    1.53      // if the nodes use a prev pointer, update it
    1.54 @@ -224,8 +226,8 @@
    1.55  
    1.56  static void *cx_ll_last(cx_list_s *list) {
    1.57      cx_linked_list *ll = (cx_linked_list *) list;
    1.58 -    cx_linked_list_node *last = cx_linked_list_last(NULL, (void **) &ll->end, CX_LL_LOC_NEXT);
    1.59 -    return &last->payload;
    1.60 +    cx_linked_list_node *last = ll->end;
    1.61 +    return last == NULL ? NULL : &last->payload;
    1.62  }
    1.63  
    1.64  static cx_list_class cx_linked_list_class = {

mercurial