#include<stdio.h>
#include<stdlib.h>
#include "dllist.h"
// Function that compares two objects. Returns 1 if equal, 0 if not.
int
comparator(void *a, void *b)
{
if((int *)a == (void *)b)
return 1;
else;
return 0;
}
//Function that print a object
int
print(void *a)
{
}
//Function that free object
int
free_o(void *a)
{
}
int
main()
{
printf("This is a demo to show how to use dllist header.\n"); printf("---------------------\n"); printf("We add 1,2,3 int ponters to the list\n");
dllist *list;
int a=1,b=2,c=3,d=4;
dlnode *node;
list = list_new(&comparator, &print, &free_o);
list_add(list, &a);
list_add(list, &b);
list_add(list, &c);
list_print(list);
printf("Lets add one element at the end of the list.\n"); list_add_end(list, &d);
list_print(list);
printf("Now we will search for element with number 2.\n"); node = list_search(list, &b);
print(node->data);
printf("With the node we retrived from search, lets remove it from the list.\n"); list_delnode(list, node);
list_print(list);
printf("At next, we will pop the first element from the list and print the content.\n"); node = list_pop(list);
list_print(list);
return 0;
}
#ifndef list_h
#define list_h
typedef int (*dl_comparator)(void *, void *);
typedef int (*dl_print)(void *);
typedef int (*dl_freefunc)(void *);
typedef struct dlnode
{
struct dlnode *next;
struct dlnode *prev;
void *data;
}dlnode;
typedef struct dllist
{
dlnode *start;
dlnode *end;
dl_comparator comp;
dl_print print;
dl_freefunc free_func;
}dllist;
dllist *list_new(dl_comparator, dl_print, dl_freefunc);
int list_add(dllist *, void *);
int list_add_end(dllist *, void *);
dlnode *list_search(dllist *, void *);
int list_remove(dllist *, void *);
void *list_pop(dllist *);
void *list_pop_end(dllist *);
void list_free(dllist *);
void list_print(dllist *);
void *list_delnode(dllist *, dlnode *);
int list_addafternode(dlnode *, void *);
int list_addbeforenode(dlnode *, void *);
#endif
#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+CgojaW5jbHVkZSAiZGxsaXN0LmgiCgovLyBGdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHR3byBvYmplY3RzLiBSZXR1cm5zIDEgaWYgZXF1YWwsIDAgaWYgbm90LiAKaW50IApjb21wYXJhdG9yKHZvaWQgKmEsIHZvaWQgKmIpCnsKICBpZigoaW50ICopYSA9PSAodm9pZCAqKWIpCiAgICByZXR1cm4gMTsKICBlbHNlOwogICAgcmV0dXJuIDA7Cn0KCi8vRnVuY3Rpb24gdGhhdCBwcmludCBhIG9iamVjdAppbnQgCnByaW50KHZvaWQgKmEpCnsKICBwcmludGYoIiVkXG4iLCAqKChpbnQgKilhKSk7Cn0KCi8vRnVuY3Rpb24gdGhhdCBmcmVlIG9iamVjdAppbnQKZnJlZV9vKHZvaWQgKmEpCnsKICBmcmVlKGEpOwp9CgppbnQKbWFpbigpCnsKICBwcmludGYoIlRoaXMgaXMgYSBkZW1vIHRvIHNob3cgaG93IHRvIHVzZSBkbGxpc3QgaGVhZGVyLlxuIik7CiAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogIHByaW50ZigiV2UgYWRkIDEsMiwzIGludCBwb250ZXJzIHRvIHRoZSBsaXN0XG4iKTsKICAgIAogIGRsbGlzdCAqbGlzdDsKICBpbnQgYT0xLGI9MixjPTMsZD00OwogIGRsbm9kZSAqbm9kZTsKICAKICBsaXN0ID0gbGlzdF9uZXcoJmNvbXBhcmF0b3IsICZwcmludCwgJmZyZWVfbyk7CiAgCiAgbGlzdF9hZGQobGlzdCwgJmEpOwogIGxpc3RfYWRkKGxpc3QsICZiKTsKICBsaXN0X2FkZChsaXN0LCAmYyk7CgogIGxpc3RfcHJpbnQobGlzdCk7CgogIHByaW50ZigiTGV0cyBhZGQgb25lIGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiIpOwogIGxpc3RfYWRkX2VuZChsaXN0LCAmZCk7CiAgbGlzdF9wcmludChsaXN0KTsKICAKICBwcmludGYoIk5vdyB3ZSB3aWxsIHNlYXJjaCBmb3IgZWxlbWVudCB3aXRoIG51bWJlciAyLlxuIik7CiAgbm9kZSA9IGxpc3Rfc2VhcmNoKGxpc3QsICZiKTsgCiAgcHJpbnQobm9kZS0+ZGF0YSk7CgogIHByaW50ZigiV2l0aCB0aGUgbm9kZSB3ZSByZXRyaXZlZCBmcm9tIHNlYXJjaCwgbGV0cyByZW1vdmUgaXQgZnJvbSB0aGUgbGlzdC5cbiIpOwogIGxpc3RfZGVsbm9kZShsaXN0LCBub2RlKTsKICBsaXN0X3ByaW50KGxpc3QpOwoKICBwcmludGYoIkF0IG5leHQsIHdlIHdpbGwgcG9wIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIGxpc3QgYW5kIHByaW50IHRoZSBjb250ZW50LlxuIik7CiAgbm9kZSA9IGxpc3RfcG9wKGxpc3QpOwogIGxpc3RfcHJpbnQobGlzdCk7CiAgCiAgcmV0dXJuIDA7Cn0KCiNpZm5kZWYgbGlzdF9oCiNkZWZpbmUgbGlzdF9oCgp0eXBlZGVmIGludCAoKmRsX2NvbXBhcmF0b3IpKHZvaWQgKiwgdm9pZCAqKTsKdHlwZWRlZiBpbnQgKCpkbF9wcmludCkodm9pZCAqKTsKdHlwZWRlZiBpbnQgKCpkbF9mcmVlZnVuYykodm9pZCAqKTsKCnR5cGVkZWYgc3RydWN0IGRsbm9kZQp7CiAgICBzdHJ1Y3QgZGxub2RlICpuZXh0OwogICAgc3RydWN0IGRsbm9kZSAqcHJldjsKICAgIHZvaWQgKmRhdGE7Cn1kbG5vZGU7Cgp0eXBlZGVmIHN0cnVjdCBkbGxpc3QKewogICAgZGxub2RlICpzdGFydDsKICAgIGRsbm9kZSAqZW5kOwogICAgZGxfY29tcGFyYXRvciBjb21wOwogICAgZGxfcHJpbnQgcHJpbnQ7CiAgICBkbF9mcmVlZnVuYyBmcmVlX2Z1bmM7Cn1kbGxpc3Q7CgpkbGxpc3QgICpsaXN0X25ldyhkbF9jb21wYXJhdG9yLCBkbF9wcmludCwgZGxfZnJlZWZ1bmMpOwppbnQgICAgIGxpc3RfYWRkKGRsbGlzdCAqLCB2b2lkICopOwppbnQgICAgIGxpc3RfYWRkX2VuZChkbGxpc3QgKiwgdm9pZCAqKTsKZGxub2RlICAqbGlzdF9zZWFyY2goZGxsaXN0ICosIHZvaWQgKik7CmludCAgICAgbGlzdF9yZW1vdmUoZGxsaXN0ICosIHZvaWQgKik7CnZvaWQgICAgKmxpc3RfcG9wKGRsbGlzdCAqKTsKdm9pZCAgICAqbGlzdF9wb3BfZW5kKGRsbGlzdCAqKTsKdm9pZCAgICBsaXN0X2ZyZWUoZGxsaXN0ICopOwp2b2lkICAgIGxpc3RfcHJpbnQoZGxsaXN0ICopOwoKdm9pZCAgICAqbGlzdF9kZWxub2RlKGRsbGlzdCAqLCBkbG5vZGUgKik7CmludCAgICAgbGlzdF9hZGRhZnRlcm5vZGUoZGxub2RlICosIHZvaWQgKik7CmludCAgICAgbGlzdF9hZGRiZWZvcmVub2RlKGRsbm9kZSAqLCB2b2lkICopOwojZW5kaWYKCiNpbmNsdWRlPHN0ZGlvLmg+CiNpbmNsdWRlPHN0ZGxpYi5oPgoKI2luY2x1ZGUgImRsbGlzdC5oIgoKZGxsaXN0ICAqCmxpc3RfbmV3KGRsX2NvbXBhcmF0b3IgY29tcCwgZGxfcHJpbnQgcHJpbnQsIGRsX2ZyZWVmdW5jIGZmKQp7CiAgICBkbGxpc3QgKmxpc3Q7CiAgICAKICAgIGlmKGNvbXAgJiYgcHJpbnQgJiYgZmYpCiAgICB7IAogICAgICAgIGxpc3QgPSBtYWxsb2Moc2l6ZW9mKGRsbGlzdCkpOwogICAgICAgIGxpc3QtPmNvbXAgPSBjb21wOwogICAgICAgIGxpc3QtPnByaW50ID0gcHJpbnQ7CiAgICAgICAgbGlzdC0+ZnJlZV9mdW5jID0gZmY7CiAgICAgICAgbGlzdC0+c3RhcnQgPSBOVUxMOwogICAgICAgIGxpc3QtPmVuZCA9IE5VTEw7CgogICAgICAgIHJldHVybiBsaXN0OwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCmludCAgICAgCmxpc3RfYWRkKGRsbGlzdCAqbGlzdCwgdm9pZCAqZGF0YSkKewogICAgZGxub2RlICpub2RlOwogICAgZGxub2RlICp0bXA7CgogICAgaWYoIShsaXN0ICYmIGRhdGEpKQogICAgICAgIHJldHVybiAwOwoKICAgIG5vZGUgPSBtYWxsb2Moc2l6ZW9mKGRsbm9kZSkpOwogICAgaWYobm9kZSA9PSBOVUxMKQogICAgICAgIHJldHVybiAwOwogICAgbm9kZS0+ZGF0YSA9IGRhdGE7CgogICAgaWYobGlzdC0+c3RhcnQgPT0gTlVMTCkKICAgIHsKICAgICAgICBsaXN0LT5zdGFydCA9IG5vZGU7CiAgICAgICAgbGlzdC0+ZW5kID0gbm9kZTsKICAgICAgICBub2RlLT5uZXh0ID0gTlVMTDsKICAgICAgICBub2RlLT5wcmV2ID0gTlVMTDsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHRtcCA9IGxpc3QtPnN0YXJ0OwogICAgbGlzdC0+c3RhcnQgPSBub2RlOwogICAgbm9kZS0+bmV4dCA9IHRtcDsKICAgIG5vZGUtPnByZXYgPSBOVUxMOwogICAgdG1wLT5wcmV2ID0gbm9kZTsKICAgIAogICAgcmV0dXJuIDE7Cn0KCmludCAgICAgCmxpc3RfYWRkX2VuZChkbGxpc3QgKmxpc3QsIHZvaWQgKmRhdGEpCnsKICAgIGRsbm9kZSAqbm9kZTsKICAgIGRsbm9kZSAqdG1wOwoKICAgIGlmKCEobGlzdCAmJiBkYXRhKSkKICAgICAgICByZXR1cm4gMDsKCiAgICBub2RlID0gbWFsbG9jKHNpemVvZihkbG5vZGUpKTsKICAgIGlmKG5vZGUgPT0gTlVMTCkKICAgICAgICByZXR1cm4gMDsKICAgIG5vZGUtPmRhdGEgPSBkYXRhOwoKICAgIGlmKGxpc3QtPnN0YXJ0ID09IE5VTEwpCiAgICB7CiAgICAgICAgbGlzdC0+c3RhcnQgPSBub2RlOwogICAgICAgIGxpc3QtPmVuZCA9IG5vZGU7CiAgICAgICAgbm9kZS0+bmV4dCA9IE5VTEw7CiAgICAgICAgbm9kZS0+cHJldiA9IE5VTEw7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICB0bXAgPSBsaXN0LT5lbmQ7CiAgICBsaXN0LT5lbmQ9IG5vZGU7CiAgICBub2RlLT5uZXh0ID0gTlVMTDsKICAgIG5vZGUtPnByZXYgPSB0bXA7CiAgICB0bXAtPm5leHQgPSBub2RlOwogICAgCiAgICByZXR1cm4gMTsKfQoKZGxub2RlICAqCmxpc3Rfc2VhcmNoKGRsbGlzdCAqbGlzdCwgdm9pZCAqZGF0YSkKewogICAgZGxub2RlICpub2RlOwoKICAgIGlmKCFsaXN0KQogICAgICAgIHJldHVybiBOVUxMOwogICAgaWYoIShsaXN0LT5zdGFydCkpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBpZighZGF0YSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBub2RlID0gbGlzdC0+c3RhcnQ7CiAgICB3aGlsZShub2RlICE9IE5VTEwpCiAgICB7CiAgICAgICAgaWYobGlzdC0+Y29tcChkYXRhLCBub2RlLT5kYXRhKSkKICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKaW50Cmxpc3RfcmVtb3ZlKGRsbGlzdCAqbGlzdCwgdm9pZCAqZGF0YSkKewogICAgZGxub2RlICpub2RlOwogICAgaWYoIWxpc3QpCiAgICAgICAgcmV0dXJuIDA7CiAgICBpZighKGxpc3QtPnN0YXJ0KSkKICAgICAgICByZXR1cm4gMDsKICAgIGlmKCFkYXRhKQogICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAKICAgIG5vZGUgPSBsaXN0LT5zdGFydDsKICAgIHdoaWxlKG5vZGUgIT0gTlVMTCkKICAgIHsKICAgICAgICBpZihsaXN0LT5jb21wKGRhdGEsIG5vZGUtPmRhdGEpKQogICAgICAgIHsKICAgICAgICAgICAgaWYobm9kZS0+cHJldikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYobm9kZS0+bmV4dCkKICAgICAgICAgICAgICAgICAgICBub2RlLT5wcmV2LT5uZXh0ID0gbm9kZS0+bmV4dDsKICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYobm9kZS0+bmV4dCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYobm9kZS0+cHJldikKICAgICAgICAgICAgICAgICAgICBub2RlLT5uZXh0LT5wcmV2ID0gbm9kZS0+cHJldjsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBub2RlLT5uZXh0LT5wcmV2ID0gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYobGlzdC0+c3RhcnQgPT0gbm9kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGlzdC0+c3RhcnQgPSBub2RlLT5uZXh0OwogICAgICAgICAgICAgICAgaWYoIShub2RlLT5uZXh0KSkKICAgICAgICAgICAgICAgICAgICBsaXN0LT5lbmQgPSBub2RlLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYobGlzdC0+ZW5kID09IG5vZGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxpc3QtPmVuZCA9IE5VTEw7CiAgICAgICAgICAgICAgICBsaXN0LT5zdGFydCA9IE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGxpc3QtPmZyZWVfZnVuYyhub2RlLT5kYXRhKTsKICAgICAgICAgICAgZnJlZShub2RlKTsKICAgICAgICAgICAgbm9kZSA9IE5VTEw7CgogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKdm9pZCAqCmxpc3RfcG9wKGRsbGlzdCAqbGlzdCkKewogICAgZGxub2RlICpub2RlOwogICAgdm9pZCAqZGF0YTsKICAgIG5vZGUgPSBsaXN0LT5zdGFydDsKICAgIG5vZGUtPm5leHQtPnByZXYgPSBOVUxMOwogICAgZGF0YSA9IG5vZGUtPmRhdGE7CiAgICBsaXN0LT5zdGFydCA9IGxpc3QtPnN0YXJ0LT5uZXh0OwogICAgZnJlZShub2RlKTsKICAgIG5vZGUgPSBOVUxMOwogICAgcmV0dXJuIGRhdGE7Cn0KICAgIAp2b2lkICoKbGlzdF9wb3BfZW5kKGRsbGlzdCAqbGlzdCkKewogICAgZGxub2RlICpub2RlOwogICAgdm9pZCAqZGF0YTsKICAgIG5vZGUgPSBsaXN0LT5lbmQ7CiAgICBub2RlLT5wcmV2LT5uZXh0ID0gTlVMTDsKICAgIGRhdGEgPSBub2RlLT5kYXRhOwogICAgbGlzdC0+ZW5kID0gbm9kZS0+cHJldjsKICAgIGZyZWUobm9kZSk7CiAgICBub2RlID0gTlVMTDsKICAgIHJldHVybiBkYXRhOwp9Cgp2b2lkICAgIApsaXN0X2ZyZWUoZGxsaXN0ICpsaXN0KQp7CiAgICBkbG5vZGUgKm5vZGU7CiAgICBkbG5vZGUgKnRtcDsKICAgIG5vZGUgPSBsaXN0LT5zdGFydDsKICAgIHdoaWxlKG5vZGUpCiAgICB7CiAgICAgICAgbGlzdC0+ZnJlZV9mdW5jKG5vZGUtPmRhdGEpOwogICAgICAgIHRtcCA9IG5vZGU7CiAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CiAgICAgICAgZnJlZSh0bXApOwogICAgICAgIHRtcCA9IE5VTEw7CiAgICB9CiAgICBmcmVlKGxpc3QpOwogICAgbGlzdCA9IE5VTEw7Cn0KICAgICAgICAKdm9pZCAqCmxpc3RfZGVsbm9kZShkbGxpc3QgKmxpc3QsIGRsbm9kZSAqbm9kZSkKewogICAgdm9pZCAqZGF0YTsKICAgICAgICAgICAgCiAgICBpZighbm9kZSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZihub2RlLT5wcmV2KQogICAgewogICAgICAgIGlmKG5vZGUtPm5leHQpCiAgICAgICAgICAgIG5vZGUtPnByZXYtPm5leHQgPSBub2RlLT5uZXh0OwogICAgICAgIGVsc2UgCiAgICAgICAgICAgIG5vZGUtPnByZXYtPm5leHQgPSBOVUxMOwogICAgfQogICAgaWYobm9kZS0+bmV4dCkKICAgIHsKICAgICAgICBpZihub2RlLT5wcmV2KQogICAgICAgICAgICBub2RlLT5uZXh0LT5wcmV2ID0gbm9kZS0+cHJldjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIG5vZGUtPm5leHQtPnByZXYgPSBOVUxMOwogICAgfQogICAgCiAgICBpZihsaXN0LT5zdGFydCA9PSBub2RlKQogICAgewogICAgICAgIGxpc3QtPnN0YXJ0ID0gbm9kZS0+bmV4dDsKICAgICAgICBpZighKG5vZGUtPm5leHQpKQogICAgICAgICAgICBsaXN0LT5lbmQgPSBub2RlLT5uZXh0OwogICAgfQogICAgZWxzZSBpZihsaXN0LT5lbmQgPT0gbm9kZSkKICAgIHsKICAgICAgICBsaXN0LT5lbmQgPSBOVUxMOwogICAgICAgIGxpc3QtPnN0YXJ0ID0gTlVMTDsKICAgIH0KICAgIAogICAgZGF0YSA9IG5vZGUtPmRhdGE7CiAgICBmcmVlKG5vZGUpOwogICAgbm9kZSA9IE5VTEw7CiAgICByZXR1cm4gZGF0YTsKfQoKaW50IApsaXN0X2FkZGFmdGVybm9kZShkbG5vZGUgKm5vZGUsIHZvaWQgKmRhdGEpCnsKICAgIGRsbm9kZSAqbmV3X25vZGU7CiAgICBuZXdfbm9kZSA9IG1hbGxvYyhzaXplb2YobmV3X25vZGUpKTsKICAgIGlmKCFuZXdfbm9kZSkKICAgICAgICByZXR1cm4gMDsKICAgIG5ld19ub2RlLT5kYXRhID0gZGF0YTsKICAgIG5ld19ub2RlLT5uZXh0ID0gbm9kZS0+bmV4dDsKICAgIG5ld19ub2RlLT5wcmV2ID0gbm9kZTsKICAgIG5vZGUtPm5leHQgPSBuZXdfbm9kZTsKICAgIHJldHVybiAxOwp9CgppbnQgCmxpc3RfYWRkYmVmb3Jlbm9kZShkbG5vZGUgKm5vZGUsIHZvaWQgKmRhdGEpCnsKICAgIGRsbm9kZSAqbmV3X25vZGU7CiAgICBuZXdfbm9kZSA9IG1hbGxvYyhzaXplb2YobmV3X25vZGUpKTsKICAgIGlmKCFuZXdfbm9kZSkKICAgICAgICByZXR1cm4gMDsKICAgIG5ld19ub2RlLT5kYXRhID0gZGF0YTsKICAgIG5ld19ub2RlLT5uZXh0ID0gbm9kZS0+bmV4dDsKICAgIG5ld19ub2RlLT5wcmV2ID0gbm9kZTsKICAgIG5vZGUtPm5leHQgPSBuZXdfbm9kZTsKICAgIHJldHVybiAxOwp9Cgp2b2lkICAgIApsaXN0X3ByaW50KGRsbGlzdCAqbGlzdCkKewogICAgaW50IGkgPSAwOwogICAgZGxub2RlICpub2RlOwoKICAgIGlmKGxpc3QpCiAgICAgICAgaWYobGlzdC0+c3RhcnQpCiAgICAgICAgICAgIG5vZGUgPSBsaXN0LT5zdGFydDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybjsKICAgIGVsc2UKICAgICAgICByZXR1cm47CgogICAgd2hpbGUobm9kZSkKICAgIHsKICAgICAgICBwcmludGYoIiVkOiAiLGkpOwogICAgICAgIGxpc3QtPnByaW50KG5vZGUtPmRhdGEpOwogICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwogICAgICAgIGkrKzsKICAgIH0KICAgIHJldHVybjsKfQ==