/* SilcList tests */
-#include "silcincludes.h"
+#include "silcruntime.h"
struct foo {
int i;
struct foo *prev;
};
+static SilcCompareValue compare(void *e1, void *e2, void *context)
+{
+ struct foo *ee1 = e1, *ee2 = e2;
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", ee1->i, ee1, ee1->next,
+ ee1->prev));
+ SILC_LOG_DEBUG(("> entry %d, %p, next=%p, prev=%p", ee2->i, ee2, ee2->next,
+ ee2->prev));
+ if (ee1->i > ee2->i)
+ return SILC_COMPARE_GREATER_THAN;
+ if (ee1->i < ee2->i)
+ return SILC_COMPARE_LESS_THAN;
+ return SILC_COMPARE_EQUAL_TO;
+}
+
int main(int argc, char **argv)
{
SilcBool success = FALSE;
SilcList list;
- struct foo *f, *f1, *f2, *f3, *f4;
+ struct foo *f, *f1, *f2, *f3, *f4, *f5, *f6, *f7;
if (argc > 1 && !strcmp(argv[1], "-d")) {
silc_log_debug(TRUE);
silc_log_debug_hexdump(TRUE);
- silc_log_set_debug_string("*list*");
+ silc_log_set_debug_string("*list*,*errno*");
}
silc_list_init_prev(list, struct foo, next, prev);
if (!f4)
goto err;
f4->i = 4;
+ f5 = silc_calloc(1, sizeof(*f4));
+ if (!f5)
+ goto err;
+ f5->i = 5;
+ f6 = silc_calloc(1, sizeof(*f4));
+ if (!f6)
+ goto err;
+ f6->i = 6;
+ f7 = silc_calloc(1, sizeof(*f4));
+ if (!f7)
+ goto err;
+ f7->i = 7;
+
+ SILC_LOG_DEBUG(("Add one entry"));
+ silc_list_add(list, f1);
+ silc_list_start(list);
+ while ((f = silc_list_get(list)) != SILC_LIST_END) {
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ f->prev));
+ }
+ SILC_LOG_DEBUG(("Delete the entry"));
+ silc_list_del(list, f1);
+ silc_list_start(list);
+ while ((f = silc_list_get(list)) != SILC_LIST_END)
+ goto err;
+ SILC_LOG_DEBUG(("head=%p", list.head));
+ SILC_LOG_DEBUG(("Re-add the entry"));
+ silc_list_add(list, f1);
+ silc_list_start(list);
+ while ((f = silc_list_get(list)) != SILC_LIST_END) {
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ f->prev));
+ }
+ SILC_LOG_DEBUG(("Delete the entry"));
+ silc_list_del(list, f1);
+ silc_list_start(list);
+ while ((f = silc_list_get(list)) != SILC_LIST_END)
+ goto err;
SILC_LOG_DEBUG(("insert f4=%p at head"));
silc_list_insert(list, NULL, f4);
silc_list_start(list);
while ((f = silc_list_get(list)) != SILC_LIST_END) {
- SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
f->prev));
}
silc_list_start(list);
while ((f = silc_list_get(list)) != SILC_LIST_END) {
- SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
f->prev));
}
silc_list_insert(list, f1, f4);
silc_list_start(list);
while ((f = silc_list_get(list)) != SILC_LIST_END) {
- SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
f->prev));
}
silc_list_insert(list, f3, f4);
silc_list_start(list);
while ((f = silc_list_get(list)) != SILC_LIST_END) {
- SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
f->prev));
}
silc_list_insert(list, NULL, f4);
silc_list_start(list);
while ((f = silc_list_get(list)) != SILC_LIST_END) {
- SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
f->prev));
}
silc_list_start(list);
silc_list_del(list, f1);
while ((f = silc_list_get(list)) != SILC_LIST_END) {
- SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
f->prev));
}
silc_list_del(list, f3);
while ((f = silc_list_get(list)) != SILC_LIST_END) {
- SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
f->prev));
}
silc_list_del(list, f2);
while ((f = silc_list_get(list)) != SILC_LIST_END) {
- SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
f->prev));
}
silc_list_start(list);
while ((f = silc_list_get(list)) != SILC_LIST_END) {
- SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
f->prev));
}
silc_list_start(list);
while ((f = silc_list_get(list)) != SILC_LIST_END) {
- SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ f->prev));
+ }
+
+ while ((f = silc_list_pop(list)) != SILC_LIST_END) {
+ SILC_LOG_DEBUG(("POPPED entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
f->prev));
}
+ if (silc_list_count(list))
+ goto err;
+
+ /* Sort */
+ silc_list_init_prev(list, struct foo, next, prev);
+ silc_list_add(list, f2);
+ silc_list_add(list, f7);
+ silc_list_add(list, f4);
+ silc_list_add(list, f6);
+ silc_list_add(list, f5);
+ silc_list_add(list, f1);
+ silc_list_add(list, f3);
+
+ SILC_LOG_DEBUG(("Unsorted list"));
+ silc_list_start(list);
+ while ((f = silc_list_get(list)) != SILC_LIST_END)
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ f->prev));
+
+ SILC_LOG_DEBUG(("Sorting"));
+ silc_list_sort(list, compare, NULL);
+
+ SILC_LOG_DEBUG(("Sorted list"));
+ silc_list_start(list);
+ while ((f = silc_list_get(list)) != SILC_LIST_END)
+ SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+ f->prev));
success = TRUE;
SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
- return success;
+ return !success;
}