From cb53166758c12a09e9911769ce89c94cee4cc0f0 Mon Sep 17 00:00:00 2001 From: Alan Kennedy Date: Fri, 25 Jun 2004 15:09:14 +0000 Subject: [PATCH 1/1] Se quita repeticion de pagesize en cada bloque comprimido, grabandose una sola vez como header comprimido por huffman. --- src/blocksorting/bs.c | 10 +++---- src/jacu.c | 63 ++++++++++++++++++++++--------------------- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/src/blocksorting/bs.c b/src/blocksorting/bs.c index fa14152..fb13e55 100644 --- a/src/blocksorting/bs.c +++ b/src/blocksorting/bs.c @@ -71,8 +71,8 @@ int generar_salida(char *data, t_BlockSort *bs, char *salida) Uint32 i, k; char *out; - /* Dejo lugar para guardar el k y el tamaño de este bloque */ - out = salida + sizeof(Uint32)*2; + /* Dejo lugar para guardar el K */ + out = salida + sizeof(Uint32); k=-1; for(i=0; ilen; i++) { @@ -94,9 +94,8 @@ void bs_solve(char *in, char *out, t_BlockSort *bs, Uint32 *k, Uint32 leido) ordenar_array(in, bs); (*k) = generar_salida(in, bs, out); - /* Guardo el k y el tamaño en el array */ - memcpy(out, &leido, sizeof(Uint32)); - memcpy(out+sizeof(Uint32), k, sizeof(Uint32)); + /* Guardo el k y el tamaño en el array */ + memcpy(out, k, sizeof(Uint32)); bs->len = l; } @@ -140,4 +139,3 @@ void bs_destroy(t_BlockSort *bs) free(bs->array); free(bs); } - diff --git a/src/jacu.c b/src/jacu.c index baf28da..ab4c79d 100644 --- a/src/jacu.c +++ b/src/jacu.c @@ -106,16 +106,19 @@ int main(int argc, char* argv[]) int z_len; /* Preparo el compresor huffman */ - if ((shuff = shuff_init_encoder_bychunk(argv[optind+1],volumesize*1024)) == NULL) return 0; + if ((shuff = shuff_init_encoder_bychunk(argv[optind+1],volumesize*1024)) == NULL) return 1; if (mflag == 1) shuff_loadmodel(shuff,staticmodel); - /* Preparo el BS alocando mem para el K, el Block y su Size */ + /* Preparo el BS alocando mem para la Salida: V(vector) + K(colnum) */ data = malloc(sizeof(unsigned char)*pagesize); - salida = malloc(sizeof(unsigned char)*pagesize+sizeof(Uint32)*2); + salida = malloc(sizeof(unsigned char)*pagesize+sizeof(Uint32)); bs = bs_create(pagesize); /* Abrimos el archivo a comprimir y encodeamos bloques */ - fp = fopen(argv[optind], "rb"); + fp = fopen(argv[optind], "rb"); + + /* Guardamos el pagesize como header (huffencoded) */ + shuff_scanfreq_chunk(shuff,(char*)&pagesize,sizeof(size_t)); total = 0; while (!feof(fp)) { @@ -128,11 +131,11 @@ int main(int argc, char* argv[]) /* Saco un EOF que lee de mas */ if (i 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); - - block = malloc(block_size*sizeof(unsigned char)+sizeof(Uint32)); - orig = malloc(block_size*sizeof(unsigned char)); + moredata = shuff_decode_chunk(shuff,z,z_len,&decoded); + + /* Levanto una salida de MTF y le aplico MTF Inverso */ moredata = shuff_decode_chunk(shuff,block,block_size+sizeof(Uint32),&decoded); + mtf = jacu_mtf_inv(z, block, decoded); - mtf = jacu_mtf_inv(z, block, block_size*sizeof(unsigned char)+sizeof(Uint32)); - - /* Luego de hacer el MTF inverso ya puedo recuperar el k */ + /* Ya tengo la salida del BS, tonces levanto su K */ memcpy(&k, mtf, sizeof(Uint32)); - /*printf("Restored : k=%ld\n", k);*/ - bs_restore(orig, mtf+sizeof(Uint32), k, block_size); + /* Obtengo el chunk original aplicando BS Inverso */ + bs_restore(orig, mtf+sizeof(Uint32), k, decoded - sizeof(Uint32)); - fwrite(orig, block_size, sizeof(unsigned char), fp_out); - free(block); - free(orig); + fwrite(orig, decoded - sizeof(Uint32), sizeof(unsigned char), fp_out); free(mtf); free(z); } + else return 1; } while (moredata); - /* Close up files */ + /* Close up files and free mem */ fclose(fp_out); + free(block); + free(orig); /* Shutdown Huffman */ shuff_deinit_decoder(shuff); -- 2.43.0