blob: 5eda359d6a3e3985c6a66126ac204d607d1b2c55 [file] [log] [blame] [edit]
/*
* dlist_test.c
*
* Copyright (C) 2003 Eric J Bohm
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
/* Double linked list implementation tester.
*/
#include "dlist.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// create some dlists put nodes in and out
// use dump
// try list with del_func and without
// use insert, unshift, push
// use pop push mark
// use prev next
typedef struct simple {
char label[80];
int number;
} Simple;
typedef struct complex {
int cnumber;
Simple *sthing;
} Complex;
void complex_silly_multiply_by_two( void *a);
int complex_equal(void *a, void *b);
int complex_less(void *a, void *b);
int complex_greater(void *a, void *b);
int complex_comp(void *a, void *b);
void simple_dump(Dlist *);
void simple_dump_rev(Dlist *);
void complex_dump(Dlist *);
void complex_dump_rev(Dlist *);
void complex_out(void *);
void complex_del(void *);
Complex *complex_maker(int,int,char *);
int complex_filter(void *a);
Simple *simple_maker(int ,char *);
int main (void)
{
Dlist *list;
Simple *s1,*s2,*s3,*stemp;
Complex *c1,*c2,*c3, *c4, *ctemp, *cfound;
while(1)
{
s1=simple_maker(1,"one");
s2=simple_maker(2,"two");
s3=simple_maker(3,"three");
if((list=dlist_new(sizeof(Simple)))==NULL)
{
fprintf(stderr,"ERR dlist_new fail\n");
return(2);
}
dlist_push(list,s1);
dlist_push(list,s2);
dlist_push(list,s3);
printf("count is %ld\n",list->count);
simple_dump(list);
simple_dump_rev(list);
stemp=dlist_pop(list);
printf("popped %s\n",stemp->label);
simple_dump(list);
printf("pushed\n");
dlist_push(list,s3);
simple_dump(list);
stemp=dlist_shift(list);
printf("shifted %s\n",stemp->label);
simple_dump(list);
printf("unshifted\n");
dlist_unshift(list,stemp);
simple_dump(list);
dlist_destroy(list);
c1=complex_maker(1,1,"one");
c2=complex_maker(2,2,"two");
c3=complex_maker(3,3,"three");
if((list=dlist_new_with_delete(sizeof(Complex),complex_del))==NULL)
{
fprintf(stderr,"ERR dlist_new fail\n");
return(2);
}
if(dlist_insert_sorted(list,c1,complex_less)==NULL)
{
fprintf(stderr,"ERR dlist_insert fail\n");
return(2);
}
printf("sorted insert 1\n");
if(dlist_insert_sorted(list,c3,complex_less)==NULL)
{
fprintf(stderr,"ERR dlist_insert fail\n");
return(2);
}
if(dlist_insert_sorted(list,c2,complex_less)==NULL)
{
fprintf(stderr,"ERR dlist_insert fail\n");
return(2);
}
printf("sorted insert 2\n");
printf("ascending sorted output\n");
complex_dump(list);
dlist_transform(list,complex_silly_multiply_by_two);
printf("transform multi by 2 output\n");
complex_dump(list);
ctemp=complex_maker(6,6,"three");
if((cfound=(Complex *) dlist_find_custom(list,ctemp,complex_equal))!=NULL)
{
printf("found %d as %d in list\n",ctemp->cnumber,cfound->cnumber);
} else {
printf("ERROR find failed on %d \n",ctemp->cnumber);
return(3);
}
complex_del(ctemp);
dlist_destroy(list);
c1=complex_maker(1,1,"one");
c2=complex_maker(2,2,"two");
c3=complex_maker(3,3,"three");
if((list=dlist_new_with_delete(sizeof(Complex),complex_del))==NULL)
{
fprintf(stderr,"ERR dlist_new fail\n");
return(2);
}
if(dlist_insert_sorted(list,c1,complex_greater)==NULL)
{
fprintf(stderr,"ERR dlist_insert fail\n");
return(2);
}
printf("greater sorted insert 1\n");
if(dlist_insert_sorted(list,c3,complex_greater)==NULL)
{
fprintf(stderr,"ERR dlist_insert fail\n");
return(2);
}
printf("greater sorted insert 3\n");
if(dlist_insert_sorted(list,c2,complex_greater)==NULL)
{
fprintf(stderr,"ERR dlist_insert fail\n");
return(2);
}
printf("greater sorted insert 2\n");
printf("descending sorted output using transform\n");
dlist_transform(list,complex_out);
dlist_destroy(list);
c1=complex_maker(1,1,"one");
c2=complex_maker(2,2,"two");
c3=complex_maker(3,3,"three");
c4=complex_maker(4,4,"four");
if((list=dlist_new_with_delete(sizeof(Complex),complex_del))==NULL)
{
fprintf(stderr,"ERR dlist_new fail\n");
return(2);
}
dlist_push(list,c2);
dlist_push(list,c1);
dlist_push(list,c4);
dlist_push(list,c3);
printf("unsorted custom\n");
complex_dump(list);
printf("unsorted custom reversed\n");
complex_dump_rev(list);
dlist_sort_custom(list,complex_comp);
printf("custom sorted output\n");
complex_dump(list);
dlist_filter_sort(list, complex_filter, complex_comp);
printf("custom filtered and sorted output\n");
complex_dump(list);
dlist_destroy(list);
}
return(0);
}
void simple_dump (Dlist *list)
{
Simple *thisone;
printf("count %ld \n",list->count);
dlist_for_each_data(list,thisone,Simple)
{
printf("label %s number %d \n",thisone->label,thisone->number);
}
}
void simple_dump_rev (Dlist *list)
{
Simple *thisone;
printf("rev count %ld \n",list->count);
dlist_for_each_data_rev(list,thisone,Simple)
{
printf("label %s number %d \n",thisone->label,thisone->number);
}
}
Simple * simple_maker(int snumber,char *label)
{
Simple *stemp;
if((stemp=malloc(sizeof(Simple)))==NULL)
{
fprintf(stderr,"ERR malloc fail\n");
return(NULL);
}
stemp->number=snumber;
strcpy(stemp->label,label);
return(stemp);
}
Complex * complex_maker(int cnumber, int snumber, char* label)
{
Complex *ctemp;
if((ctemp=malloc(sizeof(Complex)))==NULL)
{
fprintf(stderr,"ERR malloc fail\n");
return(NULL);
}
ctemp->cnumber=cnumber;
ctemp->sthing=simple_maker(snumber,label);
return(ctemp);
}
void complex_out(void *data)
{
Complex *thisone=(Complex *)data;
printf("cnumber %d label %s number %d \n",thisone->cnumber,thisone->sthing->label,thisone->sthing->number);
}
/**
* return 1 if a==b, else 0
*/
int complex_equal(void *a, void *b)
{
if((((Complex *)a)->cnumber==((Complex *)b)->cnumber)
&& (((Complex *)a)->sthing->number==
((Complex *)b)->sthing->number)
&& strcmp(((Complex *)a)->sthing->label,
((Complex *)b)->sthing->label)==0)
return(1);
return(0);
}
/** for sorting
* return 1 if a<b, else 0
*/
int complex_less(void *a, void *b)
{
return( ((Complex *)a)->cnumber < ((Complex *)b)->cnumber );
}
/** for sorting
* return 1 if a>b, else 0
*/
int complex_greater(void *a, void *b)
{
return( ((Complex *)a)->cnumber > ((Complex *)b)->cnumber );
}
int complex_comp(void *a, void *b)
{
return( ((Complex *)a)->cnumber - ((Complex *)b)->cnumber );
}
void complex_silly_multiply_by_two( void *a)
{
((Complex *)a)->cnumber=((Complex *)a)->cnumber*2;
((Complex *)a)->sthing->number=((Complex *)a)->sthing->number*2;
}
void complex_dump (Dlist *list)
{
Complex *thisone;
dlist_start(list);
printf("count %ld \n",list->count);
dlist_for_each_data(list,thisone,Complex)
{
printf("cnumber %d label %s number %d \n",thisone->cnumber,thisone->sthing->label,thisone->sthing->number);
}
}
void complex_dump_rev (Dlist *list)
{
Complex *thisone;
dlist_start(list);
printf("count %ld \n",list->count);
dlist_for_each_data_rev(list,thisone,Complex)
{
printf("cnumber %d label %s number %d \n",thisone->cnumber,thisone->sthing->label,thisone->sthing->number);
}
}
void complex_del (void *item)
{
Complex *corpse=item;
printf("freeing complex\n");
free(corpse->sthing);
free(corpse);
}
int complex_filter(void *a)
{
Complex *c = (Complex *)a;
if (c->cnumber >= 2 && c->cnumber <= 3)
return 1;
else
return 0;
}