]> git.llucax.com Git - z.facultad/75.06/jacu.git/commitdiff
Mejor manejo de memoria, still debe haber sus buenos holes en un rato lo reviso con...
authorAlan Kennedy <kennedya@3dgames.com.ar>
Wed, 23 Jun 2004 20:02:31 +0000 (20:02 +0000)
committerAlan Kennedy <kennedya@3dgames.com.ar>
Wed, 23 Jun 2004 20:02:31 +0000 (20:02 +0000)
src/statichuff/main_bychunk.c
src/statichuff/statichuff.c
src/statichuff/statichuff.h

index 43426e841622dae8996fafd6972eacbfef626dcd..12f8028ef5a06d3d506f1e45753bdc16572df44c 100644 (file)
@@ -72,7 +72,7 @@ int main(int argc, char* argv[])
        if (dflag == 1) { 
                /* Init decoder */
                shuff = shuff_init_decoder(argv[optind],NULL);
-               fp = fopen("chunkdump.txt","w");
+               fp = fopen(argv[optind+1],"w");
                
                /* Gimme chunks till last one */
                while (shuff_decode_chunk(shuff,chunk,4,&decoded))
index 55346bd4bb04dcb32eeec11478f284630f5d8a1b..2e2764ac351ac9ca5b95a1bdf5ce40120b3a59f1 100644 (file)
@@ -393,10 +393,11 @@ HUFF_STATE *shuff_init_decoder(char *inputfile, char *outputfile)
                strcpy(shuff->targetfile,outputfile);
        }       
        
-       /* Levanto cuantos bytes decodeo y la freq table */
+       /* Levanto cuantos bytes debo decodificar y la freqtable */
        if ((shuff->decoderfp = vfopen(shuff->sourcefile,"r",0)) == NULL) return NULL;  
        vfread(&(shuff->bytesleft),sizeof(unsigned long int),1,shuff->decoderfp);
        vfread(shuff->freqtable,sizeof(unsigned long int),256,shuff->decoderfp);                
+       /* Armo el arbol de huffman que uso para decodificar */
        shuff->codetree = shuff_buildtree(shuff->freqtable);
        
        return shuff;
@@ -416,11 +417,11 @@ HUFF_STATE *shuff_init_encoder_byfile(char *inputfile, char *outputfile, long vo
        strcpy(fshuff->sourcefile,inputfile);   
        strcpy(fshuff->targetfile,outputfile);
        fshuff->volsize = volsize;
+       fshuff->bychunk = 0;
        fshuff->preloadfreq = 0;        
        fshuff->freqtable = (t_freq*)malloc(sizeof(t_freq)*256);
        for (i = 0; i < 256; ++i) fshuff->freqtable[i] = 0;     
        fshuff->sumfreq = 0;            
-       fshuff->bytesleft = 0;
        fshuff->codetree = NULL;
        
        return fshuff;
@@ -432,7 +433,7 @@ HUFF_STATE *shuff_init_encoder_bychunk(char *outputfile, long volsize)
        HUFF_STATE *cshuff = (HUFF_STATE*)malloc(sizeof(HUFF_STATE));                   
        int i;
        
-       /* Inicializo la estructura para trabajar con Huff Static by Chunks */  
+       /* Inicializo la estructura para trabajar con Huff Static by Chunks */          
        cshuff->decoderfp = NULL;
        cshuff->sourcefile = (char*)malloc(sizeof(char)*(strlen(outputfile)+2));
        cshuff->targetfile = (char*)malloc(sizeof(char)*(strlen(outputfile)+1));
@@ -440,12 +441,12 @@ HUFF_STATE *shuff_init_encoder_bychunk(char *outputfile, long volsize)
        strcpy(cshuff->sourcefile,outputfile);
        strcat(cshuff->sourcefile,"~"); 
        cshuff->volsize = volsize;
+       cshuff->bychunk = 1;
        cshuff->preloadfreq = 1;                
        cshuff->freqtable = (t_freq*)malloc(sizeof(t_freq)*256);        
        for (i = 0; i < 256; ++i) cshuff->freqtable[i] = 0;     
-       cshuff->sumfreq = 0;
-       cshuff->bytesleft = 0;
-       cshuff->codetree = NULL;
+       cshuff->sumfreq = 0;    
+       cshuff->codetree = NULL;        
        
        /* Abrimos un archivo temporal para ir tirando los chunks */    
        if ((cshuff->coderfp = fopen(cshuff->sourcefile,"w")) == NULL) return NULL;     
@@ -456,11 +457,11 @@ HUFF_STATE *shuff_init_encoder_bychunk(char *outputfile, long volsize)
 void shuff_deinit_encoder(HUFF_STATE *shuff)
 {
        /* Libero mallocs y cierro archivos */
-       free(shuff->freqtable); 
-       if (shuff->coderfp != NULL) fclose(shuff->coderfp);
-       if (shuff->preloadfreq == 1) unlink(shuff->sourcefile);
-       if (shuff->targetfile != NULL) free(shuff->targetfile);                 
-       free(shuff->sourcefile);        
+       if (shuff->freqtable) free(shuff->freqtable);
+       if (shuff->coderfp) fclose(shuff->coderfp);
+       if (shuff->bychunk) unlink(shuff->sourcefile);
+       if (shuff->sourcefile) free(shuff->sourcefile); 
+       if (shuff->targetfile) free(shuff->targetfile);                         
        
        /* Destruyo recursivamente el arbol de codigos */
 }
@@ -468,8 +469,8 @@ void shuff_deinit_encoder(HUFF_STATE *shuff)
 void shuff_deinit_decoder(HUFF_STATE *shuff)
 {
        /* Libero mallocs y cierro archivos */  
-       free(shuff->freqtable);
-       free(shuff->sourcefile);
+       if (shuff->freqtable) free(shuff->freqtable);
+       if (shuff->sourcefile != NULL) free(shuff->sourcefile);
        if (shuff->targetfile != NULL) free(shuff->targetfile);
        if (shuff->decoderfp != NULL) vfclose(shuff->decoderfp);
                
index 3d80401ec32f07cfde3711f7f3a70b1649452a01..2ae1a60ab8cf96538fbf2b19736a8f42431026ae 100644 (file)
@@ -21,12 +21,13 @@ typedef struct t_code {
 } SHUFFCODE;
 
 typedef struct t_huff {
-       FILE *coderfp; /* filepointer usado en el coder de bychunk */
-       VFILE *decoderfp; /* filepointer usado en ambos decoders */
+       FILE *coderfp; /* fpointer usado en el coder de bychunk para el temp */
+       VFILE *decoderfp; /* fpointer al archivo a descomrimir */
        char *sourcefile; /* Nombre del archivo a comprimir */
        char *targetfile; /* Nombre del archivo comprimido */
        long volsize; /* Tamanio de volumen para multivol */
-       char preloadfreq; /* 1 Freqtable preloaded (bychunk | canonico) - 0 byfile */
+       char bychunk; /* 0 works byfile, 1 works bychunk */
+       char preloadfreq; /* 1 Freqtable has been preloaded (bychunk | canonic) */
        t_freq *freqtable; /* Tabla de frecuencias */
        t_freq sumfreq; /* Frecuencia total acumulada */
        SHUFFNODE *codetree; /* Puntero al arbol de codigos prefijos */