#include<stdio.h>
#include<stdlib.h>
#include "dllist.h"
dllist *
list_new(dl_comparator comp, dl_print print, dl_freefunc ff)
{
dllist *list;
if(comp && print && ff)
{
list
= malloc(sizeof(dllist
)); list->comp = comp;
list->print = print;
list->free_func = ff;
list->start = NULL;
list->end = NULL;
return list;
}
return NULL;
}
int
list_add(dllist *list, void *data)
{
dlnode *node;
dlnode *tmp;
if(!(list && data))
return 0;
node
= malloc(sizeof(dlnode
)); if(node == NULL)
return 0;
node->data = data;
if(list->start == NULL)
{
list->start = node;
list->end = node;
node->next = NULL;
node->prev = NULL;
return 1;
}
tmp = list->start;
list->start = node;
node->next = tmp;
node->prev = NULL;
tmp->prev = node;
return 1;
}
int
list_add_end(dllist *list, void *data)
{
dlnode *node;
dlnode *tmp;
if(!(list && data))
return 0;
node
= malloc(sizeof(dlnode
)); if(node == NULL)
return 0;
node->data = data;
if(list->start == NULL)
{
list->start = node;
list->end = node;
node->next = NULL;
node->prev = NULL;
return 1;
}
tmp = list->end;
list->end= node;
node->next = NULL;
node->prev = tmp;
tmp->next = node;
return 1;
}
dlnode *
list_search(dllist *list, void *data)
{
dlnode *node;
if(!list)
return NULL;
if(!(list->start))
return NULL;
if(!data)
return NULL;
node = list->start;
while(node != NULL)
{
if(list->comp(data, node->data))
return node;
node = node->next;
}
return NULL;
}
int
list_remove(dllist *list, void *data)
{
dlnode *node;
if(!list)
return 0;
if(!(list->start))
return 0;
if(!data)
return 0;
node = list->start;
while(node != NULL)
{
if(list->comp(data, node->data))
{
if(node->prev)
{
if(node->next)
node->prev->next = node->next;
else
node->prev->next = NULL;
}
if(node->next)
{
if(node->prev)
node->next->prev = node->prev;
else
node->next->prev = NULL;
}
if(list->start == node)
{
list->start = node->next;
if(!(node->next))
list->end = node->next;
}
else if(list->end == node)
{
list->end = NULL;
list->start = NULL;
}
list->free_func(node->data);
node = NULL;
return 1;
}
node = node->next;
}
return 0;
}
void *
list_pop(dllist *list)
{
dlnode *node;
void *data;
node = list->start;
node->next->prev = NULL;
data = node->data;
list->start = list->start->next;
node = NULL;
return data;
}
void *
list_pop_end(dllist *list)
{
dlnode *node;
void *data;
node = list->end;
node->prev->next = NULL;
data = node->data;
list->end = node->prev;
node = NULL;
return data;
}
void
list_free(dllist *list)
{
dlnode *node;
dlnode *tmp;
node = list->start;
while(node)
{
list->free_func(node->data);
tmp = node;
node = node->next;
tmp = NULL;
}
list = NULL;
}
void *
list_delnode(dllist *list, dlnode *node)
{
void *data;
if(!node)
return NULL;
if(node->prev)
{
if(node->next)
node->prev->next = node->next;
else
node->prev->next = NULL;
}
if(node->next)
{
if(node->prev)
node->next->prev = node->prev;
else
node->next->prev = NULL;
}
if(list->start == node)
{
list->start = node->next;
if(!(node->next))
list->end = node->next;
}
else if(list->end == node)
{
list->end = NULL;
list->start = NULL;
}
data = node->data;
node = NULL;
return data;
}
int
list_addafternode(dlnode *node, void *data)
{
dlnode *new_node;
new_node
= malloc(sizeof(new_node
)); if(!new_node)
return 0;
new_node->data = data;
new_node->next = node->next;
new_node->prev = node;
node->next = new_node;
return 1;
}
int
list_addbeforenode(dlnode *node, void *data)
{
dlnode *new_node;
new_node
= malloc(sizeof(new_node
)); if(!new_node)
return 0;
new_node->data = data;
new_node->next = node->next;
new_node->prev = node;
node->next = new_node;
return 1;
}
void
list_print(dllist *list)
{
int i = 0;
dlnode *node;
if(list)
if(list->start)
node = list->start;
else
return;
else
return;
while(node)
{
list->print(node->data);
node = node->next;
i++;
}
return;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CgojaW5jbHVkZSAiZGxsaXN0LmgiCgpkbGxpc3QgICoKbGlzdF9uZXcoZGxfY29tcGFyYXRvciBjb21wLCBkbF9wcmludCBwcmludCwgZGxfZnJlZWZ1bmMgZmYpCnsKICAgIGRsbGlzdCAqbGlzdDsKICAgIAogICAgaWYoY29tcCAmJiBwcmludCAmJiBmZikKICAgIHsgCiAgICAgICAgbGlzdCA9IG1hbGxvYyhzaXplb2YoZGxsaXN0KSk7CiAgICAgICAgbGlzdC0+Y29tcCA9IGNvbXA7CiAgICAgICAgbGlzdC0+cHJpbnQgPSBwcmludDsKICAgICAgICBsaXN0LT5mcmVlX2Z1bmMgPSBmZjsKICAgICAgICBsaXN0LT5zdGFydCA9IE5VTEw7CiAgICAgICAgbGlzdC0+ZW5kID0gTlVMTDsKCiAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKaW50ICAgICAKbGlzdF9hZGQoZGxsaXN0ICpsaXN0LCB2b2lkICpkYXRhKQp7CiAgICBkbG5vZGUgKm5vZGU7CiAgICBkbG5vZGUgKnRtcDsKCiAgICBpZighKGxpc3QgJiYgZGF0YSkpCiAgICAgICAgcmV0dXJuIDA7CgogICAgbm9kZSA9IG1hbGxvYyhzaXplb2YoZGxub2RlKSk7CiAgICBpZihub2RlID09IE5VTEwpCiAgICAgICAgcmV0dXJuIDA7CiAgICBub2RlLT5kYXRhID0gZGF0YTsKCiAgICBpZihsaXN0LT5zdGFydCA9PSBOVUxMKQogICAgewogICAgICAgIGxpc3QtPnN0YXJ0ID0gbm9kZTsKICAgICAgICBsaXN0LT5lbmQgPSBub2RlOwogICAgICAgIG5vZGUtPm5leHQgPSBOVUxMOwogICAgICAgIG5vZGUtPnByZXYgPSBOVUxMOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgdG1wID0gbGlzdC0+c3RhcnQ7CiAgICBsaXN0LT5zdGFydCA9IG5vZGU7CiAgICBub2RlLT5uZXh0ID0gdG1wOwogICAgbm9kZS0+cHJldiA9IE5VTEw7CiAgICB0bXAtPnByZXYgPSBub2RlOwogICAgCiAgICByZXR1cm4gMTsKfQoKaW50ICAgICAKbGlzdF9hZGRfZW5kKGRsbGlzdCAqbGlzdCwgdm9pZCAqZGF0YSkKewogICAgZGxub2RlICpub2RlOwogICAgZGxub2RlICp0bXA7CgogICAgaWYoIShsaXN0ICYmIGRhdGEpKQogICAgICAgIHJldHVybiAwOwoKICAgIG5vZGUgPSBtYWxsb2Moc2l6ZW9mKGRsbm9kZSkpOwogICAgaWYobm9kZSA9PSBOVUxMKQogICAgICAgIHJldHVybiAwOwogICAgbm9kZS0+ZGF0YSA9IGRhdGE7CgogICAgaWYobGlzdC0+c3RhcnQgPT0gTlVMTCkKICAgIHsKICAgICAgICBsaXN0LT5zdGFydCA9IG5vZGU7CiAgICAgICAgbGlzdC0+ZW5kID0gbm9kZTsKICAgICAgICBub2RlLT5uZXh0ID0gTlVMTDsKICAgICAgICBub2RlLT5wcmV2ID0gTlVMTDsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHRtcCA9IGxpc3QtPmVuZDsKICAgIGxpc3QtPmVuZD0gbm9kZTsKICAgIG5vZGUtPm5leHQgPSBOVUxMOwogICAgbm9kZS0+cHJldiA9IHRtcDsKICAgIHRtcC0+bmV4dCA9IG5vZGU7CiAgICAKICAgIHJldHVybiAxOwp9CgpkbG5vZGUgICoKbGlzdF9zZWFyY2goZGxsaXN0ICpsaXN0LCB2b2lkICpkYXRhKQp7CiAgICBkbG5vZGUgKm5vZGU7CgogICAgaWYoIWxpc3QpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBpZighKGxpc3QtPnN0YXJ0KSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGlmKCFkYXRhKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIG5vZGUgPSBsaXN0LT5zdGFydDsKICAgIHdoaWxlKG5vZGUgIT0gTlVMTCkKICAgIHsKICAgICAgICBpZihsaXN0LT5jb21wKGRhdGEsIG5vZGUtPmRhdGEpKQogICAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgppbnQKbGlzdF9yZW1vdmUoZGxsaXN0ICpsaXN0LCB2b2lkICpkYXRhKQp7CiAgICBkbG5vZGUgKm5vZGU7CiAgICBpZighbGlzdCkKICAgICAgICByZXR1cm4gMDsKICAgIGlmKCEobGlzdC0+c3RhcnQpKQogICAgICAgIHJldHVybiAwOwogICAgaWYoIWRhdGEpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIAogICAgbm9kZSA9IGxpc3QtPnN0YXJ0OwogICAgd2hpbGUobm9kZSAhPSBOVUxMKQogICAgewogICAgICAgIGlmKGxpc3QtPmNvbXAoZGF0YSwgbm9kZS0+ZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICBpZihub2RlLT5wcmV2KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihub2RlLT5uZXh0KQogICAgICAgICAgICAgICAgICAgIG5vZGUtPnByZXYtPm5leHQgPSBub2RlLT5uZXh0OwogICAgICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgICAgICBub2RlLT5wcmV2LT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihub2RlLT5uZXh0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihub2RlLT5wcmV2KQogICAgICAgICAgICAgICAgICAgIG5vZGUtPm5leHQtPnByZXYgPSBub2RlLT5wcmV2OwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIG5vZGUtPm5leHQtPnByZXYgPSBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZihsaXN0LT5zdGFydCA9PSBub2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsaXN0LT5zdGFydCA9IG5vZGUtPm5leHQ7CiAgICAgICAgICAgICAgICBpZighKG5vZGUtPm5leHQpKQogICAgICAgICAgICAgICAgICAgIGxpc3QtPmVuZCA9IG5vZGUtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZihsaXN0LT5lbmQgPT0gbm9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGlzdC0+ZW5kID0gTlVMTDsKICAgICAgICAgICAgICAgIGxpc3QtPnN0YXJ0ID0gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgbGlzdC0+ZnJlZV9mdW5jKG5vZGUtPmRhdGEpOwogICAgICAgICAgICBmcmVlKG5vZGUpOwogICAgICAgICAgICBub2RlID0gTlVMTDsKCiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKICAgIH0KICAgIHJldHVybiAwOwp9Cgp2b2lkICoKbGlzdF9wb3AoZGxsaXN0ICpsaXN0KQp7CiAgICBkbG5vZGUgKm5vZGU7CiAgICB2b2lkICpkYXRhOwogICAgbm9kZSA9IGxpc3QtPnN0YXJ0OwogICAgbm9kZS0+bmV4dC0+cHJldiA9IE5VTEw7CiAgICBkYXRhID0gbm9kZS0+ZGF0YTsKICAgIGxpc3QtPnN0YXJ0ID0gbGlzdC0+c3RhcnQtPm5leHQ7CiAgICBmcmVlKG5vZGUpOwogICAgbm9kZSA9IE5VTEw7CiAgICByZXR1cm4gZGF0YTsKfQogICAgCnZvaWQgKgpsaXN0X3BvcF9lbmQoZGxsaXN0ICpsaXN0KQp7CiAgICBkbG5vZGUgKm5vZGU7CiAgICB2b2lkICpkYXRhOwogICAgbm9kZSA9IGxpc3QtPmVuZDsKICAgIG5vZGUtPnByZXYtPm5leHQgPSBOVUxMOwogICAgZGF0YSA9IG5vZGUtPmRhdGE7CiAgICBsaXN0LT5lbmQgPSBub2RlLT5wcmV2OwogICAgZnJlZShub2RlKTsKICAgIG5vZGUgPSBOVUxMOwogICAgcmV0dXJuIGRhdGE7Cn0KCnZvaWQgICAgCmxpc3RfZnJlZShkbGxpc3QgKmxpc3QpCnsKICAgIGRsbm9kZSAqbm9kZTsKICAgIGRsbm9kZSAqdG1wOwogICAgbm9kZSA9IGxpc3QtPnN0YXJ0OwogICAgd2hpbGUobm9kZSkKICAgIHsKICAgICAgICBsaXN0LT5mcmVlX2Z1bmMobm9kZS0+ZGF0YSk7CiAgICAgICAgdG1wID0gbm9kZTsKICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKICAgICAgICBmcmVlKHRtcCk7CiAgICAgICAgdG1wID0gTlVMTDsKICAgIH0KICAgIGZyZWUobGlzdCk7CiAgICBsaXN0ID0gTlVMTDsKfQogICAgICAgIAp2b2lkICoKbGlzdF9kZWxub2RlKGRsbGlzdCAqbGlzdCwgZGxub2RlICpub2RlKQp7CiAgICB2b2lkICpkYXRhOwogICAgICAgICAgICAKICAgIGlmKCFub2RlKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmKG5vZGUtPnByZXYpCiAgICB7CiAgICAgICAgaWYobm9kZS0+bmV4dCkKICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IG5vZGUtPm5leHQ7CiAgICAgICAgZWxzZSAKICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IE5VTEw7CiAgICB9CiAgICBpZihub2RlLT5uZXh0KQogICAgewogICAgICAgIGlmKG5vZGUtPnByZXYpCiAgICAgICAgICAgIG5vZGUtPm5leHQtPnByZXYgPSBub2RlLT5wcmV2OwogICAgICAgIGVsc2UKICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IE5VTEw7CiAgICB9CiAgICAKICAgIGlmKGxpc3QtPnN0YXJ0ID09IG5vZGUpCiAgICB7CiAgICAgICAgbGlzdC0+c3RhcnQgPSBub2RlLT5uZXh0OwogICAgICAgIGlmKCEobm9kZS0+bmV4dCkpCiAgICAgICAgICAgIGxpc3QtPmVuZCA9IG5vZGUtPm5leHQ7CiAgICB9CiAgICBlbHNlIGlmKGxpc3QtPmVuZCA9PSBub2RlKQogICAgewogICAgICAgIGxpc3QtPmVuZCA9IE5VTEw7CiAgICAgICAgbGlzdC0+c3RhcnQgPSBOVUxMOwogICAgfQogICAgCiAgICBkYXRhID0gbm9kZS0+ZGF0YTsKICAgIGZyZWUobm9kZSk7CiAgICBub2RlID0gTlVMTDsKICAgIHJldHVybiBkYXRhOwp9CgppbnQgCmxpc3RfYWRkYWZ0ZXJub2RlKGRsbm9kZSAqbm9kZSwgdm9pZCAqZGF0YSkKewogICAgZGxub2RlICpuZXdfbm9kZTsKICAgIG5ld19ub2RlID0gbWFsbG9jKHNpemVvZihuZXdfbm9kZSkpOwogICAgaWYoIW5ld19ub2RlKQogICAgICAgIHJldHVybiAwOwogICAgbmV3X25vZGUtPmRhdGEgPSBkYXRhOwogICAgbmV3X25vZGUtPm5leHQgPSBub2RlLT5uZXh0OwogICAgbmV3X25vZGUtPnByZXYgPSBub2RlOwogICAgbm9kZS0+bmV4dCA9IG5ld19ub2RlOwogICAgcmV0dXJuIDE7Cn0KCmludCAKbGlzdF9hZGRiZWZvcmVub2RlKGRsbm9kZSAqbm9kZSwgdm9pZCAqZGF0YSkKewogICAgZGxub2RlICpuZXdfbm9kZTsKICAgIG5ld19ub2RlID0gbWFsbG9jKHNpemVvZihuZXdfbm9kZSkpOwogICAgaWYoIW5ld19ub2RlKQogICAgICAgIHJldHVybiAwOwogICAgbmV3X25vZGUtPmRhdGEgPSBkYXRhOwogICAgbmV3X25vZGUtPm5leHQgPSBub2RlLT5uZXh0OwogICAgbmV3X25vZGUtPnByZXYgPSBub2RlOwogICAgbm9kZS0+bmV4dCA9IG5ld19ub2RlOwogICAgcmV0dXJuIDE7Cn0KCnZvaWQgICAgCmxpc3RfcHJpbnQoZGxsaXN0ICpsaXN0KQp7CiAgICBpbnQgaSA9IDA7CiAgICBkbG5vZGUgKm5vZGU7CgogICAgaWYobGlzdCkKICAgICAgICBpZihsaXN0LT5zdGFydCkKICAgICAgICAgICAgbm9kZSA9IGxpc3QtPnN0YXJ0OwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuOwogICAgZWxzZQogICAgICAgIHJldHVybjsKCiAgICB3aGlsZShub2RlKQogICAgewogICAgICAgIHByaW50ZigiJWQ6ICIsaSk7CiAgICAgICAgbGlzdC0+cHJpbnQobm9kZS0+ZGF0YSk7CiAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CiAgICAgICAgaSsrOwogICAgfQogICAgcmV0dXJuOwp9