50 void *cx_linked_list_first(void *node, ptrdiff_t loc_prev) { |
50 void *cx_linked_list_first(void *node, ptrdiff_t loc_prev) { |
51 return cx_linked_list_last(node, loc_prev); |
51 return cx_linked_list_last(node, loc_prev); |
52 } |
52 } |
53 |
53 |
54 void *cx_linked_list_last(void *node, ptrdiff_t loc_next) { |
54 void *cx_linked_list_last(void *node, ptrdiff_t loc_next) { |
55 assert(loc_next >= 0); |
55 assert(node != NULL); |
56 if (node == NULL) |
56 assert(loc_next >= 0); |
57 return NULL; |
|
58 |
57 |
59 void *cur = node; |
58 void *cur = node; |
60 void *last; |
59 void *last; |
61 do { |
60 do { |
62 last = cur; |
61 last = cur; |
65 return last; |
64 return last; |
66 } |
65 } |
67 |
66 |
68 void *cx_linked_list_prev(void *begin, ptrdiff_t loc_next, void *node) { |
67 void *cx_linked_list_prev(void *begin, ptrdiff_t loc_next, void *node) { |
69 assert(begin != NULL); |
68 assert(begin != NULL); |
|
69 assert(node != NULL); |
70 assert(loc_next >= 0); |
70 assert(loc_next >= 0); |
71 if (begin == node) return NULL; |
71 if (begin == node) return NULL; |
72 void *cur = begin; |
72 void *cur = begin; |
73 void *next; |
73 void *next; |
74 while (1) { |
74 while (1) { |
77 cur = next; |
77 cur = next; |
78 } |
78 } |
79 } |
79 } |
80 |
80 |
81 void cx_linked_list_add(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node) { |
81 void cx_linked_list_add(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node) { |
|
82 assert(new_node != NULL); |
82 assert(loc_next >= 0); |
83 assert(loc_next >= 0); |
83 assert(CX_LL_PTR(new_node, loc_next) == NULL); |
84 assert(CX_LL_PTR(new_node, loc_next) == NULL); |
84 void *last; |
85 void *last; |
85 if (end == NULL) { |
86 if (end == NULL) { |
86 assert(begin != NULL); |
87 assert(begin != NULL); |
87 last = cx_linked_list_last(*begin, loc_next); |
88 last = *begin == NULL ? NULL : cx_linked_list_last(*begin, loc_next); |
88 } else { |
89 } else { |
89 last = *end; |
90 last = *end; |
90 } |
91 } |
91 if (last == NULL) { |
92 if (last == NULL) { |
92 if (begin != NULL) { |
93 if (begin != NULL) { |
108 CX_LL_PTR(new_node, loc_prev) = last; |
109 CX_LL_PTR(new_node, loc_prev) = last; |
109 } |
110 } |
110 } |
111 } |
111 |
112 |
112 void cx_linked_list_prepend(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node) { |
113 void cx_linked_list_prepend(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node) { |
|
114 assert(new_node != NULL); |
113 assert(loc_next >= 0); |
115 assert(loc_next >= 0); |
114 assert(CX_LL_PTR(new_node, loc_next) == NULL); |
116 assert(CX_LL_PTR(new_node, loc_next) == NULL); |
115 void *first; |
117 void *first; |
116 if (begin == NULL) { |
118 if (begin == NULL) { |
117 assert(end != NULL); |
119 assert(end != NULL); |
118 assert(loc_prev >= 0); |
120 assert(loc_prev >= 0); |
119 first = cx_linked_list_first(*end, loc_prev); |
121 first = *end == NULL ? NULL : cx_linked_list_first(*end, loc_prev); |
120 } else { |
122 } else { |
121 first = *begin; |
123 first = *begin; |
122 } |
124 } |
123 if (first == NULL) { |
125 if (first == NULL) { |
124 if (end != NULL) { |
126 if (end != NULL) { |