+/*----------------------------------------------------------------------------
+ * 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>
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;
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;
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;
}