/*************************************************************************************************************************************/
/* */
/* 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
{
}
}
}