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);