Thu, 05 Jan 2012 14:53:54 +0100
added some map functions
universe@10 | 1 | #include "list.h" |
olaf@2 | 2 | |
universe@10 | 3 | void ucx_list_free(UcxList *l) { |
universe@10 | 4 | UcxList *e = l, *f; |
universe@10 | 5 | while (e != NULL) { |
universe@10 | 6 | f = e; |
universe@10 | 7 | e = e->next; |
universe@10 | 8 | free(f); |
universe@10 | 9 | } |
universe@10 | 10 | } |
universe@10 | 11 | |
universe@10 | 12 | UcxList *ucx_list_append(UcxList *l, void *data) { |
universe@10 | 13 | UcxList *nl = (UcxList*) malloc(sizeof(UcxList)); |
universe@10 | 14 | if (nl == NULL) return NULL; |
universe@10 | 15 | |
universe@10 | 16 | nl->data = data; |
universe@10 | 17 | nl->next = NULL; |
universe@10 | 18 | if (l == NULL) { |
universe@10 | 19 | return nl; |
universe@10 | 20 | } else { |
universe@10 | 21 | UcxList *t = ucx_list_last(l); |
universe@10 | 22 | t->next = nl; |
universe@10 | 23 | return l; |
universe@10 | 24 | } |
universe@10 | 25 | } |
universe@10 | 26 | |
universe@10 | 27 | UcxList *ucx_list_prepend(UcxList *l, void *data) { |
universe@10 | 28 | UcxList *nl = ucx_list_append(NULL, data); |
universe@10 | 29 | if (nl == NULL) return NULL; |
universe@10 | 30 | |
universe@10 | 31 | if (l != NULL) { |
universe@10 | 32 | nl->next = l; |
universe@10 | 33 | } |
universe@10 | 34 | return nl; |
universe@10 | 35 | } |
universe@10 | 36 | |
universe@10 | 37 | UcxList *ucx_list_concat(UcxList *l1, UcxList *l2) { |
universe@10 | 38 | if (l1 == NULL) { |
universe@10 | 39 | return l2; |
universe@10 | 40 | } else { |
universe@10 | 41 | UcxList *last = ucx_list_last(l1); |
universe@10 | 42 | last->next = l2; |
universe@10 | 43 | return l1; |
universe@10 | 44 | } |
universe@10 | 45 | } |
universe@10 | 46 | |
universe@10 | 47 | UcxList *ucx_list_last(UcxList *l) { |
universe@10 | 48 | if (l == NULL) return NULL; |
universe@10 | 49 | |
universe@10 | 50 | UcxList *e = l; |
universe@10 | 51 | while (e->next != NULL) { |
universe@10 | 52 | e = e->next; |
universe@10 | 53 | } |
universe@10 | 54 | return e; |
universe@10 | 55 | } |
universe@10 | 56 | |
universe@10 | 57 | UcxList *ucx_list_get(UcxList *l, int index) { |
universe@10 | 58 | if (l == NULL) return NULL; |
universe@10 | 59 | |
universe@10 | 60 | UcxList *e = l; |
universe@10 | 61 | while (e->next != NULL && index > 0) { |
universe@10 | 62 | e = e->next; |
universe@10 | 63 | index--; |
universe@10 | 64 | } |
universe@10 | 65 | |
universe@10 | 66 | return index == 0 ? e : NULL; |
universe@10 | 67 | } |
universe@10 | 68 | |
universe@10 | 69 | size_t ucx_list_size(UcxList *l) { |
universe@10 | 70 | if (l == NULL) return 0; |
universe@10 | 71 | |
universe@10 | 72 | UcxList *e = l; |
universe@10 | 73 | size_t s = 1; |
universe@10 | 74 | while (e->next != NULL) { |
universe@10 | 75 | e = e->next; |
universe@10 | 76 | s++; |
universe@10 | 77 | } |
universe@10 | 78 | |
universe@10 | 79 | return s; |
universe@10 | 80 | } |
universe@10 | 81 | |
universe@10 | 82 | void ucx_list_foreach(UcxList *l, ucx_callback fnc, void* data) { |
universe@10 | 83 | UcxList *e = l; |
universe@10 | 84 | while (e != NULL) { |
universe@10 | 85 | fnc(e, data); |
universe@10 | 86 | e = e->next; |
universe@10 | 87 | } |
universe@10 | 88 | } |