00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "list.h"
00026 #include <errno.h>
00027 #include <stdlib.h>
00028 #include "debug.h"
00029
00030
00031
00032
00033 struct list {
00034 size_t ln_offset;
00035 struct list_node head;
00036 struct list_node tail;
00037 };
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 int _list_new(list_t **list, size_t ln_offset)
00048 {
00049 if (list == NULL)
00050 return_error(EINVAL);
00051
00052 list_t *l = malloc(sizeof **list);
00053 if (l == NULL)
00054 return_error(ENOMEM);
00055
00056 l->ln_offset = ln_offset;
00057
00058
00059 l->head.next = &l->tail;
00060 l->head.prev = &l->head;
00061
00062 l->tail.next = &l->tail;
00063 l->tail.prev = &l->head;;
00064
00065 *list = l;
00066
00067 return 0;
00068 }
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079 int list_free(list_t *list)
00080 {
00081 if (list == NULL)
00082 return_error(EINVAL);
00083
00084 free(list);
00085
00086 return 0;
00087 }
00088
00089
00090
00091
00092
00093
00094
00095
00096 struct list_node *list_head(list_t *list)
00097 {
00098 return &list->head;
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108 struct list_node *list_tail(list_t *list)
00109 {
00110 return &list->tail;
00111 }
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 int list_insert_before(struct list_node *p, struct list_node *q)
00122 {
00123 if (p == NULL || q == NULL)
00124 return_error(EINVAL);
00125
00126 q->next = p;
00127 q->prev = p->prev;
00128
00129 p->prev->next = q;
00130
00131 p->prev = q;
00132
00133 return 0;
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 int list_insert_after(struct list_node *p, struct list_node *q)
00145 {
00146 return list_insert_chain_after(p, q, q);
00147 }
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 int list_insert_chain_after(struct list_node *p, struct list_node *first,
00160 struct list_node *last)
00161 {
00162 if (p == NULL || first == NULL || last == NULL)
00163 return_error(EINVAL);
00164
00165 last->next = p->next;
00166 first->prev = p;
00167
00168 last->next->prev = last;
00169
00170 p->next = first;
00171
00172 return 0;
00173 }
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 int list_delete_chain(struct list_node *first, struct list_node *last)
00187 {
00188 if (first == NULL || last == NULL)
00189 return_error(EINVAL);
00190
00191 struct list_node *prev_node = first->prev;
00192 struct list_node *next_node = last->next;
00193
00194 next_node->prev = prev_node;
00195
00196 prev_node->next = next_node;
00197
00198 first->prev = NULL;
00199 last->next = NULL;
00200
00201 return 0;
00202 }
00203