+ /* Descomprimo */
+ FILE *fp_out;
+ Uint32 block_size = 0, k;
+ unsigned char *block, *mtf, *orig;
+ unsigned char *z;
+ Uint32 z_len=0,moredata = 0,decoded = 0;
+ unsigned char file_flags = 0,retbytes = 0;
+ HUFF_STATE *shuff;
+
+ /* Inicializo el descompresor */
+ if ((shuff = shuff_init_decoder(src, NULL)) == NULL) return 1;
+
+ /* Abrimos el archivo de salida */
+ fp_out = fopen(dst, "wb");
+
+ /* 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);
+ }