src/linked_list.c

changeset 475
31bf97fdbf71
parent 474
9c1fccda16bc
child 476
60ff4561dc04
     1.1 --- a/src/linked_list.c	Sat Oct 09 11:12:48 2021 +0200
     1.2 +++ b/src/linked_list.c	Sat Dec 04 17:38:23 2021 +0100
     1.3 @@ -47,12 +47,16 @@
     1.4      return cur;
     1.5  }
     1.6  
     1.7 -void *cx_linked_list_last(void *begin, ptrdiff_t loc_next) {
     1.8 +void *cx_linked_list_first(void *node, ptrdiff_t loc_prev) {
     1.9 +    return cx_linked_list_last(node, loc_prev);
    1.10 +}
    1.11 +
    1.12 +void *cx_linked_list_last(void *node, ptrdiff_t loc_next) {
    1.13      assert(loc_next >= 0);
    1.14 -    if (begin == NULL)
    1.15 +    if (node == NULL)
    1.16          return NULL;
    1.17  
    1.18 -    void *cur = begin;
    1.19 +    void *cur = node;
    1.20      void *last;
    1.21      do {
    1.22          last = cur;
    1.23 @@ -76,6 +80,7 @@
    1.24  
    1.25  void cx_linked_list_add(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node) {
    1.26      assert(loc_next >= 0);
    1.27 +    assert(CX_LL_PTR(new_node, loc_next) == NULL);
    1.28      void *last;
    1.29      if (end == NULL) {
    1.30          assert(begin != NULL);
    1.31 @@ -84,8 +89,9 @@
    1.32          last = *end;
    1.33      }
    1.34      if (last == NULL) {
    1.35 -        assert(begin != NULL);
    1.36 -        *begin = new_node;
    1.37 +        if (begin != NULL) {
    1.38 +            *begin = new_node;
    1.39 +        }
    1.40      } else {
    1.41          // if there is a last node, update its next pointer
    1.42          CX_LL_PTR(last, loc_next) = new_node;
    1.43 @@ -93,15 +99,44 @@
    1.44  
    1.45      // if there is an end pointer, update it
    1.46      if (end != NULL) {
    1.47 -        *end = cx_linked_list_last(new_node, loc_next);
    1.48 +        *end = new_node;
    1.49      }
    1.50  
    1.51      // if the nodes use a prev pointer, update it
    1.52      if (loc_prev >= 0) {
    1.53 +        assert(CX_LL_PTR(new_node, loc_prev) == NULL);
    1.54          CX_LL_PTR(new_node, loc_prev) = last;
    1.55      }
    1.56  }
    1.57  
    1.58 +void cx_linked_list_prepend(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node) {
    1.59 +    assert(loc_next >= 0);
    1.60 +    assert(CX_LL_PTR(new_node, loc_next) == NULL);
    1.61 +    void *first;
    1.62 +    if (begin == NULL) {
    1.63 +        assert(end != NULL);
    1.64 +        assert(loc_prev >= 0);
    1.65 +        first = cx_linked_list_first(*end, loc_prev);
    1.66 +    } else {
    1.67 +        first = *begin;
    1.68 +    }
    1.69 +    if (first == NULL) {
    1.70 +        if (end != NULL) {
    1.71 +            *end = new_node;
    1.72 +        }
    1.73 +    } else {
    1.74 +        CX_LL_PTR(new_node, loc_next) = first;
    1.75 +        if (loc_prev >= 0) {
    1.76 +            CX_LL_PTR(first, loc_prev) = new_node;
    1.77 +        }
    1.78 +    }
    1.79 +
    1.80 +    if (begin != NULL) {
    1.81 +        assert(loc_prev < 0 || CX_LL_PTR(new_node, loc_prev) == NULL);
    1.82 +        *begin = new_node;
    1.83 +    }
    1.84 +}
    1.85 +
    1.86  void *cx_linked_list_remove(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *node) {
    1.87      assert(loc_next >= 0);
    1.88      assert(loc_prev >= 0 || begin != NULL);

mercurial