X-Git-Url: https://git.llucax.com/z.facultad/75.06/jacu.git/blobdiff_plain/fda048987789cf1bcf067115a593042af5ade502..796cdcb3e421a88cf628fce1b20de546890ea106:/src/statichuff/main_bychunk.c diff --git a/src/statichuff/main_bychunk.c b/src/statichuff/main_bychunk.c index 43426e8..e0f1e28 100644 --- a/src/statichuff/main_bychunk.c +++ b/src/statichuff/main_bychunk.c @@ -10,10 +10,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,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,13 +29,20 @@ 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); } @@ -40,6 +50,7 @@ int main(int argc, char* argv[]) if (cflag == 1) { /* Inicio un compresor huffman estatico por chunks */ 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,14 +67,14 @@ 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 encoder */ shuff_deinit_encoder(shuff); /* Free mem allocated by main */ - free(shuff); - free(chunk); + free(shuff); /* Close files opened by main */ fclose(fp); @@ -72,7 +83,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)) @@ -84,8 +95,10 @@ int main(int argc, char* argv[]) /* Deinit decoder */ shuff_deinit_decoder(shuff); - free(shuff); + free(shuff); } - + + /* Free mem */ + free(chunk); return 0; }