#include <stdio.h>
#include <malloc.h>
struct node{
int val;
struct node * next;
} ;
void insertend( ) ;
void insertbef( ) ;
void insertaft( ) ;
void insertfir( ) ;
void delend( ) ;
void delbef( ) ;
void delaft( ) ;
void delfir( ) ;
void display( ) ;
typedef struct node snode;
snode * newnode,* prev,* ptr,* temp;
snode * first= NULL,* last= NULL;
int main( void ) {
int ch;
char ans = 'Y' ;
while ( ans == 'Y' || ans == 'y' )
{
printf ( "\n ---------------------------------\n " ) ; printf ( "\n Operations on singly linked list\n " ) ; printf ( "\n ---------------------------------\n " ) ; printf ( "\n 1.Insert node at first" ) ; printf ( "\n 2.Insert node at last" ) ; printf ( "\n 3.Insert node before element" ) ; printf ( "\n 4.Insert node after element" ) ; printf ( "\n 5.Delete Node at first" ) ; printf ( "\n 6.Delete Node at last" ) ; printf ( "\n 7.Delete Node before any Position" ) ; printf ( "\n 8.Delete Node after any Position" ) ; printf ( "\n 9.Display List from Beginning to end" ) ; printf ( "\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n " ) ; printf ( "\n Enter your choice" ) ;
switch ( ch)
{
case 1 :
printf ( "\n ...Inserting node at first...\n " ) ; insertfir( ) ;
break ;
case 2 :
printf ( "\n ...Inserting node at last...\n " ) ; insertend( ) ;
break ;
case 3 :
printf ( "\n ...Inserting node before any position...\n " ) ; insertbef( ) ;
break ;
case 4 :
printf ( "\n ...Inserting node after any position...\n " ) ; insertaft( ) ;
break ;
case 5 :
printf ( "\n ...Deleting Node from first Position...\n " ) ; delfir( ) ;
break ;
case 6 :
printf ( "\n ...Deleting Node from last Position...\n " ) ; delend( ) ;
break ;
case 7 :
printf ( "\n ...Deleting Node before any Position...\n " ) ; delbef( ) ;
break ;
case 8 :
printf ( "\n ...Deleting Node after any Position...\n " ) ; delaft( ) ;
break ;
case 9 :
printf ( "\n ...Displaying List From Beginning to End...\n " ) ; display( ) ;
break ;
case 10 :
return 0 ;
break ;
default :
printf ( "\n ...Invalid Choice...\n " ) ; break ;
}
printf ( "\n YOU WANT TO CONTINUE (Y/N)" ) ; }
return 0 ;
}
snode * create_node( int value)
{
newnode
= ( snode
* ) malloc ( sizeof ( snode
) ) ; if ( newnode== NULL)
{
printf ( "\n Memory is not allocated" ) ; return 0 ;
}
else
{
newnode-> val= value;
newnode-> next= NULL;
return newnode;
}
}
void insertfir( )
{
int value;
printf ( "\n Enter the element you want to enter at first" ) ; newnode= create_node( value) ;
if ( first== last && last== NULL ) {
first= last= newnode;
first-> next= first;
last-> next= first;
}
else
{
temp= first;
newnode-> next= temp;
first= newnode;
last-> next= first;
}
}
void insertend( )
{
int value;
printf ( "\n Enter the element you want to enter at End" ) ; newnode= create_node( value) ;
if ( first== last && last== NULL ) {
first= last= newnode;
first-> next= first;
last-> next= first;
}
else
{
last-> next= newnode;
last= newnode;
last-> next= first;
}
}
void insertbef( )
{
int value, pos;
printf ( "\n Enter the element you want to enter" ) ; printf ( "\n Enter the element before which you want to enter" ) ; newnode= create_node( value) ;
int a= 0 ;
ptr= first;
while ( ptr!= NULL)
{
if ( ptr-> val== pos)
{
a= 1 ;
break ;
}
ptr= ptr-> next;
}
if ( a== 0 )
{
return ;
}
if ( first-> val== pos)
{
newnode-> next= first;
first= newnode;
last-> next= first;
}
else
{
ptr= first;
while ( ptr-> next-> val!= pos)
{
ptr= ptr-> next;
}
newnode-> next= ptr-> next;
ptr-> next= newnode;
}
}
void insertaft( )
{
int value, pos;
printf ( "\n Enter the element you want to enter" ) ; printf ( "\n Enter the element after which you want to enter" ) ; newnode= create_node( value) ;
int a= 0 ;
ptr= first;
while ( ptr!= NULL)
{
if ( ptr-> val== pos)
{
a= 1 ;
break ;
}
ptr= ptr-> next;
}
if ( a== 0 )
{
return ;
}
ptr= first;
while ( ptr-> val!= pos)
{
ptr= ptr-> next;
}
if ( ptr== last)
{
newnode-> next= ptr-> next;
ptr-> next= newnode;
last= newnode;
}
else
{
newnode-> next= ptr-> next;
ptr-> next= newnode;
}
}
void display( )
{
if ( first == NULL)
{
printf ( ":No nodes in the list to display\n " ) ; }
else
{
for ( ptr = first; ptr-> next != first; ptr = ptr-> next)
{
}
}
}
void delend( )
{
if ( first== last)
{
if ( last== NULL)
{
printf ( "There is no element" ) ; }
else
{
first= last= NULL;
first-> next= NULL;
last-> next= NULL;
}
}
else
{
ptr= first;
while ( ptr-> next!= last)
{
ptr= ptr-> next;
}
ptr-> next= first;
last= ptr;
}
}
void delfir( )
{
if ( first== last)
{
if ( first== NULL)
{
printf ( "There is no element" ) ; }
else
{
first= last= NULL;
first-> next= NULL;
last-> next= NULL;
}
}
else
{
last-> next= first-> next;
first= first-> next;
}
}
void delbef( )
{
int pos;
printf ( "\n Enter the element before which you want to delete" ) ; int a= 0 ;
ptr= first;
while ( ptr!= NULL)
{
if ( ptr-> val== pos)
{
a= 1 ;
break ;
}
ptr= ptr-> next;
}
if ( a== 0 )
{
return ;
}
if ( first-> val== pos)
{
printf ( "There is no element present before first " ) ; return ;
}
else if ( last-> val== pos && first-> next== last)
{
first= last;
first-> next= NULL;
}
else
{
ptr= first;
while ( ptr-> next-> val!= pos)
{
prev= ptr;
ptr= ptr-> next;
}
prev-> next= ptr-> next;
}
}
void delaft( )
{
int pos;
printf ( "\n Enter the element after which you want to delete" ) ; int a= 0 ;
ptr= first;
while ( ptr!= NULL)
{
if ( ptr-> val== pos)
{
a= 1 ;
break ;
}
ptr= ptr-> next;
}
if ( a== 0 )
{
return ;
}
ptr= first;
while ( ptr-> val!= pos)
{
ptr= ptr-> next;
}
if ( ptr-> next== first)
{
printf ( "There is no element behind last" ) ; return ;
}
else
{
if ( ptr-> next== last)
{
ptr-> next= first;
last= ptr;
}
else
{
ptr-> next= ptr-> next-> next;
}
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KCnN0cnVjdCBub2RlewoJaW50IHZhbDsKCXN0cnVjdCBub2RlICpuZXh0Owp9OwoKdm9pZCBpbnNlcnRlbmQoKTsKdm9pZCBpbnNlcnRiZWYoKTsKdm9pZCBpbnNlcnRhZnQoKTsKdm9pZCBpbnNlcnRmaXIoKTsKdm9pZCBkZWxlbmQoKTsKdm9pZCBkZWxiZWYoKTsKdm9pZCBkZWxhZnQoKTsKdm9pZCBkZWxmaXIoKTsKdm9pZCBkaXNwbGF5KCk7CnR5cGVkZWYgIHN0cnVjdCBub2RlIHNub2RlOwpzbm9kZSAqbmV3bm9kZSwqcHJldiwqcHRyLCp0ZW1wOwpzbm9kZSAqZmlyc3Q9TlVMTCwqbGFzdD1OVUxMOwoKCmludCBtYWluKHZvaWQpIHsKCWludCBjaDsKICAgIGNoYXIgYW5zID0gJ1knOwogCiAgICB3aGlsZSAoYW5zID09ICdZJ3x8YW5zID09ICd5JykKICAgIHsKICAgICAgICBwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgICAgICBwcmludGYoIlxuT3BlcmF0aW9ucyBvbiBzaW5nbHkgbGlua2VkIGxpc3RcbiIpOwogICAgICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogICAgICAgIHByaW50ZigiXG4xLkluc2VydCBub2RlIGF0IGZpcnN0Iik7CiAgICAgICAgcHJpbnRmKCJcbjIuSW5zZXJ0IG5vZGUgYXQgbGFzdCIpOwogICAgICAgIHByaW50ZigiXG4zLkluc2VydCBub2RlIGJlZm9yZSBlbGVtZW50Iik7CiAgICAgICAgcHJpbnRmKCJcbjQuSW5zZXJ0IG5vZGUgYWZ0ZXIgZWxlbWVudCIpOwogICAgICAgIHByaW50ZigiXG41LkRlbGV0ZSBOb2RlIGF0IGZpcnN0Iik7CiAgICAgICAgcHJpbnRmKCJcbjYuRGVsZXRlIE5vZGUgYXQgbGFzdCIpOwogICAgICAgIHByaW50ZigiXG43LkRlbGV0ZSBOb2RlIGJlZm9yZSBhbnkgUG9zaXRpb24iKTsKICAgICAgICBwcmludGYoIlxuOC5EZWxldGUgTm9kZSBhZnRlciBhbnkgUG9zaXRpb24iKTsKICAgICAgICBwcmludGYoIlxuOS5EaXNwbGF5IExpc3QgZnJvbSBCZWdpbm5pbmcgdG8gZW5kIik7CiAgICAgICAgcHJpbnRmKCJcbjEwLkV4aXRcbiIpOwogICAgICAgIHByaW50ZigiXG5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+flxuIik7CiAgICAgICAgcHJpbnRmKCJcbkVudGVyIHlvdXIgY2hvaWNlIik7CiAgICAgICAgc2NhbmYoIiVkIiwgJmNoKTsKIAogICAgICAgIHN3aXRjaCAoY2gpCiAgICAgICAgewogICAgICAgIGNhc2UgMTogCiAgICAgICAgICAgIHByaW50ZigiXG4uLi5JbnNlcnRpbmcgbm9kZSBhdCBmaXJzdC4uLlxuIik7CiAgICAgICAgICAgIGluc2VydGZpcigpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6IAogICAgICAgICAgICBwcmludGYoIlxuLi4uSW5zZXJ0aW5nIG5vZGUgYXQgbGFzdC4uLlxuIik7CiAgICAgICAgICAgIGluc2VydGVuZCgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6IAogICAgICAgICAgICBwcmludGYoIlxuLi4uSW5zZXJ0aW5nIG5vZGUgYmVmb3JlIGFueSBwb3NpdGlvbi4uLlxuIik7CiAgICAgICAgICAgIGluc2VydGJlZigpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6IAogICAgICAgICAgICBwcmludGYoIlxuLi4uSW5zZXJ0aW5nIG5vZGUgYWZ0ZXIgYW55IHBvc2l0aW9uLi4uXG4iKTsKICAgICAgICAgICAgaW5zZXJ0YWZ0KCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNTogCiAgICAgICAgICAgIHByaW50ZigiXG4uLi5EZWxldGluZyBOb2RlIGZyb20gZmlyc3QgUG9zaXRpb24uLi5cbiIpOwogICAgICAgICAgICBkZWxmaXIoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OiAKICAgICAgICAgICAgcHJpbnRmKCJcbi4uLkRlbGV0aW5nIE5vZGUgZnJvbSBsYXN0IFBvc2l0aW9uLi4uXG4iKTsKICAgICAgICAgICAgZGVsZW5kKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzogCiAgICAgICAgICAgIHByaW50ZigiXG4uLi5EZWxldGluZyBOb2RlIGJlZm9yZSBhbnkgUG9zaXRpb24uLi5cbiIpOwogICAgICAgICAgICBkZWxiZWYoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA4OiAKICAgICAgICAgICAgcHJpbnRmKCJcbi4uLkRlbGV0aW5nIE5vZGUgYWZ0ZXIgYW55IFBvc2l0aW9uLi4uXG4iKTsKICAgICAgICAgICAgZGVsYWZ0KCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgOTogCiAgICAgICAgICAgIHByaW50ZigiXG4uLi5EaXNwbGF5aW5nIExpc3QgRnJvbSBCZWdpbm5pbmcgdG8gRW5kLi4uXG4iKTsKICAgICAgICAgICAgZGlzcGxheSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDEwOiAKICAgICAgICAgICAgcHJpbnRmKCJcbi4uLkV4aXRpbmcuLi5cbiIpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogCiAgICAgICAgICAgIHByaW50ZigiXG4uLi5JbnZhbGlkIENob2ljZS4uLlxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuWU9VIFdBTlQgVE8gQ09OVElOVUUgKFkvTikiKTsKICAgICAgICBzY2FuZigiICVjIiwgJmFucyk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc25vZGUgKmNyZWF0ZV9ub2RlKGludCB2YWx1ZSkKewoJbmV3bm9kZT0oc25vZGUqKW1hbGxvYyhzaXplb2Yoc25vZGUpKTsKCWlmIChuZXdub2RlPT1OVUxMKQoJewoJCXByaW50ZigiXG5NZW1vcnkgaXMgbm90IGFsbG9jYXRlZCIpOwoJCXJldHVybiAwOwoJfQoKCWVsc2UKCXsKCQluZXdub2RlLT52YWw9dmFsdWU7CgkJbmV3bm9kZS0+bmV4dD1OVUxMOwoJCXJldHVybiBuZXdub2RlOwoJfQp9Cgp2b2lkIGluc2VydGZpcigpCnsKCWludCB2YWx1ZTsKCXByaW50ZigiXG5FbnRlciB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byBlbnRlciBhdCBmaXJzdCIpOwoJc2NhbmYoIiVkIiwmdmFsdWUpOwoJbmV3bm9kZT1jcmVhdGVfbm9kZSh2YWx1ZSk7CglpZihmaXJzdD09bGFzdCAmJiBsYXN0PT1OVUxMICl7CgkJZmlyc3Q9bGFzdD1uZXdub2RlOwoJCWZpcnN0LT5uZXh0PWZpcnN0OwoJCWxhc3QtPm5leHQ9Zmlyc3Q7Cgl9CgllbHNlCgl7CgkJdGVtcD1maXJzdDsKCQluZXdub2RlLT5uZXh0PXRlbXA7CgkJZmlyc3Q9bmV3bm9kZTsKCQlsYXN0LT5uZXh0PWZpcnN0OwoJfQoJCn0KCnZvaWQgaW5zZXJ0ZW5kKCkKewoJaW50IHZhbHVlOwoJcHJpbnRmKCJcbkVudGVyIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIGVudGVyIGF0IEVuZCIpOwoJc2NhbmYoIiVkIiwmdmFsdWUpOwoJbmV3bm9kZT1jcmVhdGVfbm9kZSh2YWx1ZSk7CglpZihmaXJzdD09bGFzdCAmJiBsYXN0PT1OVUxMICl7CgkJZmlyc3Q9bGFzdD1uZXdub2RlOwoJCWZpcnN0LT5uZXh0PWZpcnN0OwoJCWxhc3QtPm5leHQ9Zmlyc3Q7Cgl9CgllbHNlCgl7CgkJbGFzdC0+bmV4dD1uZXdub2RlOwoJCWxhc3Q9bmV3bm9kZTsKCQlsYXN0LT5uZXh0PWZpcnN0OwoJfQoJCn0KCnZvaWQgaW5zZXJ0YmVmKCkKewoJCglpbnQgdmFsdWUscG9zOwoJcHJpbnRmKCJcbkVudGVyIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIGVudGVyIik7CglzY2FuZigiJWQiLCZ2YWx1ZSk7CglwcmludGYoIlxuRW50ZXIgdGhlIGVsZW1lbnQgYmVmb3JlIHdoaWNoIHlvdSB3YW50IHRvIGVudGVyIik7CglzY2FuZigiJWQiLCZwb3MpOwoJbmV3bm9kZT1jcmVhdGVfbm9kZSh2YWx1ZSk7CglpbnQgYT0wOwoJcHRyPWZpcnN0OwoJd2hpbGUocHRyIT1OVUxMKQoJewoJCWlmIChwdHItPnZhbD09cG9zKQoJCXsKCQkJYT0xOwoJCQlicmVhazsKCQl9CgkJcHRyPXB0ci0+bmV4dDsKCX0KCWlmKGE9PTApCgl7CgkJcHJpbnRmKCJFbGVtZW50IG5vdCBmb3VuZCIpOwoJCXJldHVybjsKCX0KCWlmKGZpcnN0LT52YWw9PXBvcykKCXsKCQluZXdub2RlLT5uZXh0PWZpcnN0OwoJCWZpcnN0PW5ld25vZGU7CgkJbGFzdC0+bmV4dD1maXJzdDsKCX0KCWVsc2UKCXsKCQlwdHI9Zmlyc3Q7CgkJd2hpbGUocHRyLT5uZXh0LT52YWwhPXBvcykKCQl7CgkJCXB0cj1wdHItPm5leHQ7CgkJfQoJCW5ld25vZGUtPm5leHQ9cHRyLT5uZXh0OwoJCXB0ci0+bmV4dD1uZXdub2RlOwoJfQp9CnZvaWQgaW5zZXJ0YWZ0KCkKewoJCglpbnQgdmFsdWUscG9zOwoJcHJpbnRmKCJcbkVudGVyIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIGVudGVyIik7CglzY2FuZigiJWQiLCZ2YWx1ZSk7CglwcmludGYoIlxuRW50ZXIgdGhlIGVsZW1lbnQgYWZ0ZXIgd2hpY2ggeW91IHdhbnQgdG8gZW50ZXIiKTsKCXNjYW5mKCIlZCIsJnBvcyk7CgluZXdub2RlPWNyZWF0ZV9ub2RlKHZhbHVlKTsKCWludCBhPTA7CglwdHI9Zmlyc3Q7Cgl3aGlsZShwdHIhPU5VTEwpCgl7CgkJaWYgKHB0ci0+dmFsPT1wb3MpCgkJewoJCQlhPTE7CgkJCWJyZWFrOwoJCX0KCQlwdHI9cHRyLT5uZXh0OwoJfQoJaWYoYT09MCkKCXsKCQlwcmludGYoIkVsZW1lbnQgbm90IGZvdW5kIik7CgkJcmV0dXJuOwoJfQoJcHRyPWZpcnN0OwoJd2hpbGUocHRyLT52YWwhPXBvcykKCXsKCQlwdHI9cHRyLT5uZXh0OwoJfQoJaWYocHRyPT1sYXN0KQoJewoJCW5ld25vZGUtPm5leHQ9cHRyLT5uZXh0OwoJCXB0ci0+bmV4dD1uZXdub2RlOwoJCWxhc3Q9bmV3bm9kZTsKCX0KCgllbHNlCgl7CgkJbmV3bm9kZS0+bmV4dD1wdHItPm5leHQ7CgkJcHRyLT5uZXh0PW5ld25vZGU7Cgl9Cn0Kdm9pZCBkaXNwbGF5KCkKewogICAgaWYgKGZpcnN0ID09IE5VTEwpCiAgICB7CiAgICAgICAgcHJpbnRmKCI6Tm8gbm9kZXMgaW4gdGhlIGxpc3QgdG8gZGlzcGxheVxuIik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZm9yIChwdHIgPSBmaXJzdDtwdHItPm5leHQgIT0gZmlyc3Q7cHRyID0gcHRyLT5uZXh0KQogICAgICAgIHsgICAgCiAgICAgICAgICAgIHByaW50ZigiJWRcdCIsIHB0ci0+dmFsKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCIlZFx0IiwgcHRyLT52YWwpOwogICAgfQp9Cgp2b2lkIGRlbGVuZCgpCnsKCWlmKGZpcnN0PT1sYXN0KQoJewoJCWlmKGxhc3Q9PU5VTEwpCgkJewoJCQlwcmludGYoIlRoZXJlIGlzIG5vIGVsZW1lbnQiKTsKCQl9CgkJZWxzZQoJCXsKCQkJZmlyc3Q9bGFzdD1OVUxMOwoJCQlmaXJzdC0+bmV4dD1OVUxMOwoJCQlsYXN0LT5uZXh0PU5VTEw7CgkJfQoJfQoJZWxzZQoJewoJCXB0cj1maXJzdDsKCQl3aGlsZShwdHItPm5leHQhPWxhc3QpCgkJewoJCQlwdHI9cHRyLT5uZXh0OwoJCX0KCQlwdHItPm5leHQ9Zmlyc3Q7CgkJbGFzdD1wdHI7Cgl9Cn0Kdm9pZCBkZWxmaXIoKQp7CglpZihmaXJzdD09bGFzdCkKCXsKCQlpZihmaXJzdD09TlVMTCkKCQl7CgkJCXByaW50ZigiVGhlcmUgaXMgbm8gZWxlbWVudCIpOwoJCX0KCQllbHNlCgkJewoJCQlmaXJzdD1sYXN0PU5VTEw7CgkJCWZpcnN0LT5uZXh0PU5VTEw7CgkJCWxhc3QtPm5leHQ9TlVMTDsKCQl9Cgl9CgllbHNlCgl7CgkJbGFzdC0+bmV4dD1maXJzdC0+bmV4dDsKCQlmaXJzdD1maXJzdC0+bmV4dDsKCX0KfQp2b2lkIGRlbGJlZigpCnsKCWludCBwb3M7CglwcmludGYoIlxuRW50ZXIgdGhlIGVsZW1lbnQgYmVmb3JlIHdoaWNoIHlvdSB3YW50IHRvIGRlbGV0ZSIpOwoJc2NhbmYoIiVkIiwmcG9zKTsKCWludCBhPTA7CglwdHI9Zmlyc3Q7Cgl3aGlsZShwdHIhPU5VTEwpCgl7CgkJaWYgKHB0ci0+dmFsPT1wb3MpCgkJewoJCQlhPTE7CgkJCWJyZWFrOwoJCX0KCQlwdHI9cHRyLT5uZXh0OwoJfQoJaWYoYT09MCkKCXsKCQlwcmludGYoIkVsZW1lbnQgbm90IGZvdW5kIik7CgkJcmV0dXJuOwoJfQoJaWYoZmlyc3QtPnZhbD09cG9zKQoJewoJCXByaW50ZigiVGhlcmUgaXMgbm8gZWxlbWVudCBwcmVzZW50IGJlZm9yZSBmaXJzdCAiKTsKCQlyZXR1cm47Cgl9CgllbHNlIGlmKGxhc3QtPnZhbD09cG9zICYmIGZpcnN0LT5uZXh0PT1sYXN0KQoJewoJCWZpcnN0PWxhc3Q7CgkJZmlyc3QtPm5leHQ9TlVMTDsKCX0KCQoJZWxzZQoJewoJCXB0cj1maXJzdDsKCQl3aGlsZShwdHItPm5leHQtPnZhbCE9cG9zKQoJCXsKCQkJcHJldj1wdHI7CgkJCXB0cj1wdHItPm5leHQ7CgkJfQoJCXByZXYtPm5leHQ9cHRyLT5uZXh0OwoJfQoJCn0Kdm9pZCBkZWxhZnQoKQp7CglpbnQgcG9zOwoJcHJpbnRmKCJcbkVudGVyIHRoZSBlbGVtZW50IGFmdGVyIHdoaWNoIHlvdSB3YW50IHRvIGRlbGV0ZSIpOwoJc2NhbmYoIiVkIiwmcG9zKTsKCWludCBhPTA7CglwdHI9Zmlyc3Q7Cgl3aGlsZShwdHIhPU5VTEwpCgl7CgkJaWYgKHB0ci0+dmFsPT1wb3MpCgkJewoJCQlhPTE7CgkJCWJyZWFrOwoJCX0KCQlwdHI9cHRyLT5uZXh0OwoJfQoJaWYoYT09MCkKCXsKCQlwcmludGYoIkVsZW1lbnQgbm90IGZvdW5kIik7CgkJcmV0dXJuOwoJfQoJcHRyPWZpcnN0OwoJd2hpbGUocHRyLT52YWwhPXBvcykKCXsKCQlwdHI9cHRyLT5uZXh0OwoJfQoJaWYocHRyLT5uZXh0PT1maXJzdCkKCXsKCQlwcmludGYoIlRoZXJlIGlzIG5vIGVsZW1lbnQgYmVoaW5kIGxhc3QiKTsKCQlyZXR1cm47Cgl9CgllbHNlCgl7CgkJaWYocHRyLT5uZXh0PT1sYXN0KQoJCXsKCQkJcHRyLT5uZXh0PWZpcnN0OwoJCQlsYXN0PXB0cjsKCQl9CgkJZWxzZQoJCXsKCQkJcHRyLT5uZXh0PXB0ci0+bmV4dC0+bmV4dDsKCQl9Cgl9Cn0K