universe@4: #include "dlist.h" universe@4: universe@8: void ucx_dlist_free(UcxDlist *l) { universe@8: UcxDlist *e = l, *f; universe@8: while (e != NULL) { universe@8: f = e; universe@8: e = e->next; universe@8: free(f); universe@8: } universe@8: } universe@8: universe@7: UcxDlist *ucx_dlist_append(UcxDlist *l, void *data) { universe@8: UcxDlist *nl = (UcxDlist*) malloc(sizeof(UcxDlist)); universe@8: if (nl == NULL) return NULL; universe@7: universe@8: nl->data = data; universe@8: nl->next = NULL; universe@8: if (l == NULL) { universe@8: return nl; universe@8: } else { universe@8: UcxDlist *t = ucx_dlist_last(l); universe@8: t->next = nl; universe@8: nl->prev = t; universe@8: return l; universe@8: } universe@7: } universe@7: universe@7: UcxDlist *ucx_dlist_prepend(UcxDlist *l, void *data) { universe@8: UcxDlist *nl = ucx_dlist_append(NULL, data); universe@8: if (nl == NULL) return NULL; universe@7: universe@8: if (l != NULL) { universe@8: nl->next = l; universe@8: l->prev = nl; universe@8: } universe@8: return nl; universe@7: } universe@7: universe@7: UcxDlist *ucx_dlist_concat(UcxDlist *l1, UcxDlist *l2) { universe@8: if (l1 == NULL) { universe@8: return l2; universe@8: } else { universe@8: UcxDlist *last = ucx_dlist_last(l1); universe@8: last->next = l2; universe@8: l2->prev = last; universe@8: return l1; universe@8: } universe@7: } universe@7: universe@7: UcxDlist *ucx_dlist_last(UcxDlist *l) { universe@7: if (l == NULL) return NULL; universe@7: universe@7: UcxDlist *e = l; universe@7: while (e->next != NULL) { universe@7: e = e->next; universe@7: } universe@7: return e; universe@7: } universe@7: universe@7: UcxDlist *ucx_dlist_get(UcxDlist *l, int index) { universe@8: if (l == NULL) return NULL; universe@8: universe@8: UcxDlist *e = l; universe@8: while (e->next != NULL && index > 0) { universe@8: e = e->next; universe@8: index--; universe@8: } universe@7: universe@8: return index == 0 ? e : NULL; universe@7: } universe@7: universe@7: size_t ucx_dlist_size(UcxDlist *l) { universe@7: if (l == NULL) return 0; universe@7: universe@7: UcxDlist *e = l; universe@7: size_t s = 1; universe@7: while (e->next != NULL) { universe@7: e = e->next; universe@7: s++; universe@7: } universe@7: universe@7: return s; universe@7: } universe@7: universe@7: void ucx_dlist_foreach(UcxDlist *l, ucx_callback fnc, void* data) { universe@8: UcxDlist *e = l; universe@8: while (e != NULL) { universe@8: fnc(e, data); universe@8: e = e->next; universe@8: } universe@7: } universe@7: universe@7: /* dlist specific functions */ universe@7: UcxDlist *ucx_dlist_first(UcxDlist *l) { universe@8: if (l == NULL) return NULL; universe@7: universe@8: UcxDlist *e = l; universe@8: while (e->prev != NULL) { universe@8: e = e->prev; universe@8: } universe@8: return e; universe@7: }