diff --git a/Makefile b/Makefile index 6e0e52d..f7b45d1 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,8 @@ OBJS_BASE = \ $(BUILDDIR)/util.o \ $(BUILDDIR)/crc.o \ $(BUILDDIR)/fileutil.o \ - $(BUILDDIR)/filenode.o + $(BUILDDIR)/filenode.o \ + $(BUILDDIR)/filenodecmp.o OBJS_APP = \ $(OBJS_BASE) \ $(BUILDDIR)/main.o @@ -49,6 +50,8 @@ $(BUILDDIR)/fileutil.o: fileutil.c $(HEADS) $(BUILDDIR)/filenode.o: filenode.c $(HEADS) $(DO_CC) +$(BUILDDIR)/filenodecmp.o: filenodecmp.c $(HEADS) + $(DO_CC) $(BUILDDIR)/main.o: main.c $(HEADS) diff --git a/NOTAS.txt b/NOTAS.txt index 95db6c7..21e3c82 100644 --- a/NOTAS.txt +++ b/NOTAS.txt @@ -1,7 +1,6 @@ POR HACER ========= -* Comparador de FileNodes que genere una lista de AccionFileCmp (filenodecmp.h) * Realizar las acciones especificadas por la lista de AccionFileCmp * Demonio * GUI @@ -17,3 +16,4 @@ HECHO * Representacion de arboles de directorios que contienen informacion de cada fichero; crc, fecha, estado (FileNode en filenode.h) * Scaneo, construccion y reconstruccion de arboles FileNode, detectando cambios. +* Comparador de FileNodes que genere una lista de AccionFileCmp (filenodecmp.h) diff --git a/filenode.c b/filenode.c index 9b32f42..03010cd 100644 --- a/filenode.c +++ b/filenode.c @@ -96,6 +96,7 @@ char *FileNode_GetPath(FileNode *fn,char *path){ strcat(pathptr,"/"); } strcat(pathptr,fn->name); + return temppath; } @@ -275,13 +276,7 @@ FileNode *FileNode_Load(char *fichero){ } - - - -void FileNode_Print(FileNode *fn){ - FileNode *padre; - - // Nombre +void FileNode_PrintNode(FileNode *fn){ printf(FileNode_GetPath(fn,NULL)); if(fn->flags&FileFlag_Normal){ printf(" File"); @@ -300,7 +295,7 @@ void FileNode_Print(FileNode *fn){ } printf("\n"); -/* + // Tamanho if(fn->flags&FileFlag_TieneTamanho){ printf("\\-Tamanho: %lld\n",fn->size); @@ -315,14 +310,27 @@ void FileNode_Print(FileNode *fn){ if(fn->flags&FileFlag_TieneCRC){ printf("\\-CRC : [%08X]\n",fn->crc); } -*/ - // Hijos - if(fn->flags&FileFlag_Directorio){ - FileNode *fn2; - fn2=fn->child; - while(fn2){ - FileNode_Print(fn2); - fn2=fn2->sig; + +} + + +void FileNode_Print(FileNode *fn){ + FileNode *fnAux=fn; + + while(fnAux!=NULL){ + + FileNode_PrintNode(fnAux); + + if(fnAux->child){ + fnAux=fnAux->child; + }else{ + if(fnAux->sig==NULL){ + fnAux=fnAux->padre; + if(fnAux==fn){ + break; + } + } + fnAux=fnAux->sig; } } } diff --git a/filenode.h b/filenode.h index b85f3a0..f4eb555 100644 --- a/filenode.h +++ b/filenode.h @@ -51,6 +51,7 @@ void FileNode_GetCRC(FileNode *fn,char *file); void FileNode_Save(FileNode *fn,char *fichero); FileNode *FileNode_Load(char *fichero); +void FileNode_PrintNode(FileNode *fn); void FileNode_Print(FileNode *fn); diff --git a/filenodecmp.c b/filenodecmp.c index 461a4f2..cdf99f9 100644 --- a/filenodecmp.c +++ b/filenodecmp.c @@ -12,14 +12,218 @@ AccionFileNode *_free_accionfilenode=NULL; int _n_accionfilenode=0; #define AccionFileNode_Tocho 1024 AccionFileNode *AccionFileNode_Crear(){ + AccionFileNode *afn; + if(_free_accionfilenode==NULL){ + AccionFileNode *nodos; + int i; + // Reservar un tocho + nodos=malloc(sizeof(AccionFileNode)*AccionFileNode_Tocho); + for(i=0;isig; + _n_accionfilenode++; + + // Iniciar + afn->accion=AccionFileCmp_Nada; + afn->izquierda=NULL; + afn->derecha=NULL; + afn->sig=NULL; + + return(afn); } void AccionFileNode_Destruir(AccionFileNode *afn){ + afn->sig=_free_accionfilenode; + _free_accionfilenode=afn; + _n_accionfilenode--; +} + + +void AccionFileNode_CompareChilds( + AccionFileNode *afnRaiz, + AccionFileNode **afnCola); + + +void AccionFileNode_CheckPair( + FileNode *fnIzq,FileNode *fnDer,AccionFileNode **afnCola) +{ + AccionFileNode *afnNew; + afnNew=AccionFileNode_Crear(); + afnNew->izquierda=fnIzq; + afnNew->derecha=fnDer; + int doChilds=0; + + if(!fnIzq && !fnDer){ + AccionFileNode_Destruir(afnNew); + return; + } + if(!fnIzq && fnDer){ + afnNew->accion=AccionFileCmp_DerechaAIzquierda; + if(fnDer->child){ + doChilds=1; + } + } + if(fnIzq && !fnDer){ + afnNew->accion=AccionFileCmp_IzquierdaADerecha; + if(fnIzq->child){ + doChilds=1; + } + } + if(fnIzq && fnDer){ + // Realizar comparacion completa + if(fnIzq->child){ + doChilds=1; + } + if(fnIzq->child){ + doChilds=1; + } + + // Comparacion mediante fechas + if(fnIzq->ft==fnDer->ft){ + afnNew->accion=AccionFileCmp_Nada; + }else + if(fnIzq->ftft){ + afnNew->accion=AccionFileCmp_DerechaAIzquierda; + }else + if(fnIzq->ft>fnDer->ft){ + afnNew->accion=AccionFileCmp_IzquierdaADerecha; + } + } + + // Anhadir a la lista de acciones + (*afnCola)->sig=afnNew; + (*afnCola)=afnNew; + + if(doChilds){ + AccionFileNode_CompareChilds(afnNew,afnCola); + } +} + + +void AccionFileNode_CompareChilds( + AccionFileNode *afnRaiz, + AccionFileNode **afnCola) +{ + FileNode *fnIzq,*fnDer; + AccionFileNode *afnColaStart=(*afnCola); + + // Comprobar si hay algo que comparar + if(!afnRaiz->izquierda || !afnRaiz->derecha){ + // Nada que hacer + return; + } + + // Iterar todos los nodos de la izquierda + fnIzq=afnRaiz->izquierda->child; + while(fnIzq){ + fnDer=afnRaiz->derecha->child; + while(fnDer){ + if(!strcmp(fnIzq->name,fnDer->name)){ + break; + }else{ + fnDer=fnDer->sig; + } + } + + AccionFileNode_CheckPair(fnIzq,fnDer,afnCola); + + fnIzq=fnIzq->sig; + } + + + // Iterar todos los nodos de la derecha, + // ignorando las comparaciones ya realizadas + fnDer=afnRaiz->derecha->child; + while(fnDer){ + int doCheck=1; + fnIzq=afnRaiz->izquierda->child; + while(fnIzq){ + AccionFileNode *afnCheck=afnColaStart; + while(afnCheck){ + if(afnCheck->izquierda==fnIzq && afnCheck->derecha==fnDer){ + break; + }else{ + afnCheck=afnCheck->sig; + } + } + if(afnCheck){ + doCheck=0; + break; + } + + if(!strcmp(fnIzq->name,fnDer->name)){ + break; + }else{ + fnIzq=fnIzq->sig; + } + } + + if(doCheck){ + AccionFileNode_CheckPair(fnIzq,fnDer,afnCola); + } + + fnDer=fnDer->sig; + } } -AccionFileNode *AccionFileNode_Build(FileNode *izquierda,FileNode *derecha){ +AccionFileNode *AccionFileNode_Build( + FileNode *izquierda,FileNode *derecha) +{ + AccionFileNode *afnRaiz=AccionFileNode_Crear(); + AccionFileNode *afnCola=afnRaiz; + afnRaiz->izquierda=izquierda; + afnRaiz->derecha=derecha; + + AccionFileNode_CompareChilds(afnRaiz,&afnCola); + + return afnRaiz; +} + + + +void AccionFileNode_Print(AccionFileNode *afn){ + char pathIzq[4096],pathDer[4096]; + while(afn!=NULL){ + if(afn->izquierda){ + FileNode_GetPath(afn->izquierda,pathIzq); + }else{ + strcpy(pathIzq,"(null)"); + } + if(afn->derecha){ + FileNode_GetPath(afn->derecha,pathDer); + }else{ + strcpy(pathDer,"(null)"); + } + + switch(afn->accion){ + case AccionFileCmp_Nada: + //printf("%s == %s\n",pathIzq,pathDer); + break; + case AccionFileCmp_IzquierdaADerecha: + printf("%s => %s\n",pathIzq,pathDer);break; + case AccionFileCmp_DerechaAIzquierda: + printf("%s <= %s\n",pathIzq,pathDer);break; + case AccionFileCmp_BorrarIzquierda: + printf("%s *- %s\n",pathIzq,pathDer);break; + case AccionFileCmp_BorrarDerecha: + printf("%s -* %s\n",pathIzq,pathDer);break; + case AccionFileCmp_FechaIzquierdaADerecha: + printf("%s -> %s\n",pathIzq,pathDer);break; + case AccionFileCmp_FechaDerechaAIzquierda: + printf("%s <- %s\n",pathIzq,pathDer);break; + } + + afn=afn->sig; + } } diff --git a/filenodecmp.h b/filenodecmp.h index cd2a4df..1affb2e 100644 --- a/filenodecmp.h +++ b/filenodecmp.h @@ -1,5 +1,5 @@ -#ifndef _FILENODE_H_ -#define _FILENODE_H_ +#ifndef _FILENODECMP_H_ +#define _FILENODECMP_H_ #include "filenode.h" @@ -9,7 +9,9 @@ typedef enum { AccionFileCmp_IzquierdaADerecha, AccionFileCmp_DerechaAIzquierda, AccionFileCmp_BorrarIzquierda, - AccionFileCmp_BorrarDerecha + AccionFileCmp_BorrarDerecha, + AccionFileCmp_FechaIzquierdaADerecha, + AccionFileCmp_FechaDerechaAIzquierda } AccionFileCmp; @@ -26,5 +28,6 @@ void AccionFileNode_Destruir(AccionFileNode *afn); AccionFileNode *AccionFileNode_Build(FileNode *izquierda,FileNode *derecha); +void AccionFileNode_Print(AccionFileNode *afn); #endif diff --git a/fileutil.c b/fileutil.c index f89d7e7..7257569 100644 --- a/fileutil.c +++ b/fileutil.c @@ -98,7 +98,7 @@ void FileTime_Print(FileTime t){ struct tm *tms; tms=localtime((time_t *)&t); - printf("%d/%d/%d %02d:%02d:%02d", + printf("%04d-%02d-%02d %02d:%02d:%02d", tms->tm_year+1900, tms->tm_mon+1, tms->tm_mday, @@ -260,7 +260,7 @@ void File_IterateDir(char *path, if(strcmp(fileinfo.name,".") && strcmp(fileinfo.name,"..")) { - // Apartir de aqui hay un fichero + // A partir de aqui hay un fichero // (o directorio) snprintf(f_path,512, "%s/%s",path,fileinfo.name); diff --git a/main.c b/main.c index dc683b8..d21900b 100644 --- a/main.c +++ b/main.c @@ -6,31 +6,35 @@ #include "crc.h" #include "fileutil.h" #include "filenode.h" +#include "filenodecmp.h" void help(char *exe){ - printf("%s info [file] {[file] {..}}\n",exe); - printf("%s scan [dir] [tree] \n",exe); - printf("%s rescan [dir] [tree] \n",exe); - printf("%s read [file] [tree]\n",exe); - printf("%s dir [dir]\n",exe); + char exeFilename[1024]; + File_GetName(exe,exeFilename); + printf("Modo de uso:\n"); + printf("\t%s info [file] {[file] {..}}\n",exeFilename); + printf("\t%s scan [dir] [tree] \n",exeFilename); + printf("\t%s rescan [dir] [tree] \n",exeFilename); + printf("\t%s read [file] [tree]\n",exeFilename); + printf("\t%s dir [dir]\n",exeFilename); + printf("\t%s sync [dirIzquierda] [dirDerecha]\n",exeFilename); } int main(int argc,char *argv[]){ FILE *f; - unsigned long crc; + unsigned long crc=0; FileTime ft; int i; - if(argc<2){ - help(argv[0]); - }else if(!strcmp(argv[1],"info") && argc>=3){ // Informacion de ficheros for(i=2;i