src/linked_list.c

changeset 478
599770bb6314
parent 477
73a93c7a56ae
child 480
e3be53a3354f
equal deleted inserted replaced
477:73a93c7a56ae 478:599770bb6314
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) {

mercurial