#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "chain.h"
#include "filedb.h"
#ifdef DEBUG
void dump_list(element *filechain)
{
element *e;
int i=0;
e=head(filechain);
while (e->next!=NULL)
{
i++;
e=e->next;
printf("Chaindump[%d] : %s\n", i, ((fileent *)e->cur)->name);
}
}
#endif
int strcomp(char *s1, char *s2)
{
int i,r;
r=0;
i=strlen(s1);
i=strlen(s2)<i?strlen(s2):i;
while ((*s1==*s2) && (i>0))
{
s1++;
s2++;
i--;
}
if (*s1>*s2)
r=1;
else
if (*s2>*s1)
r=-1;
return(r);
}
void addfile(char *s, element *filechain)
{
int i;
element *e=head(filechain);
fileent ent;
struct stat buf;
if (stat(s, &buf)==0)
{
ent.name=(char *)strdup(s);
ent.mtime=buf.st_mtime;
ent.size=buf.st_size;
ent.wasmod=1;
while (e->next!=NULL)
{
i=strcomp(((fileent *)e->next->cur)->name,s);
if ((i>0))
{
break;
}
e=e->next;
}
filechain=addelement(&ent,sizeof(ent),e);
#ifdef DEBUG
printf("Seems i have added successfully %s\n", s);
dump_list(e);
#endif
} else
{
#ifdef DEBUG
printf("Could'nt stat %s !\n");
#endif
}
}
element *findfile(char *s, element *filechain)
{
element *r=head(filechain);
int i;
#ifdef DEBUG
printf("findfile called!!!\n");
#endif
while (r->next!=NULL)
{
r=r->next;
if (r->cur!=NULL)
{
i=strcomp(((fileent *)r->cur)->name,s);
#ifdef DEBUG
printf("comparing '%s' and '%s'... i=%d\n", ((fileent *)r->cur)->name,s, i);
#endif
if (i>=0)
break;
}
}
#ifdef DEBUG
printf("finished!!!\n");
#endif
return(i==0?r:NULL);
}
element *removefile(element *e, element *filechain)
{
free(((fileent *)e->cur)->name);
filechain=unchain(e);
return(filechain);
}
element *scanchain(element *filechain)
{
element *e=head(filechain);
fileent *f=NULL;
struct stat buf;
while (e->next!=NULL)
{
if (e->cur!=NULL)
{
f=(fileent *)e->cur;
if (stat(f->name, &buf)!=0)
{
#ifdef DEBUG
printf("File '%s' ceased to exit.. RIP\n", f->name);
#endif
e=head(unchain(e));
}
}
e=e->next;
}
return(e);
}
void killfilechain(element *c)
{
c=head(c);
while (c->next!=NULL)
{
if (c!=NULL)
{
if (c->cur!=NULL)
free(((fileent *)c->cur)->name);
// free(c->cur);
}
c=unchain(c);
}
}
int checkfile(char *s, int run, element *filechain)
{
int r;
struct stat buf;
element *e=findfile(s, filechain);
fileent *fe;
fe=(e!=NULL)?((fileent *)e->cur):NULL;
#ifdef DEBUG
printf("checkfile(s='%s', run=%d, filechain) called..\n", s, run);
#endif
if (stat(s, &buf)==0)
{
if (e!=NULL)
{
fe->lastrun=run;
if (buf.st_mtime>fe->mtime)
{
r=1;
fe->mtime=buf.st_mtime;
fe->size=buf.st_size;
fe->wasmod=1;
}
else
{
if (fe->wasmod==1)
{
r=2;
} else
{
r=0;
}
fe->wasmod=0;
}
} else
{
r=-1;
#ifdef DEBUG
printf("calling addfile('%s', filechain)...\n", s);
#endif
addfile(s, filechain);
}
} else
{
r=-2;
removefile(e, filechain);
}
#ifdef DEBUG
printf("returned %d\n", r);
#endif
return(r);
}
syntax highlighted by Code2HTML, v. 0.9.1