list_t * _list_new(unsigned int offset) { list_t *list = mem_alloc(sizeof(list_t)); _list_init(list, offset); return list; }
void symbol__list_init(SYMBOL *sym) { _list_init(&sym->list); }
void list_sort(list_t *list, cmp_cb_t cmp_cb) { void *p; void *q; void *next; int i, psize, qsize; int merges = 0; int sublist_size = 1; list_t list_a; list_t list_b; if (list_head(list) == NULL) { return; } _list_init(&list_a, list->offset); _list_init(&list_b, list->offset); list_t *list_from = list; list_t *list_to = &list_a; while (merges != 1) { merges = 0; p = list_head(list_from); q = p; for (;;) { if (p == NULL) { break; } psize = 0; for (i = 0;i < sublist_size;++i) { q = list_next(list_from, q); ++psize; if (q == NULL) { break; } } qsize = sublist_size; while (psize > 0 || (qsize > 0 && q != NULL)){ if (qsize == 0 || q == NULL || (psize > 0 && (cmp_cb(p,q)))) { next = list_next(list_from, p); list_insert_tail(list_to, p); p = next; --psize; } else { next = list_next(list_from, q); list_insert_tail(list_to, q); q = next; --qsize; } } p = q; ++merges; } sublist_size *= 2; if (list_to == &list_a) { list_from = &list_a; list_to = &list_b; } else { list_from = &list_b; list_to = &list_a; } } list_for_each(list_from, void *, node) { list_insert_tail(list, node); }