/*************************************************************************************************************************************/ /* */ /* C O M P R E S S I O N D ' U N E C H A I N E : */ /* */ /* */ /* Author of '$xtc/Compression.11$vv$I' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20151224094722). */ /* */ /*************************************************************************************************************************************/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N G E N E R A L E S : */ /* */ /*************************************************************************************************************************************/ int Compression_EditerCompressionBits=VRAI; /* Indicateurs de controle des editions... */ #include "BurrowsWheeler.11.vv.I" #define CodageDeHuffman_FIN_DE_CHAINE \ 0 \ /* Afin de ne pas prevoir de caractere de fin de chaine... */ #include "RunLengthEncoding.11.vv.I" #include "HuffmanCoding.01.vv.I" #define Compression_INDEXN \ NombreVersIndex(Compression_LongueurDeToutesLesChaines) int Compression_LongueurDeToutesLesChaines; CHAR *Compression_ChaineACompresser; CHAR *Compression_ChaineDEcompressee; /*************************************************************************************************************************************/ /* */ /* I N I T I A L I S A T I O N D E L A C H A I N E A T R A I T E R : */ /* */ /*************************************************************************************************************************************/ #define Compression_InitialisationChaineATraiter(ChaineR,ChaineA,LongueurChaineA) \ { \ int IndexCaractere; \ \ Compression_LongueurDeToutesLesChaines = LongueurChaineA; \ /* ATTENTION : en toute generalite dans 'ChaineA' les 256 codes possibles peuvent */ \ /* etre presents et donc 'strlen(...)' ne peut pas fonctionner systematiquement. C'est */ \ /* pourquoi un pramatre de longueur 'LongueurChaineA' doit apparaitre explicitement... */ \ \ ChaineR = malloc(Compression_LongueurDeToutesLesChaines); \ \ for (IndexCaractere=INDEX0 ; IndexCaractere <= Compression_INDEXN ; IndexCaractere++) \ { \ ACCES_CHAINE(ChaineR,IndexCaractere) = ChaineA[IndexCaractere]; \ } \ } #define Compression_DesinitialisationChaineATraiter(ChaineA) \ { \ free(ChaineA); \ } /*************************************************************************************************************************************/ /* */ /* V E R I F I C A T I O N D U P R O C E S S U S C O M P L E T : */ /* */ /*************************************************************************************************************************************/ void Compression_Verifications(CHAR *ChaineA1,CHAR *ChaineA2) { int IndexCaractere; for (IndexCaractere=INDEX0 ; IndexCaractere <= Compression_INDEXN ; IndexCaractere++) { if (ACCES_CHAINE(ChaineA1,IndexCaractere) != ACCES_CHAINE(ChaineA2,IndexCaractere)) { fprintf(stderr ,"ERREUR(Compression) : chaine retablie ('0x%02x') # chaine a traiter ('0x%02x').\n" ,ACCES_CHAINE(ChaineA1,IndexCaractere) ,ACCES_CHAINE(ChaineA2,IndexCaractere) ); } else { } } }