#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_ */