- if (dflag == 1) {
- /* Descomprimo */
- FILE *fp_out;
- VFILE *fp_in;
- unsigned long int block_size, k;
- char *block, *mtf, *orig;
- int *pos;
-
- shuff_decode_file(argv[optind], "tmp.comp"); /*argv[optind+1]);*/
- fp_in = vfopen("tmp.comp", "r", 0);
- fp_out = fopen(argv[optind+1], "wb");
-
- while (!vfeof(fp_in)) {
- block_size = 0;
- vfread(&block_size, sizeof(unsigned long int), 1, fp_in);
- if (block_size > 0) {
- block = malloc((block_size+sizeof(unsigned long int))*sizeof(char));
- orig = malloc(block_size*sizeof(char));
- vfread(block, block_size, sizeof(char), fp_in);
-
- mtf = jacu_mtf_inv(block, /*XXX NO LO TENGO XXX */pos, block_size);
-
- memcpy(&k, block, sizeof(unsigned long int));
-
- bs_restore(orig, block+sizeof(unsigned long int), k, block_size);
-
- fwrite(orig, block_size, sizeof(char), fp_out);
- free(block);
- free(orig);
- free(mtf);
+ /* Descomprimo primero que nada el pagesize utilizado para comprimir */
+ if (!(moredata = shuff_decode_chunk(shuff,(char*)&block_size,sizeof(Uint32),&decoded))) return 1;
+
+ /* Descomprimo byte que indica si se usa ZG */
+ if (!(moredata = shuff_decode_chunk(shuff, &file_flags, 1, &decoded))) return 1;
+
+ /* Creo buffers */
+ block = malloc(block_size*sizeof(unsigned char)+sizeof(Uint32));
+ orig = malloc(block_size*sizeof(unsigned char));
+
+ /* Descomprimimos de a chunks segun convenga */
+ do {
+ if (block_size > 0) {
+ /* Descomprimo el Zlen y el Z del MTF*/
+ moredata = shuff_decode_chunk(shuff,(char*)&z_len,sizeof(int),&decoded);
+ z = malloc(sizeof(unsigned char)*z_len);
+ moredata = shuff_decode_chunk(shuff,z,z_len,&decoded);
+
+ /* Veo si se uso Zero Grouping para comprimir */
+ if (is_flags_on(file_flags, FLAGS_ZG)) {
+ ZG zg;
+ unsigned char zgbuffer[255];
+ unsigned char zgbyte = 0;
+ int zgmoved = 0;
+ Uint32 zgungrouped = 0;
+ /* Desagrupo bytes hasta completar la pagina or End of Source File */
+ zg_init(&zg);
+ do {
+ /* Levanto un byte zerogrouped y lo paso por el zg_ungroup */
+ zgmoved = 0;
+ moredata = shuff_decode_chunk(shuff,&zgbyte,1,&decoded);
+ retbytes = zg_ungroup(&zg,zgbuffer,zgbyte);
+ /* Muevo del zgbuffer a mi bloque lo que corresponda */
+ while ((zgmoved < retbytes) && (zgungrouped < block_size+sizeof(Uint32))) {
+ block[zgungrouped++] = zgbuffer[zgmoved++];
+ }
+ } while ((moredata) && (zgungrouped < block_size+sizeof(Uint32)));
+
+ /* Me fijo si el ultimo byte procesado que me completo la pagina fue un 0 */
+ if (zgbyte == 0) {
+ /* Leo un byte mas (un 0 seguro) y zg_ungroup cambiara su estado */
+ moredata = shuff_decode_chunk(shuff,&zgbyte,1,&decoded);
+ zg_ungroup(&zg,zgbuffer,zgbyte);
+ }
+
+ /* Normalizo variables para continuar en common code */
+ decoded = zgungrouped;
+ }
+ else {
+ /* Levanto una salida de MTF */
+ moredata = shuff_decode_chunk(shuff,block,block_size+sizeof(Uint32),&decoded);
+ }
+
+ /* Le aplico MTF inverso a la salida de MTF levantada previamente */
+ mtf = jacu_mtf_inv(z, block, decoded);
+
+ /* Ya tengo la salida del BS, tonces levanto su K */
+ memcpy(&k, mtf, sizeof(Uint32));
+
+ /* Obtengo el chunk original aplicando BS Inverso */
+ bs_restore(orig, mtf+sizeof(Uint32), k, decoded - sizeof(Uint32));
+
+ decoded -= sizeof(Uint32);
+ if (is_flags_on(file_flags, FLAGS_WS)) {
+ orig = bs_finalblock(orig, decoded, &decoded);