]> git.llucax.com Git - z.facultad/75.06/jacu.git/blobdiff - src/statichuff/main_bychunk.c
Agrego Header GNU a los archivos que faltaban.
[z.facultad/75.06/jacu.git] / src / statichuff / main_bychunk.c
index 5ce80160b846f29270499c37cb50606a57220430..7afddee85f83f0dc9444db57cb901340e214203d 100644 (file)
@@ -1,3 +1,24 @@
+/*----------------------------------------------------------------------------
+ *                   jacu - Just Another Compression Utility
+ *----------------------------------------------------------------------------
+ * This file is part of jacu.
+ *
+ * jacu is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * jacu 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 General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with jacu; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA  02111-1307  USA
+ *----------------------------------------------------------------------------
+ */
+
 
 #include "statichuff.h"
 #include <stdlib.h>
@@ -10,10 +31,13 @@ int main(int argc, char* argv[])
        int cflag = 0;
        int dflag = 0;
        int tflag = 0;
+       int sflag = 0;
+       int mflag = 0;
        long int volumesize = 0;
-       int lastchunk,i,j,ch;
+       int lastchunk,i,j,ch,decoded = 0;
+       char *staticmodel;
                        
-       while ((ch = getopt(argc, argv, "cdt:")) != -1) { 
+       while ((ch = getopt(argc, argv, "scdm:t:")) != -1) { 
                 
                switch (ch) { 
                        case 'c': cflag = 1; 
@@ -26,20 +50,28 @@ int main(int argc, char* argv[])
                                          volumesize = atoi(optarg);                                      
                                          break; 
                        
-                       default: fprintf(stderr, "Usage: %s [-cdt] sourcefile targetfile\n", argv[0]); 
+                       case 'm': mflag = 1;
+                                         staticmodel = optarg;
+                                         break; 
+                       
+                       case 's': sflag = 1;                                      
+                                         break;
+                       
+                       default: fprintf(stderr, "Usage: %s [-cds] [-t volsizekb] sourcefile targetfile [-m modeldumpfile]\n", argv[0]); 
                                         return(2);
                }
        }
                
-       if ( (argc == 1) || (cflag & dflag) || !(cflag | dflag) || ((argc - optind) < 2) ) {
-               fprintf(stderr, "Usage: %s [-cdt] sourcefile targetfile\n", argv[0]); 
+       if ( (argc == 1) || (cflag & dflag) || !(cflag | dflag) || ((argc - optind) < 2) || (mflag & sflag)) {
+               fprintf(stderr, "Usage: %s [-cds] [-t volsizekb] sourcefile targetfile [-m modeldumpfile]\n", argv[0]); 
                if ((tflag == 1) && (volumesize < 0)) fprintf(stderr,"Error: The volume size must be a non-zero value\n");
                return (2);             
        }
                
        if (cflag == 1) {
                /* Inicio un compresor huffman estatico por chunks */
-               if ((shuff = shuff_init_static_bychunk(argv[optind+1],volumesize*1024)) == NULL) return 0;
+               if ((shuff = shuff_init_encoder_bychunk(argv[optind+1],volumesize*1024)) == NULL) return 0;
+               if (mflag == 1) shuff_loadmodel(shuff,staticmodel);
                
                /* Comprimo por chunks */               
                if ((fp = fopen(argv[optind],"rb")) == NULL) return 1;          
@@ -56,23 +88,38 @@ int main(int argc, char* argv[])
                        shuff_scanfreq_chunk(shuff,chunk,i);                    
                }
                /* Le indico al huffman que efectivamente comprima los chunks */
-               shuff_encode_file(shuff);
+               shuff_encode_file(shuff);               
+               if (sflag == 1) shuff_savemodel(shuff);         
                
-               /* De init shuffman by chunks */
-               shuff_deinit_static_bychunk(shuff);
+               /* De init encoder */
+               shuff_deinit_encoder(shuff);
                
                /* Free mem allocated by main */
-               free(shuff);
-               free(chunk);
+               free(shuff);            
                
                /* Close files opened by main */
                fclose(fp);
        }
        
        if (dflag == 1) { 
-               /* Descomprimo */
-               return shuff_decode_file(argv[optind],argv[optind+1]);
-       }
+               /* Init decoder */
+               shuff = shuff_init_decoder(argv[optind],NULL);
+               fp = fopen(argv[optind+1],"w");
                
+               /* Gimme chunks till last one */
+               while (shuff_decode_chunk(shuff,chunk,4,&decoded))
+                       fwrite(chunk,decoded,1,fp);
+               
+               /* Last chunk written alone */
+               fwrite(chunk,decoded,1,fp);
+               fclose(fp);
+               
+               /* Deinit decoder */
+               shuff_deinit_decoder(shuff);
+               free(shuff);            
+       }
+       
+       /* Free mem */
+       free(chunk);            
        return 0;
 }