]> git.llucax.com Git - z.facultad/75.06/jacu.git/blobdiff - src/statichuff/statichuff.h
Agrego Descomprimir con diccionario. POR AHORA SE NECESITA PASAR -r AL DESCOMPRIMIR...
[z.facultad/75.06/jacu.git] / src / statichuff / statichuff.h
index 5699ebb6d2411bbe2adfb9ca5a711ba1ea7933b6..3289aeb3a89f6738cd74483fa94c8284eb08700e 100644 (file)
 
 #include <stdio.h>
 #include <unistd.h>
+#include "../vfile/vfile.h"
 
+/** \file
+ * Compresor Huffman Estático
+ *
+ * <b>Interfaz del compresor Huffman Estático</b>
+ *
+ * El siguiente compresor permite la compresión/descompresión estadística de un
+ * archivo o bien chunks de datos. Posee tambien como feature opcional, el grabado 
+ * y carga de un modelo estadístico (Tabla de Frecuencias), conocido como Huffman Canonico.
+ *
+ */
+
+/** Tipo que representa una frecuencia de un símbolo */
 typedef unsigned long int t_freq;
 
+/** Estructura que representa un nodo de un árbol y/o inputlist de huffman */
 typedef struct t_freqnode {
-       unsigned short int symbol;
-       t_freq freq;
-       struct t_freqnode *lchild;
-       struct t_freqnode *rchild;
+       unsigned short int symbol; /**< Símbolo que representa el nodo */
+       t_freq freq; /**< Frecuencia del nodo */
+       struct t_freqnode *lchild; /**< Hijo izquierdo del nodo */
+       struct t_freqnode *rchild; /**< Hijo derecho del nodo */
 } SHUFFNODE;
 
+/** Estructura que representa un código prefijo generado con el árbol de huffman */
 typedef struct t_code {
-       unsigned long int code;
-       unsigned char codelength;
+       unsigned long int code; /**< Codigo prefijo de algún símbolo */
+       unsigned char codelength; /**< Longitud en bits del código prefijo */
 } SHUFFCODE;
 
