ucx/dlist.c

Wed, 15 Aug 2012 19:32:29 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 15 Aug 2012 19:32:29 +0200
changeset 35
fdabd1240b69
parent 31
91ac86557290
child 36
a9d656e4f7ce
permissions
-rw-r--r--

added mkdir for build directory to makefile + added qsort for list and dlist

universe@4 1 #include "dlist.h"
universe@4 2
universe@18 3 UcxDlist *ucx_dlist_clone(UcxDlist *l, copy_func fnc, void *data) {
universe@18 4 UcxDlist *ret = NULL;
universe@18 5 while (l != NULL) {
universe@18 6 if (fnc != NULL) {
universe@18 7 ret = ucx_dlist_append(ret, fnc(l->data, data));
universe@18 8 } else {
universe@18 9 ret = ucx_dlist_append(ret, l->data);
universe@18 10 }
universe@18 11 l = l->next;
universe@18 12 }
universe@18 13 return ret;
universe@18 14 }
universe@18 15
universe@18 16 int ucx_dlist_equals(UcxDlist *l1, UcxDlist *l2, cmp_func fnc, void* data) {
universe@18 17 if (l1 == l2) return 1;
universe@18 18
universe@18 19 while (l1 != NULL && l2 != NULL) {
universe@18 20 if (fnc == NULL) {
universe@18 21 if (l1->data != l2->data) return 0;
universe@18 22 } else {
universe@18 23 if (fnc(l1->data, l2->data, data) != 0) return 0;
universe@18 24 }
universe@18 25 l1 = l1->next;
universe@18 26 l2 = l2->next;
universe@18 27 }
universe@18 28
universe@18 29 return (l1 == NULL && l2 == NULL);
universe@18 30 }
universe@18 31
universe@8 32 void ucx_dlist_free(UcxDlist *l) {
universe@8 33 UcxDlist *e = l, *f;
universe@8 34 while (e != NULL) {
universe@8 35 f = e;
universe@8 36 e = e->next;
universe@8 37 free(f);
universe@8 38 }
universe@8 39 }
universe@8 40
universe@7 41 UcxDlist *ucx_dlist_append(UcxDlist *l, void *data) {
universe@8 42 UcxDlist *nl = (UcxDlist*) malloc(sizeof(UcxDlist));
universe@8 43 if (nl == NULL) return NULL;
universe@7 44
universe@8 45 nl->data = data;
universe@8 46 nl->next = NULL;
universe@8 47 if (l == NULL) {
universe@22 48 nl->prev = NULL;
universe@8 49 return nl;
universe@8 50 } else {
universe@8 51 UcxDlist *t = ucx_dlist_last(l);
universe@8 52 t->next = nl;
universe@8 53 nl->prev = t;
universe@8 54 return l;
universe@8 55 }
universe@7 56 }
universe@7 57
universe@7 58 UcxDlist *ucx_dlist_prepend(UcxDlist *l, void *data) {
universe@8 59 UcxDlist *nl = ucx_dlist_append(NULL, data);
universe@8 60 if (nl == NULL) return NULL;
universe@7 61
universe@8 62 if (l != NULL) {
universe@8 63 nl->next = l;
universe@8 64 l->prev = nl;
universe@8 65 }
universe@8 66 return nl;
universe@7 67 }
universe@7 68
universe@7 69 UcxDlist *ucx_dlist_concat(UcxDlist *l1, UcxDlist *l2) {
universe@8 70 if (l1 == NULL) {
universe@8 71 return l2;
universe@8 72 } else {
universe@8 73 UcxDlist *last = ucx_dlist_last(l1);
universe@8 74 last->next = l2;
universe@8 75 l2->prev = last;
universe@8 76 return l1;
universe@8 77 }
universe@7 78 }
universe@7 79
universe@7 80 UcxDlist *ucx_dlist_last(UcxDlist *l) {
universe@7 81 if (l == NULL) return NULL;
universe@7 82
universe@7 83 UcxDlist *e = l;
universe@7 84 while (e->next != NULL) {
universe@7 85 e = e->next;
universe@7 86 }
universe@7 87 return e;
universe@7 88 }
universe@7 89
universe@7 90 UcxDlist *ucx_dlist_get(UcxDlist *l, int index) {
universe@8 91 if (l == NULL) return NULL;
universe@8 92
universe@8 93 UcxDlist *e = l;
universe@8 94 while (e->next != NULL && index > 0) {
universe@8 95 e = e->next;
universe@8 96 index--;
universe@8 97 }
universe@7 98
universe@8 99 return index == 0 ? e : NULL;
universe@7 100 }
universe@7 101
universe@7 102 size_t ucx_dlist_size(UcxDlist *l) {
universe@7 103 if (l == NULL) return 0;
universe@7 104
universe@7 105 UcxDlist *e = l;
universe@7 106 size_t s = 1;
universe@7 107 while (e->next != NULL) {
universe@7 108 e = e->next;
universe@7 109 s++;
universe@7 110 }
universe@7 111
universe@7 112 return s;
universe@7 113 }
universe@7 114
universe@35 115 int ucx_dlist_qsort_devide(UcxDlist** list, int l, int r, cmp_func f, void* d) {
universe@35 116 int i = l;
universe@35 117 int j = r - 1;
universe@35 118 void *p = list[r]->data;
universe@35 119 UcxDlist *b;
universe@35 120
universe@35 121 do {
universe@35 122 while (i < r && f(list[i]->data, p, d) <= 0) i++;
universe@35 123 while (j > l && f(list[j]->data, p, d) >= 0) j--;
universe@35 124 if (i < j) {
universe@35 125 b = list[i];
universe@35 126 list[i] = list[j];
universe@35 127 list[j] = b;
universe@35 128 }
universe@35 129 } while (i < j);
universe@35 130
universe@35 131 if (f(list[i]->data, p, d) > 0) {
universe@35 132 b = list[r];
universe@35 133 list[r] = list[i];
universe@35 134 list[i] = b;
universe@35 135 }
universe@35 136
universe@35 137 return i;
universe@35 138 }
universe@35 139
universe@35 140 void ucx_dlist_qsort_sort(UcxDlist** list, int l, int r, cmp_func f, void* d) {
universe@35 141 if (l < r) {
universe@35 142 int m = ucx_dlist_qsort_devide(list, l, r, f, d);
universe@35 143 ucx_dlist_qsort_sort(list, l, m-1, f, d);
universe@35 144 ucx_dlist_qsort_sort(list, m+1, r, f, d);
universe@35 145 }
universe@35 146 }
universe@35 147
universe@35 148 UcxDlist *ucx_dlist_qsort(UcxDlist *l, cmp_func fnc, void *data) {
universe@35 149 if (l == NULL) {
universe@35 150 return NULL;
universe@35 151 }
universe@35 152 size_t n = ucx_dlist_size(l);
universe@35 153 if (n == 1) {
universe@35 154 return l;
universe@35 155 }
universe@35 156
universe@35 157 UcxDlist *entries[n];
universe@35 158 entries[0] = l;
universe@35 159 for (int i = 1 ; i < n ; i++) {
universe@35 160 entries[i] = entries[i-1]->next;
universe@35 161 }
universe@35 162
universe@35 163 ucx_dlist_qsort_sort(entries, 0, n-1, fnc, data);
universe@35 164
universe@35 165 entries[0]->prev = NULL;
universe@35 166 for (int i = 0 ; i < n-1 ; i++) {
universe@35 167 entries[i]->next = entries[i+1];
universe@35 168 entries[i+1]->prev = entries[i];
universe@35 169 }
universe@35 170 entries[n-1]->next = NULL;
universe@35 171
universe@35 172 return entries[0];
universe@35 173 }
universe@35 174
universe@7 175 /* dlist specific functions */
universe@7 176 UcxDlist *ucx_dlist_first(UcxDlist *l) {
universe@8 177 if (l == NULL) return NULL;
universe@7 178
universe@8 179 UcxDlist *e = l;
universe@8 180 while (e->prev != NULL) {
universe@8 181 e = e->prev;
universe@8 182 }
universe@8 183 return e;
olaf@13 184 }
universe@22 185
universe@22 186 UcxDlist *ucx_dlist_remove(UcxDlist *l, UcxDlist *e) {
universe@22 187 if (e->prev == NULL) {
olaf@31 188 if(e->next != NULL) {
olaf@31 189 e->next->prev = NULL;
olaf@31 190 l = e->next;
olaf@31 191 } else {
olaf@31 192 l = NULL;
olaf@31 193 }
olaf@31 194
universe@22 195 } else {
universe@22 196 e->prev->next = e->next;
universe@22 197 e->next->prev = e->prev;
universe@22 198 }
universe@22 199 free(e);
universe@22 200 return l;
universe@22 201 }

mercurial