1 /*----------------------------------------------------------------------------
2 * jacu - Just Another Compression Utility
3 *----------------------------------------------------------------------------
4 * This file is part of jacu.
6 * jacu is free software; you can redistribute it and/or modify it under the
7 * terms of the GNU General Public License as published by the Free Software
8 * Foundation; either version 2 of the License, or (at your option) any later
11 * jacu is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * You should have received a copy of the GNU General Public License along
17 * with jacu; if not, write to the Free Software Foundation, Inc., 59 Temple
18 * Place, Suite 330, Boston, MA 02111-1307 USA
19 *----------------------------------------------------------------------------
23 #ifndef _STATICHUFF_H_
24 #define _STATICHUFF_H_
28 #include "../vfile/vfile.h"
31 * Compresor Huffman Estático
33 * <b>Interfaz del compresor Huffman Estático</b>
35 * El siguiente compresor permite la compresión/descompresión estadística de un
36 * archivo o bien chunks de datos. Posee tambien como feature opcional, el grabado
37 * y carga de un modelo estadístico (Tabla de Frecuencias), conocido como Huffman Canonico.
41 /** Tipo que representa una frecuencia de un símbolo */
42 typedef unsigned long int t_freq;
44 /** Estructura que representa un nodo de un árbol y/o inputlist de huffman */
45 typedef struct t_freqnode {
46 unsigned short int symbol; /**< Símbolo que representa el nodo */
47 t_freq freq; /**< Frecuencia del nodo */
48 struct t_freqnode *lchild; /**< Hijo izquierdo del nodo */
49 struct t_freqnode *rchild; /**< Hijo derecho del nodo */
52 /** Estructura que representa un código prefijo generado con el árbol de huffman */
53 typedef struct t_code {
54 unsigned long int code; /**< Codigo prefijo de algún símbolo */
55 unsigned char codelength; /**< Longitud en bits del código prefijo */
58 /** Estructura que representa el estado del compresor Huffman Estático */
59 typedef struct t_huff {
60 FILE *coderfp; /**< FPointer usado en el coder de bychunk para el temp */
61 VFILE *decoderfp; /**< FPointer al archivo a descomrimir */
62 char *sourcefile; /**< Nombre del archivo a comprimir o a descomprimir */
63 char *targetfile; /**< Nombre del archivo comprimido o descomprimido */
64 long volsize; /**< Tamanio de volumen para multivol */
65 char bychunk; /**< 0 works byfile, 1 works bychunk */
66 char canonic; /**< 1 Huffman Canonico con preloaded freqtable */
67 t_freq *freqtable; /**< Tabla de frecuencias */
68 t_freq sumfreq; /**< Frecuencia total acumulada */
69 SHUFFNODE *codetree; /**< Puntero al arbol de codigos prefijos */
70 unsigned long int bytesleft; /**< Cuanto falta descomprimir en un bychunk */
71 unsigned long int codebuffer; /**< Buffer de descompresion para bychunk */
72 int bitsleft; /**< Posicion en el buffer de descompresion para bychunk */
75 /** Crea una estructura <em>HUFF_STATE<em> y la inicializa para utilizarla
76 * para comprimir archivos.
78 * \param inputfile Archivo a comprimir.
79 * \param outputfile Archivo destino de la compresión.
80 * \param volsize Size del volumen en caso de compresión multivolumen.
81 * \return \b HUFF_STATE* Puntero a estructura creada e inicializada.
83 HUFF_STATE *shuff_init_encoder_byfile(char *inputfile, char *outputfile, long volsize);
85 /** Crea una estructura <em>HUFF_STATE<em> y la inicializa para utilizarla
86 * para comprimir una secuencia de chunks de datos.
88 * \param outputfile Archivo destino de la compresión.
89 * \param volsize Size del volumen en caso de compresión multivolumen.
90 * \return \b HUFF_STATE* Puntero a estructura creada e inicializada.
92 HUFF_STATE *shuff_init_encoder_bychunk(char *outputfile, long volsize);
94 /** Crea una estructura <em>HUFF_STATE<em> y la inicializa para utilizarla
95 * en la descompresión de un archivo.
97 * \param inputfile Archivo a descomprimir.
98 * \param outputfile Archivo destino de la descompresión.
99 * \return \b HUFF_STATE* Puntero a estructura creada e inicializada.
101 HUFF_STATE *shuff_init_decoder(char *inputfile, char *outputfile);
103 /** Desinicializa el compresor Huffman, cerrando files y liberando memoria.
105 * \param shuff Puntero a la estructura usada para el estado del compresor.
107 void shuff_deinit_encoder(HUFF_STATE *shuff);
109 /** Desinicializa el compresor Huffman, cerrando files y liberando memoria.
111 * \param shuff Puntero a la estructura usada para el estado del compresor.
113 void shuff_deinit_decoder(HUFF_STATE *shuff);
115 /** Ejecuta la compresión de un archivo previamente indicado a través de
116 * las rutinas de inicializacion de Huffman.
118 * \param shuff Puntero a la estructura usada para el estado del compresor.
119 * \return \b int Indica éxito de la operacion. (1 Exito, 0 Error)
121 int shuff_encode_file(HUFF_STATE *shuff);
123 /** Ejecuta la descompresión de un archivo previamente indicado a través de
124 * las rutinas de inicializacion de Huffman.
126 * \param shuff Puntero a la estructura usada para el estado del compresor.
127 * \return \b int Indica éxito de la operacion. (1 Exito, 0 Error)
129 int shuff_decode_file(HUFF_STATE *shuff);
131 /** Recibe un chunk de datos y analiza la frecuencia de sus caracteres
132 * actualizando el modelo de frecuencias en consecuencia.
134 * \param chunkshuff Puntero a la estructura usada para el estado del compresor.
135 * \param chunk Puntero al chunk de datos.
136 * \param chunksize Size del chunk de datos.
137 * \return \b int Indica éxito de la operacion. (1 Exito, 0 Error)
139 int shuff_scanfreq_chunk(HUFF_STATE *shuff, char* chunk, int chunksize);
141 /** Descomprime un chunk de datos cuyo size es especificado en la rutina.
143 * \param shuff Puntero a la estructura usada para el estado del compresor.
144 * \param chunk Puntero al buffer donde se decodificara el chunk.
145 * \param chunksize Size del buffer o chunk que se quiere obtener.
146 * \return \b int Indica si hay mas datos a descomprimir o no (1 hay, 0 no hay)
148 int shuff_decode_chunk(HUFF_STATE *shuff, char *chunk, int chunksize, unsigned long int *decodedbytes);
150 /** Graba el modelo de un archivo que se ha comprimido. (Tabla de Freq)
152 * \param shuff Puntero a la estructura usada para el estado del compresor.
153 * \return \b int Indica éxito de la operación. (1 Exito, 0 Error);
155 int shuff_savemodel(HUFF_STATE *shuff);
157 /** Carga un modelo de huffman (Tabla de Freq) para ser usando en Huff Canonico
159 * \param shuff Puntero a la estructura usada para el estado del compresor.
160 * \param modelfile Nombre del archivo que posee el modelo a cargar.
161 * \return \b int Indica éxito de la operación. (1 Exito, 0 Error);
163 int shuff_loadmodel(HUFF_STATE *shuff, char *modelfile);
165 #endif /* _STATICHUFF_H_ */