Exemple #1
0
list_t * _list_new(unsigned int offset) {
    list_t *list = mem_alloc(sizeof(list_t));
    _list_init(list, offset);
    return list;
}
Exemple #2
0
void symbol__list_init(SYMBOL *sym)
{
    _list_init(&sym->list);
}
Exemple #3
0
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);
    }