diff -r fcfe8c5e9fe1 -r 27e67e725d35 ucx/list.c --- a/ucx/list.c Thu Oct 11 08:42:56 2012 +0200 +++ b/ucx/list.c Thu Oct 11 11:42:31 2012 +0200 @@ -1,6 +1,7 @@ #include "list.h" -UcxList *ucx_list_clone(UcxList *l, copy_func fnc, void *data) { +UcxList *restrict ucx_list_clone(UcxList *restrict l, + copy_func fnc, void *data) { UcxList *ret = NULL; while (l != NULL) { if (fnc != NULL) { @@ -13,7 +14,8 @@ return ret; } -int ucx_list_equals(UcxList *l1, UcxList *l2, cmp_func fnc, void* data) { +int ucx_list_equals(const UcxList *l1, const UcxList *l2, + cmp_func fnc, void* data) { if (l1 == l2) return 1; while (l1 != NULL && l2 != NULL) { @@ -63,7 +65,7 @@ return nl; } -UcxList *ucx_list_concat(UcxList *l1, UcxList *l2) { +UcxList *ucx_list_concat(UcxList *restrict l1, UcxList *restrict l2) { if (l1 == NULL) { return l2; } else { @@ -73,32 +75,32 @@ } } -UcxList *ucx_list_last(UcxList *l) { +UcxList *ucx_list_last(const UcxList *l) { if (l == NULL) return NULL; - UcxList *e = l; + const UcxList *e = l; while (e->next != NULL) { e = e->next; } - return e; + return (UcxList*)e; } -UcxList *ucx_list_get(UcxList *l, int index) { +UcxList *ucx_list_get(const UcxList *l, int index) { if (l == NULL) return NULL; - UcxList *e = l; + const UcxList *e = l; while (e->next != NULL && index > 0) { e = e->next; index--; } - return index == 0 ? e : NULL; + return (UcxList*)(index == 0 ? e : NULL); } -size_t ucx_list_size(UcxList *l) { +size_t ucx_list_size(const UcxList *l) { if (l == NULL) return 0; - UcxList *e = l; + const UcxList *e = l; size_t s = 1; while (e->next != NULL) { e = e->next; @@ -109,14 +111,14 @@ } UcxList *ucx_list_sort_merge(int length, - UcxList* ls, UcxList* rs, UcxList* le, UcxList* re, + UcxList* restrict ls, UcxList* restrict le, UcxList* restrict re, cmp_func fnc, void* data) { UcxList *sorted[length]; UcxList *rc, *lc; - lc = ls; rc = rs; + lc = ls; rc = le; int n = 0; - while (lc != le && rc != re) { + while (lc && lc != le && rc != re) { if (fnc(lc->data, rc->data, data) <= 0) { sorted[n] = lc; lc = lc->next; @@ -126,12 +128,12 @@ } n++; } - while (lc != le) { + while (lc && lc != le) { sorted[n] = lc; lc = lc->next; n++; } - while (rc != re) { + while (rc && rc != re) { sorted[n] = rc; rc = rc->next; n++; @@ -154,7 +156,7 @@ UcxList *lc; int ln = 1; - UcxList *ls = l, *le; + UcxList *restrict ls = l, *restrict le, *restrict re; lc = ls; while (lc->next != NULL && fnc(lc->next->data, lc->data, data) > 0) { lc = lc->next; @@ -162,13 +164,12 @@ } le = lc->next; - UcxList *rs = le, *re; - if (rs == NULL) { + if (le == NULL) { return l; // this list is already sorted :) } else { UcxList *rc; int rn = 1; - rc = rs; + rc = le; while (rc->next != NULL && fnc(rc->next->data, rc->data, data) > 0) { rc = rc->next; rn++; @@ -184,13 +185,12 @@ // {ls,...,le->prev} and {rs,...,re->prev} are sorted - merge them UcxList *sorted = ucx_list_sort_merge(ln+rn, - ls, rs, le, re, + ls, le, re, fnc, data); // merge sorted list with (also sorted) remainder l = ucx_list_sort_merge(ln+rn+remainder_length, - sorted, remainder, NULL, NULL, - fnc, data); + sorted, remainder, NULL, fnc, data); return l; }