00001 #include "list.h"
00002 #include "jsoc.h"
00003
00004 LinkedList_t *list_llcreate(unsigned int datasize, ListFreeFn_t freefn)
00005 {
00006 LinkedList_t *list = calloc(1, sizeof(LinkedList_t));
00007
00008 if (list)
00009 {
00010 list->dsize = datasize;
00011 list->freefn = freefn;
00012 list->nitems = 0;
00013 }
00014
00015 return list;
00016 }
00017
00018 ListNode_t *list_llinserthead(LinkedList_t *llist, void *data)
00019 {
00020 ListNode_t *node = NULL;
00021
00022 if (llist && data)
00023 {
00024 node = calloc(1, sizeof(ListNode_t));
00025
00026 if (node)
00027 {
00028 node->data = malloc(llist->dsize);
00029 if (node->data)
00030 {
00031 memcpy(node->data, data, llist->dsize);
00032 }
00033
00034 if (!llist->first)
00035 {
00036 llist->first = node;
00037 }
00038 else
00039 {
00040 node->next = llist->first;
00041 llist->first = node;
00042 }
00043
00044 llist->nitems++;
00045 }
00046 }
00047
00048 return node;
00049 }
00050
00051 ListNode_t *list_llinserttail(LinkedList_t *llist, void *data)
00052 {
00053 ListNode_t *node = NULL;
00054
00055 if (llist && data)
00056 {
00057 node = calloc(1, sizeof(ListNode_t));
00058
00059 if (node)
00060 {
00061 node->data = malloc(llist->dsize);
00062 if (node->data)
00063 {
00064 memcpy(node->data, data, llist->dsize);
00065 }
00066
00067 if (!llist->first)
00068 {
00069 llist->first = node;
00070 }
00071 else
00072 {
00073 ListNode_t *end = llist->first;
00074 node->next = NULL;
00075
00076 while (end)
00077 {
00078 if (end->next == NULL)
00079 {
00080 end->next = node;
00081 break;
00082 }
00083
00084 end = end->next;
00085 }
00086 }
00087
00088 llist->nitems++;
00089 }
00090 }
00091
00092 return node;
00093 }
00094
00095 void list_llremove(LinkedList_t *llist, ListNode_t *item)
00096 {
00097 ListNode_t *node = llist->first;
00098 ListNode_t *prev = NULL;
00099
00100 while (node)
00101 {
00102 if (node == item)
00103 {
00104 break;
00105 }
00106
00107 prev = node;
00108 node = node->next;
00109 }
00110
00111 if (node)
00112 {
00113 if (prev == NULL)
00114 {
00115
00116 llist->first = node->next;
00117 }
00118 else
00119 {
00120 prev->next = node->next;
00121 }
00122
00123 llist->nitems--;
00124 }
00125 }
00126
00127 void list_llreset(LinkedList_t *llist)
00128 {
00129 llist->next = llist->first;
00130 }
00131
00132 ListNode_t *list_llnext(LinkedList_t *llist)
00133 {
00134 ListNode_t *next = NULL;
00135
00136 if (llist)
00137 {
00138 next = llist->next;
00139
00140 if (llist->next != NULL && llist->next->next != NULL)
00141 {
00142 llist->next = llist->next->next;
00143 }
00144 else
00145 {
00146 llist->next = NULL;
00147 }
00148 }
00149
00150 return next;
00151 }
00152
00153 ListNode_t *list_llfind(LinkedList_t *llist, void *data)
00154 {
00155 ListNode_t *node = NULL;
00156
00157 if (llist && data)
00158 {
00159 ListNode_t *iter = llist->first;
00160 while (iter)
00161 {
00162 if (memcmp(iter->data, data, llist->dsize) == 0)
00163 {
00164 node = iter;
00165 }
00166
00167 iter = iter->next;
00168 }
00169 }
00170
00171 return node;
00172 }
00173
00174 ListNode_t *list_llgettail(LinkedList_t *llist)
00175 {
00176 ListNode_t *node = NULL;
00177
00178 if (llist)
00179 {
00180 node = llist->first;
00181
00182 while (node)
00183 {
00184 if (node->next == NULL)
00185 {
00186 break;
00187 }
00188
00189 node = node->next;
00190 }
00191 }
00192
00193 return node;
00194 }
00195
00196 void list_llfree(LinkedList_t **llist)
00197 {
00198 if (llist && *llist)
00199 {
00200 ListNode_t *pElem = (*llist)->first;
00201 ListNode_t *nElem = NULL;
00202
00203 while (pElem)
00204 {
00205 nElem = pElem->next;
00206
00207
00208 if (pElem->data)
00209 {
00210 if ((*llist)->freefn)
00211 {
00212
00213 (*((*llist)->freefn))(pElem->data);
00214 }
00215
00216
00217 free(pElem->data);
00218 }
00219 free(pElem);
00220 pElem = nElem;
00221 }
00222
00223 free(*llist);
00224 *llist = NULL;
00225 }
00226 }
00227
00228 void list_llfreenode(ListNode_t **node)
00229 {
00230 if (node && *node)
00231 {
00232 if ((*node)->data)
00233 {
00234 free((*node)->data);
00235 (*node)->data = NULL;
00236 }
00237 free(*node);
00238 *node = NULL;
00239 }
00240 }