From a1e1a0a0d3556f972138a9037646922e21343e75 Mon Sep 17 00:00:00 2001 From: Alexander Zhylin Date: Thu, 30 Jul 2026 18:38:02 +0300 Subject: [PATCH] dlist: insert sort [not finished] --- src/utils/dlist.c | 58 +++++++++++++++++++++++++++++++++++++++++++++- src/utils/dlist.h | 11 ++++++++- test/utils/dlist.c | 32 +++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 2 deletions(-) diff --git a/src/utils/dlist.c b/src/utils/dlist.c index 0270958..da8ebec 100644 --- a/src/utils/dlist.c +++ b/src/utils/dlist.c @@ -19,6 +19,62 @@ dlist_t *_dlist_init(void *el_ptr, int el_siz) { return dlist; } +void _dlist_insert(dlist_t *dlist, dlist_el_t *new_el, dlist_el_t *prev_el) { + if (prev_el != NULL) { + new_el->next = prev_el->next; + prev_el->next->previous = new_el; + new_el->previous = prev_el; + prev_el->next = new_el; + if (new_el->next == NULL) { + dlist->current = new_el; + dlist->pointer = new_el; + } + } else { + new_el->next = dlist->current; + new_el->previous = NULL; + dlist->start = new_el; + dlist->current->previous = new_el; + } + dlist->len++; +} + +void _dlist_insert_end(dlist_t *dlist, dlist_el_t *new_el) { + dlist->current->next = new_el; + new_el->previous = dlist->current; + new_el->next = NULL; + dlist->current = new_el; + dlist->pointer = new_el; + dlist->len++; +} + +void _dlist_insert_sort(dlist_t *dlist, void *el_ptr, int el_siz, + dblist_cb_t *cb) { + dlist_el_t *d_el = malloc(sizeof(dlist_el_t)); + d_el->el_ptr = malloc(el_siz); + memcpy(d_el->el_ptr, el_ptr, el_siz); + + dlist_el_t *dlist_item = dlist->start; + bool res = true; + if (dlist->start == NULL) { + dlist->start = d_el; + dlist->current = d_el; + d_el->next = NULL; + d_el->previous = NULL; + dlist->pointer = d_el; + dlist->len++; + return; + } + for (int i = 0; i < dlist->len; i++) { + res = cb(el_ptr, dlist_item->el_ptr); + if (!res) { + dlist_item = dlist_item->previous; + _dlist_insert(dlist, d_el, dlist_item); + break; + } + } + if (res) _dlist_insert_end(dlist, d_el); +} + void _dlist_add(dlist_t *dlist, void *el_ptr, int el_siz, bool prepend) { dlist_el_t *d_el = malloc(sizeof(dlist_el_t)); d_el->el_ptr = malloc(el_siz); @@ -58,7 +114,7 @@ void *dlist_it_next(dlist_t *dlist) { if (dlist->pointer->next != NULL) { dlist->pointer = dlist->pointer->next; return dlist->pointer->el_ptr; - } else { + } else { return NULL; } } \ No newline at end of file diff --git a/src/utils/dlist.h b/src/utils/dlist.h index d86701c..8ddc984 100644 --- a/src/utils/dlist.h +++ b/src/utils/dlist.h @@ -18,14 +18,23 @@ typedef struct dlist_t { } dlist_t; dlist_t *_dlist_init(void *el_ptr, int el_siz); + +/* Returns if a > b */ +typedef bool dblist_cb_t(void *a, void *b); + void *dlist_get_current(dlist_t *dlist); void *dlist_it_prev(dlist_t *dlist); void _dlist_add(dlist_t *dlist, void *el_ptr, int el_siz, bool prepend); void *dlist_it_prev(dlist_t *dlist); void *dlist_it_next(dlist_t *dlist); +void _dlist_insert_sort(dlist_t *dlist, void *el_ptr, int el_siz, + dblist_cb_t *cb); #define dlist_init(el_ptr, el_def) _dlist_init(el_ptr, sizeof(el_def)) -#define dlist_add(dlist, el_ptr, el_def, prepend) _dlist_add(dlist, el_ptr, sizeof(el_def), prepend) +#define dlist_add(dlist, el_ptr, el_def, prepend) \ + _dlist_add(dlist, el_ptr, sizeof(el_def), prepend) #define dlist_get_current(dlist) dlist->current->el_ptr +#define dlist_insert_sort(dlist, el_ptr, el_typ, cb) \ + _dlist_insert_sort(dlist, el_ptr, sizeof(el_typ), cb) #endif \ No newline at end of file diff --git a/test/utils/dlist.c b/test/utils/dlist.c index 2a49672..2cf2b99 100644 --- a/test/utils/dlist.c +++ b/test/utils/dlist.c @@ -93,6 +93,37 @@ void test__init__add_and_iterate(void **state) { assert_memory_equal(dl_t3, &t3, sizeof(test_t)); } +bool _sort(void *_a, void *_b) { + test_t *a = _a; + test_t *b = _b; + + return a->num > b->num; +} + +void test__init__insert_sort(void **state) { + test_t t1 = {.buf = "TEST BUF", .num = 123, .text = LOREM_IPSUM}; + test_t t2 = {.buf = "TEST 1 BUF", .num = 11, .text = "RAND 1 TEXT"}; + test_t t3 = {.buf = "TEST 2 BUF", .num = 22, .text = "RAND 2 TEXT"}; + test_t t4 = {.buf = "TEST 3 BUF", .num = 23, .text = "RAND 3 TEXT"}; + + dlist_t *dlist = dlist_init(NULL, test_t); + + dlist_insert_sort(dlist, &t1, test_t, _sort); + dlist_insert_sort(dlist, &t2, test_t, _sort); + dlist_insert_sort(dlist, &t3, test_t, _sort); + dlist_insert_sort(dlist, &t4, test_t, _sort); + + test_t *dl_t1 = dlist_get_current(dlist); + test_t *dl_t4 = dlist_it_prev(dlist); + test_t *dl_t3 = dlist_it_prev(dlist); + test_t *dl_t2 = dlist_it_prev(dlist); + + assert_memory_equal(dl_t1, &t1, sizeof(test_t)); + assert_memory_equal(dl_t2, &t2, sizeof(test_t)); + assert_memory_equal(dl_t3, &t3, sizeof(test_t)); + assert_memory_equal(dl_t4, &t4, sizeof(test_t)); +} + int setup(void **state) { return 0; } int tear_down(void **state) { return 0; } @@ -102,6 +133,7 @@ int main(int argc, char **argv) { cmocka_unit_test(test__init__add_several_times), cmocka_unit_test(test__init__add_several_times_prepend), cmocka_unit_test(test__init__add_and_iterate), + cmocka_unit_test(test__init__insert_sort), };