-int shuff_decode_file(char *inputfile, char *outputfile);
-int shuff_encode_file(char *inputfile, char *outputfile, long volsize);
+/** Estructura que representa el estado del compresor Huffman Estático */
+typedef struct t_huff {
+       FILE *coderfp; /**< FPointer usado en el coder de bychunk para el temp */
+       VFILE *decoderfp; /**< FPointer al archivo a descomrimir */
+       char *sourcefile; /**< Nombre del archivo a comprimir o a descomprimir */
+       char *targetfile; /**< Nombre del archivo comprimido o descomprimido */
+       long volsize; /**< Tamanio de volumen para multivol */
+       char bychunk; /**< 0 works byfile, 1 works bychunk */
+       char canonic; /**< 1 Huffman Canonico con preloaded freqtable */
+       t_freq *freqtable; /**< Tabla de frecuencias */
+       t_freq sumfreq; /**< Frecuencia total acumulada */
+       SHUFFNODE *codetree; /**< Puntero al arbol de codigos prefijos */               
+       unsigned long int bytesleft; /**< Cuanto falta descomprimir en un bychunk */    
+       unsigned long int codebuffer; /**< Buffer de descompresion para bychunk */
+       int bitsleft; /**< Posicion en el buffer de descompresion para bychunk */
+} HUFF_STATE;
+
+/** Crea una estructura <em>HUFF_STATE<em> y la inicializa para utilizarla
+ * para comprimir archivos.
+ *
+ * \param inputfile Archivo a comprimir.
+ * \param outputfile Archivo destino de la compresión.
+ * \param volsize Size del volumen en caso de compresión multivolumen.
+ * \return \b HUFF_STATE* Puntero a estructura creada e inicializada.
+ */
+HUFF_STATE *shuff_init_encoder_byfile(char *inputfile, char *outputfile, long volsize);
+
+/** Crea una estructura <em>HUFF_STATE<em> y la inicializa para utilizarla
+ * para comprimir una secuencia de chunks de datos.
+ *
+ * \param outputfile Archivo destino de la compresión.
+ * \param volsize Size del volumen en caso de compresión multivolumen.
+ * \return \b HUFF_STATE* Puntero a estructura creada e inicializada.
+ */
+HUFF_STATE *shuff_init_encoder_bychunk(char *outputfile, long volsize);
+
+/** Crea una estructura <em>HUFF_STATE<em> y la inicializa para utilizarla
+ * en la descompresión de un archivo.
+ *
+ * \param inputfile Archivo a descomprimir.
+ * \param outputfile Archivo destino de la descompresión.
+ * \return \b HUFF_STATE* Puntero a estructura creada e inicializada.
+ */
+HUFF_STATE *shuff_init_decoder(char *inputfile, char *outputfile);
+
+/** Desinicializa el compresor Huffman, cerrando files y liberando memoria.
+ *
+ * \param shuff Puntero a la estructura usada para el estado del compresor.
+ */
+void shuff_deinit_encoder(HUFF_STATE *shuff);
+
+/** Desinicializa el compresor Huffman, cerrando files y liberando memoria.
+ *
+ * \param shuff Puntero a la estructura usada para el estado del compresor.
+ */
+void shuff_deinit_decoder(HUFF_STATE *shuff);
+
+/** Ejecuta la compresión de un archivo previamente indicado a través de
+ * las rutinas de inicializacion de Huffman.
+ *
+ * \param shuff Puntero a la estructura usada para el estado del compresor.
+ * \return \b int Indica éxito de la operacion. (1 Exito, 0 Error)
+ */
+int shuff_encode_file(HUFF_STATE *shuff);
+
+/** Ejecuta la descompresión de un archivo previamente indicado a través de
+ * las rutinas de inicializacion de Huffman.
+ *
+ * \param shuff Puntero a la estructura usada para el estado del compresor.
+ * \return \b int Indica éxito de la operacion. (1 Exito, 0 Error)
+ */
+int shuff_decode_file(HUFF_STATE *shuff);
+
+/** Recibe un chunk de datos y analiza la frecuencia de sus caracteres
+ * actualizando el modelo de frecuencias en consecuencia.
+ *
+ * \param chunkshuff Puntero a la estructura usada para el estado del compresor.
+ * \param chunk Puntero al chunk de datos.
+ * \param chunksize Size del chunk de datos.
+ * \return \b int Indica éxito de la operacion. (1 Exito, 0 Error)
+ */
+int shuff_scanfreq_chunk(HUFF_STATE *shuff, char* chunk, int chunksize);
+
+/** Descomprime un chunk de datos cuyo size es especificado en la rutina.
+ *
+ * \param shuff Puntero a la estructura usada para el estado del compresor.
+ * \param chunk Puntero al buffer donde se decodificara el chunk.
+ * \param chunksize Size del buffer o chunk que se quiere obtener.
+ * \return \b int Indica si hay mas datos a descomprimir o no (1 hay, 0 no hay)
+ */
+int shuff_decode_chunk(HUFF_STATE *shuff, char *chunk, int chunksize, unsigned long int *decodedbytes);
+
+/** Graba el modelo de un archivo que se ha comprimido. (Tabla de Freq)
+ *
+ * \param shuff Puntero a la estructura usada para el estado del compresor. 
+ * \return \b int Indica éxito de la operación. (1 Exito, 0 Error);
+ */
+int shuff_savemodel(HUFF_STATE *shuff);
+
+/** Carga un modelo de huffman (Tabla de Freq) para ser usando en Huff Canonico
+ *
+ * \param shuff Puntero a la estructura usada para el estado del compresor. 
+ * \param modelfile Nombre del archivo que posee el modelo a cargar.
+ * \return \b int Indica éxito de la operación. (1 Exito, 0 Error);
+ */
+int shuff_loadmodel(HUFF_STATE *shuff, char *modelfile);
 
 #endif /* _STATICHUFF_H_ */