Something went wrong. Try again.
Program that implements different compression methods: LZ-77, LZ-78, and LZW. Created during my student years.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212#include "lzw.h"#include "lz78.h"#include "types.h"
using namespace std;
/** * \mainpage Métodos de compresión basados en diccionarios. * * \section notas Notas previas * * <ul> * <li> LZ78 </li> * * Se ha implementado un control del número mínimo de bits * necesarios para codificar el entero en cada tupla de la * codificación. * * <li> LZW </li> * * Los índices de la codificación están formados por * un primer byte que indica el numero de bytes siguientes que contienen * el número del índice del diccionario. * * </ul> * * \section install Compilar * * Para compilar el programa principal basta con ejecutar: <br> * <code> * $make * </code> * * Para compilar los programas de pruebas hay que ejecutar: <br> * * <code> * $make test * </code> * * o * <code> * $cd test * $make * </code> * * \section help Ejecución * * Modo de empleo del programa principal: * * <p>$dicpres (modo) [opciones] fichero-entrada [fichero-salida]</p> * * Opciones:<br /> * --help : Muestra este texto de ayuda.<br /> * -v : Activa el modo verbose, sacando por pantalla información * de depuración.<br /> * * Modo:<br /> * -c : Comprime.<br /> * -e : Descomprime.<br /> * * Metodos:<br /> * -lz78 : Comprime con el método del LZ78 (Por defecto).<br /> * -lzw : Comprime con el método del LZW.<br /> * * \section source Código fuente * * El código fuente del proyecto, además de estar adjunto, * está disponible en la siguiente dirección: <br /> * * http://code.google.com/p/dicpres * * También está disponible el código en un repositorio * de Subversion, accesible desde el anterior enlace. * */int main (int argc, char * argv[]) { bool bError = false;
bool bLZ78 = true; // Por defecto. bool bLZW = false; bool bHelp = false; bool bVerbose = false;
bool bCompress = false; bool bExtract = false;
string sFileIn; string sFileOut;
if (argc == 1) bError = true;
for (int i = 1; i < argc; i++) { if (argv[i][0] == '-') { /** * Estamos en el caso de que sea una opción. */ string sOption(argv[i]); if (sOption == "-lzw") { bLZW = true; bLZ78 = false; } else if (sOption == "-lz78"){ bLZ78 = true; } else if (sOption == "-v") { bVerbose = true; } else if (sOption == "--help") { bHelp = true; } else if (sOption == "-c") { bCompress = true; } else if (sOption == "-e") { bExtract = true; } else { bError = true; } } else { /** * Es un fichero. */ if (sFileIn == "") { sFileIn = argv[i]; } else if ( sFileIn != "" && sFileOut == ""){ sFileOut = argv[i]; } else { bError = true; } } }
if (bCompress && bExtract) bError = true; if (!bCompress && !bExtract) bError = true; if (bLZW && bLZ78) bError = true; if (!bLZW && !bLZ78) bError = true; if (sFileIn == "") bError = true;
if (bHelp) bError = false;
if (bError) { cerr << "Modo de empleo:\n" << argv[0] << " (modo) [opciones] fichero-entrada [fichero-salida]" << endl; cerr << "Use la opción --help para optener más ayuda." << endl; return 0; }
if (bHelp) { /** * Mostrar ayuda. */ cout << "Comprime ficheros únicos mediante métodos de diccionario.\n"<< endl; cout << "Modo de empleo: " << endl; cout << argv[0] <<" (modo) [opciones] fichero-entrada [fichero-salida]" << endl << endl; cout << "Opciones:" << endl; cout << "--help : Muestra este texto de ayuda." << endl; cout << "-v : Activa el modo verbose, sacando por pantalla información" << endl; cout << " de depuración." << endl << endl; cout << "Modo:" << endl; cout << "-c : Comprime." << endl; cout << "-e : Descomprime." << endl << endl; cout << "Metodos:" << endl; cout << "-lz78 : Comprime con el método del LZ78 (Por defecto)." << endl; cout << "-lzw : Comprime con el método del LZW." << endl << endl; cout << "Autores: Iván Rodríguez Sastre & Marcos Gabarda Inal" << endl; cout << "GPL 3.0" << endl; } else { /** * Ejecutar. */ if (bCompress) { /** * Modo compresión. */ if (bLZ78) { /** * Método LZ78. */ lz78 tmp; if (sFileOut == "") sFileOut = sFileIn + ".lz78"; tmp.readFile(sFileIn); tmp.compress(sFileOut); } else if (bLZW) { /** * Método LZW. */ lzw tmp(bVerbose); if (sFileOut == "") sFileOut = sFileIn + ".lzw"; tmp.compress(sFileIn, sFileOut); } } else if (bExtract){ /** * Modo descompresión. */ if (bLZ78) { /** * Método LZ78. */ lz78 tmp; if (sFileOut == "") sFileOut = sFileIn + ".unlz78"; tmp.readCom(sFileIn); tmp.uncompress(sFileOut); } else if (bLZW) { /** * Método LZW. */ lzw tmp(bVerbose); if (sFileOut == "") sFileOut = sFileIn + ".unlzw"; tmp.uncompress(sFileIn, sFileOut); } } }
return 0;}