/*************************************************************************************************************************************/
/* */
/* T R A N S F O R M A T I O N D E B U R R O W S - W H E E L E R E T I N V E R S E : */
/* */
/* */
/* Author of '$xtc/BurrowsWheeler.11$vv$I' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20151223080447). */
/* */
/*************************************************************************************************************************************/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N G E N E R A L E S : */
/* */
/*************************************************************************************************************************************/
int TransformationDeBurrowsWheeler_EditeLaMatrice=FAUX;
int TransformationDeBurrowsWheeler_EditerLesChaines=VRAI;
int TransformationDeBurrowsWheeler_EditionsHexaDecimalesDesChaines=FAUX;
/* Indicateurs de controle des editions... */
#ifndef CHAR
# define CHAR \
unsigned char \
/* Afin que tous les tests effectues fonctionnent correctement et que les relations */ \
/* d'odre soient bien celles que l'on attend, il est a priori necessaire que les */ \
/* caracteres soient non signes... */
#else
#endif
#ifndef FORMAT_CARACTERE
# define FORMAT_CARACTERE \
COND((TransformationDeBurrowsWheeler_EditionsHexaDecimalesDesChaines == VRAI),"%02x ","%c") \
/* Format d'edition des caracteres des chaines et de la matrice... */
#else
#endif
#define BurrowsWheeler_INDEXN \
NombreVersIndex(TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines)
int TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines;
/* On notera qu'a priori, aucune des chaines utilisees n'a de caractere de fin. Cela */
/* vient du fait que ces chaines peuvent contenir 256 codes differents et qu'alors le */
/* code '0x00' habituel ne peut etre utilise. La fin d'une chaine est donc reperee via */
/* son dernier caractere d'index 'INDEXN'... */
#ifndef ACCES_CHAINE
# define ACCES_CHAINE(Chaine,IndexCaractere) \
*(Chaine+IndexCaractere) \
/* Acces a une chaine quelconque... */
#else
#endif
CHAR *TransformationDeBurrowsWheeler_ChaineAPermuter;
#define SIZE_IndexDeLaChaineAPermuterDansLaMatrice \
(sizeof(TransformationDeBurrowsWheeler_IndexDeLaChaineAPermuterDansLaMatrice)*NBITOC)
int TransformationDeBurrowsWheeler_IndexDeLaChaineAPermuterDansLaMatrice;
/* Definition de la chaine Argument a permuter... */
CHAR *TransformationDeBurrowsWheeler_ChainePermutee;
/* Definition de la version permutee de 'ChaineAPermuter'... */
CHAR *TransformationDeBurrowsWheeler_ChainePermuteeTriee;
int *TransformationDeBurrowsWheeler_CaracteresNombreOccurence;
/* Definition de la version permutee et triee de 'ChaineAPermuter'... */
CHAR *TransformationDeBurrowsWheeler_ChaineRetablie;
/* Definition de la chaine "depermutee" qui doit donc etre identique a 'ChaineAPermuter'... */
#define MATRICE(IndexLigne,IndexColonne) \
*(TransformationDeBurrowsWheeler_Matrice \
+((IndexLigne*TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines)+IndexColonne) \
)
CHAR *TransformationDeBurrowsWheeler_Matrice;
/* Definition de la matrice contenant 'ChaineAPermuter' et toutes ses permutations */
/* circulaires possibles. */
#define PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne) \
*(TransformationDeBurrowsWheeler_PermutationDesLignesDeLaMatrice+IndexLigne)
int *TransformationDeBurrowsWheeler_PermutationDesLignesDeLaMatrice;
/* Definition du tri par ordre croissant des differentes lignes de 'Matrice' via cette */
/* liste de permutation... */
/*************************************************************************************************************************************/
/* */
/* T R I S E N ' N . L O G ( N ) ' D E C H A I N E S Q U E L C O N Q U E S : */
/* */
/*************************************************************************************************************************************/
enum RelationsDOrdre
{
INFERIEUR=-1
,EGAL
,SUPERIEUR
};
/* Liste des trois relations d'ordre possibles. */
int TransformationDeBurrowsWheeler_ComparaisonDeDeuxChaines(int IndexLigne_1
,int IndexLigne_2
,int IndexColonneMinimal
,int IndexColonneMaximal
)
{
int IndexColonne=IndexColonneMinimal;
int PoursuivreLaComparaison=VRAI;
int ResultatDeLaComparaisonDeDeuxChaines;
while (PoursuivreLaComparaison == VRAI)
{
if (MATRICE(PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne_1),IndexColonne)
< MATRICE(PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne_2),IndexColonne)
)
{
ResultatDeLaComparaisonDeDeuxChaines = INFERIEUR;
PoursuivreLaComparaison = FAUX;
}
else
{
if (MATRICE(PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne_1),IndexColonne)
== MATRICE(PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne_2),IndexColonne)
)
{
ResultatDeLaComparaisonDeDeuxChaines = EGAL;
}
else
{
ResultatDeLaComparaisonDeDeuxChaines = SUPERIEUR;
PoursuivreLaComparaison = FAUX;
}
}
if (PoursuivreLaComparaison == VRAI)
{
if (IndexColonne < IndexColonneMaximal)
{
IndexColonne++;
}
else
{
PoursuivreLaComparaison = FAUX;
}
}
else
{
}
}
return(ResultatDeLaComparaisonDeDeuxChaines);
}
#define ECHANGE_DE_DEUX_CHAINES(IndexLigne_1,IndexLigne_2) \
{ \
int VariableDeManoeuvre=PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne_1); \
PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne_1) = PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne_2); \
PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne_2) = VariableDeManoeuvre; \
/* Permutation "virtuelle" des lignes de la matrice... */ \
}
int TransformationDeBurrowsWheeler_Reorganisation(int IndexLigneDebut
,int IndexLigneFin
,int IndexColonneMinimal
,int IndexColonneMaximal
)
{
int IndexLigne=IndexLigneDebut;
int ItererLaReorganisation=VRAI;
while (ItererLaReorganisation == VRAI)
{
int IndexLigneGauche=2*IndexLigne;
if (IndexLigneGauche > IndexLigneFin)
{
ItererLaReorganisation = FAUX;
}
else
{
int IndexMaximal=IndexLigneGauche;
int IndexLigneDroite=IndexLigneGauche+1;
if (IndexLigneDroite > IndexLigneFin)
{
}
else
{
if (TransformationDeBurrowsWheeler_ComparaisonDeDeuxChaines(IndexLigneGauche
,IndexLigneDroite
,IndexColonneMinimal
,IndexColonneMaximal
)
< 0
)
{
IndexMaximal = IndexLigneDroite;
}
else
{
}
}
if (TransformationDeBurrowsWheeler_ComparaisonDeDeuxChaines(IndexMaximal
,IndexLigne
,IndexColonneMinimal
,IndexColonneMaximal
)
<= 0
)
{
ItererLaReorganisation = FAUX;
}
else
{
ECHANGE_DE_DEUX_CHAINES(IndexLigne,IndexMaximal);
IndexLigne = IndexMaximal;
}
}
}
return(VRAI);
}
void TransformationDeBurrowsWheeler_TriRapideDeLEnsembleDesChaines(int IndexLigneDebut
,int IndexLigneFin
,int IndexColonneMinimal
,int IndexColonneMaximal
)
{
int IndexLigne=IndexLigneFin/2;
while (IndexLigne >= IndexLigneDebut)
{
TransformationDeBurrowsWheeler_Reorganisation(IndexLigne,IndexLigneFin,IndexColonneMinimal,IndexColonneMaximal);
IndexLigne = IndexLigne-1;
}
IndexLigne = IndexLigneFin;
while (IndexLigne > IndexLigneDebut)
{
ECHANGE_DE_DEUX_CHAINES(IndexLigneDebut,IndexLigne);
IndexLigne = IndexLigne-1;
TransformationDeBurrowsWheeler_Reorganisation(IndexLigneDebut,IndexLigne,IndexColonneMinimal,IndexColonneMaximal);
}
}
/*************************************************************************************************************************************/
/* */
/* E D I T I O N S D I V E R S E S : */
/* */
/*************************************************************************************************************************************/
#define BurrowsWheeler_EDITION_D_UNE_CHAINE(EditionPreliminaire,ChaineA) \
{ \
if (TransformationDeBurrowsWheeler_EditerLesChaines == VRAI) \
{ \
int IndexCaractere; \
\
EditionPreliminaire; \
\
for (IndexCaractere=INDEX0 ; IndexCaractere <= BurrowsWheeler_INDEXN ; IndexCaractere++) \
{ \
printf(FORMAT_CARACTERE,ACCES_CHAINE(ChaineA,IndexCaractere)); \
} \
\
printf("\n"); \
} \
else \
{ \
} \
}
#define EDITION_DE_LA_MATRICE(operateur) \
{ \
if (TransformationDeBurrowsWheeler_EditeLaMatrice == VRAI) \
{ \
int IndexLigne; \
\
printf("\n"); \
\
for (IndexLigne=INDEX0 ; IndexLigne <= BurrowsWheeler_INDEXN ; IndexLigne++) \
{ \
int IndexColonne; \
\
for (IndexColonne=0 ; IndexColonne <= BurrowsWheeler_INDEXN ; IndexColonne++) \
{ \
printf(FORMAT_CARACTERE,MATRICE(operateur(IndexLigne),IndexColonne)); \
} \
\
printf("\n"); \
} \
\
printf("\n"); \
} \
else \
{ \
} \
}
/*************************************************************************************************************************************/
/* */
/* 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 TransformationDeBurrowsWheeler_InitialisationChaineATraiter(ChaineR,ChaineA,LongueurChaineA) \
{ \
int IndexCaractere; \
\
TransformationDeBurrowsWheeler_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(TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines); \
\
for (IndexCaractere=INDEX0 ; IndexCaractere <= BurrowsWheeler_INDEXN ; IndexCaractere++) \
{ \
ACCES_CHAINE(ChaineR,IndexCaractere) = ChaineA[IndexCaractere]; \
} \
}
#define TransformationDeBurrowsWheeler_DesinitialisationChaineATraiter(ChaineA) \
{ \
free(ChaineA); \
}
/*************************************************************************************************************************************/
/* */
/* T R A N S F O R M A T I O N D E B U R R O W S - W H E E L E R D I R E C T E : */
/* */
/*************************************************************************************************************************************/
#define GenerationDeLaChainePermutee(ChaineR) \
{ \
int IndexLigne; \
\
for (IndexLigne=INDEX0 ; IndexLigne <= BurrowsWheeler_INDEXN ; IndexLigne++) \
{ \
ACCES_CHAINE(ChaineR,IndexLigne) \
= MATRICE(PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne),BurrowsWheeler_INDEXN); \
/* Version permutee de la chaine initiale 'ChaineAPermuter'. Elle est en fait constituee */ \
/* de la derniere colonne ('INDEXN') de la matrice 'Matrice'... */ \
\
if (PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne) == INDEX0) \
{ \
TransformationDeBurrowsWheeler_IndexDeLaChaineAPermuterDansLaMatrice = IndexLigne; \
/* Memorisation de l'index de la ligne de la matrice 'Matrice' contenant dans le bon */ \
/* ordre la chaine Argument... */ \
} \
else \
{ \
} \
} \
\
BurrowsWheeler_EDITION_D_UNE_CHAINE({ \
printf("%08d " \
,TransformationDeBurrowsWheeler_IndexDeLaChaineAPermuterDansLaMatrice \
); \
} \
,ChaineR \
); \
}
#define TransformationDeBurrowsWheeler_InitialisationTransformationDirecte(ChaineA) \
{ \
TransformationDeBurrowsWheeler_Matrice \
= malloc(TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines \
*TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines \
); \
TransformationDeBurrowsWheeler_PermutationDesLignesDeLaMatrice \
= malloc(TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines*sizeof(int)); \
ChaineA = malloc(TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines); \
/* Allocations memoire diverses... */ \
}
#define TransformationDeBurrowsWheeler_TransformationDirecte(ChaineR,ChaineA) \
{ \
int IndexLigne; \
\
for (IndexLigne=INDEX0 ; IndexLigne <= BurrowsWheeler_INDEXN ; IndexLigne++) \
{ \
int IndexColonne; \
\
PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne) = IndexLigne; \
/* Initialisation neutre a priori du tri de toutes les chaines... */ \
\
for (IndexColonne=0 ; IndexColonne <= BurrowsWheeler_INDEXN ; IndexColonne++) \
{ \
int IndexCaractere=IndexColonne-IndexLigne; \
\
if (IndexCaractere < 0) \
{ \
IndexCaractere = IndexCaractere \
+TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines; \
} \
else \
{ \
} \
\
MATRICE(IndexLigne,IndexColonne) = ChaineA[IndexCaractere]; \
/* Permutations circulaires de 'ChaineAPermuter'... */ \
} \
} \
\
EDITION_DE_LA_MATRICE(PERMUTATION_DES_LIGNES_DE_LA_MATRICE); \
\
TransformationDeBurrowsWheeler_TriRapideDeLEnsembleDesChaines(INDEX0,BurrowsWheeler_INDEXN \
,INDEX0,BurrowsWheeler_INDEXN \
); \
\
EDITION_DE_LA_MATRICE(PERMUTATION_DES_LIGNES_DE_LA_MATRICE); \
\
GenerationDeLaChainePermutee(ChaineR); \
}
#define TransformationDeBurrowsWheeler_DesinitialisationsTransformationDirecte() \
{ \
free(TransformationDeBurrowsWheeler_PermutationDesLignesDeLaMatrice); \
free(TransformationDeBurrowsWheeler_Matrice); \
}
/*************************************************************************************************************************************/
/* */
/* T R A N S F O R M A T I O N D E B U R R O W S - W H E E L E R I N V E R S E ( V E R S I O N 01 ) : */
/* */
/*************************************************************************************************************************************/
#define GenerationDeLaChaineRetablie(ChaineR) \
{ \
int IndexCaractere; \
\
for (IndexCaractere=INDEX0 ; IndexCaractere <= BurrowsWheeler_INDEXN ; IndexCaractere++) \
{ \
ACCES_CHAINE(ChaineR,IndexCaractere) \
= MATRICE(PERMUTATION_DES_LIGNES_DE_LA_MATRICE \
(TransformationDeBurrowsWheeler_IndexDeLaChaineAPermuterDansLaMatrice) \
,IndexCaractere \
); \
} \
}
#define TransformationDeBurrowsWheeler_InitialisationTransformationInverse_01(ChaineR) \
{ \
TransformationDeBurrowsWheeler_Matrice \
= malloc(TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines \
*TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines \
); \
TransformationDeBurrowsWheeler_PermutationDesLignesDeLaMatrice \
= malloc(TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines*sizeof(int)); \
ChaineR = malloc(TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines); \
/* Allocations memoire diverses... */ \
}
#define TransformationDeBurrowsWheeler_TransformationInverse_01(ChaineR,ChaineA) \
{ \
int IndexColonne; \
\
for (IndexColonne=INDEX0 ; IndexColonne <= BurrowsWheeler_INDEXN ; IndexColonne++) \
{ \
int IndexLigne; \
\
for (IndexLigne=INDEX0 ; IndexLigne <= BurrowsWheeler_INDEXN ; IndexLigne++) \
{ \
MATRICE(IndexLigne,IndexColonne) = 0; \
/* Initialisation de la matrice : ceci est en fait inutile car cette derniere est remplie */ \
/* colonne par colonne (en partant de la colonne de droite 'INDEXN') et que n'est utilise */ \
/* que le sous-ensemble de colonnes qui ont ete remplies. */ \
} \
} \
\
for (IndexColonne=BurrowsWheeler_INDEXN ; IndexColonne >= INDEX0 ; IndexColonne--) \
{ \
int IndexLigne; \
\
for (IndexLigne=INDEX0 ; IndexLigne <= BurrowsWheeler_INDEXN ; IndexLigne++) \
{ \
if (IndexColonne == BurrowsWheeler_INDEXN) \
{ \
PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne) = IndexLigne; \
/* Initialisation neutre a priori du tri de toutes les chaines... */ \
} \
else \
{ \
} \
\
MATRICE(PERMUTATION_DES_LIGNES_DE_LA_MATRICE(IndexLigne),IndexColonne) \
= ACCES_CHAINE(ChaineA,IndexLigne); \
/* La chaine permutee est introduite dans l'ordre du classement courant en tant que */ \
/* colonne courante de gauche ('IndexColonne'). */ \
} \
\
EDITION_DE_LA_MATRICE(PERMUTATION_DES_LIGNES_DE_LA_MATRICE); \
\
TransformationDeBurrowsWheeler_TriRapideDeLEnsembleDesChaines(INDEX0,BurrowsWheeler_INDEXN \
,IndexColonne,BurrowsWheeler_INDEXN \
); \
\
EDITION_DE_LA_MATRICE(PERMUTATION_DES_LIGNES_DE_LA_MATRICE); \
} \
\
GenerationDeLaChaineRetablie(ChaineR); \
/* La chaine Argment est retrouvee sur la ligne 'IndexDeLaChaineAPermuterDansLaMatrice' */ \
/* le la matrice 'Matrice'. */ \
\
BurrowsWheeler_EDITION_D_UNE_CHAINE({},ChaineR); \
}
#define TransformationDeBurrowsWheeler_DesinitialisationsTransformationInverse_01(ChaineA1,ChaineA2) \
{ \
free(ChaineA1); \
free(ChaineA2); \
\
free(TransformationDeBurrowsWheeler_PermutationDesLignesDeLaMatrice); \
free(TransformationDeBurrowsWheeler_Matrice); \
}
/*************************************************************************************************************************************/
/* */
/* T R A N S F O R M A T I O N D E B U R R O W S - W H E E L E R I N V E R S E ( V E R S I O N 02 ) : */
/* */
/*************************************************************************************************************************************/
#define TransformationDeBurrowsWheeler_InitialisationTransformationInverse_02(ChaineR) \
{ \
ChaineR = malloc(TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines); \
/* Allocations memoire diverses... */ \
}
#define TransformationDeBurrowsWheeler_echang(index1,index2) \
{ \
CHAR tempo=ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee,index1); \
ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee,index1) \
= ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee,index2); \
ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee,index2) = tempo; \
}
int TransformationDeBurrowsWheeler_reorg(int debut,int fin)
{
int j=debut;
int iter=VRAI;
while (iter==VRAI)
{
int gauche=2*j;
if (gauche>fin)
{
iter=FAUX;
}
else
{
int indmax=gauche;
int droite=gauche+1;
if (droite>fin)
{
}
else
{
if (ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee,gauche)
< ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee,droite)
)
{
indmax=droite;
}
else
{
}
}
if (ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee,indmax)
<= ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee,j)
)
{
iter=FAUX;
}
else
{
TransformationDeBurrowsWheeler_echang(j,indmax);
j=indmax;
}
}
}
return(VRAI);
}
int TransformationDeBurrowsWheeler_tri(int debut,int fin)
{
int index=fin/2;
while (index>=debut)
{
TransformationDeBurrowsWheeler_reorg(index,fin);
index=index-1;
}
index=fin;
while (index>debut)
{
TransformationDeBurrowsWheeler_echang(debut,index);
index=index-1;
TransformationDeBurrowsWheeler_reorg(debut,index);
}
return(VRAI);
}
#define TransformationDeBurrowsWheeler_TransformationInverse_02(ChaineR,ChaineA) \
{ \
int Index; \
\
TransformationDeBurrowsWheeler_ChainePermuteeTriee \
= malloc(TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines \
); \
TransformationDeBurrowsWheeler_CaracteresNombreOccurence \
= malloc(TransformationDeBurrowsWheeler_LongueurDeToutesLesChaines*sizeof(int) \
); \
\
for (Index=INDEX0 ; Index <= BurrowsWheeler_INDEXN ; Index++) \
{ \
ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee,Index) \
= ACCES_CHAINE(ChaineA,Index); \
} \
\
if (FAUX) \
/* Cas du tri en N^2 : */ \
{ \
int index_de_fin; \
\
for (index_de_fin=(BurrowsWheeler_INDEXN-1) ; index_de_fin>=INDEX0 ; index_de_fin=index_de_fin-1) \
{ \
int index_de_debut; \
\
for (index_de_debut=INDEX0 \
; index_de_debut<=index_de_fin \
; index_de_debut=index_de_debut+1 \
) \
{ \
if (ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee \
,index_de_debut \
) \
> ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee \
,index_de_debut+1 \
) \
) \
{ \
CHAR caractere_manoeuvre; \
caractere_manoeuvre \
= ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee \
,index_de_debut \
); \
ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee \
,index_de_debut \
) \
= ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee \
,index_de_debut+1 \
); \
ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee \
,index_de_debut+1 \
) \
= caractere_manoeuvre; \
/* Tri en N^2 de la chaine permutee... */ \
} \
else \
{ \
} \
} \
} \
} \
else \
{ \
/* Cas du tri en N.log(N) : */ \
TransformationDeBurrowsWheeler_tri(INDEX0,BurrowsWheeler_INDEXN); \
} \
\
int NombreOccurence=1; \
\
ACCES_CHAINE(TransformationDeBurrowsWheeler_CaracteresNombreOccurence,INDEX0) = NombreOccurence; \
\
for (Index=INDEX0+1 ; Index <= BurrowsWheeler_INDEXN ; Index++) \
{ \
if (ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee,Index-1) \
== ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee,Index) \
) \
{ \
NombreOccurence++; \
} \
else \
{ \
NombreOccurence=1; \
} \
ACCES_CHAINE(TransformationDeBurrowsWheeler_CaracteresNombreOccurence,Index)=NombreOccurence; \
} \
\
int index_caractere = TransformationDeBurrowsWheeler_IndexDeLaChaineAPermuterDansLaMatrice; \
\
for (Index=INDEX0 ; Index <= BurrowsWheeler_INDEXN ; Index++) \
{ \
CHAR caractere_courant \
=ACCES_CHAINE(TransformationDeBurrowsWheeler_ChainePermuteeTriee,index_caractere); \
int NombreOccurenceCourant \
=ACCES_CHAINE(TransformationDeBurrowsWheeler_CaracteresNombreOccurence,index_caractere); \
\
ACCES_CHAINE(ChaineR,Index) = caractere_courant; \
\
int index_recherche=INDEX0; \
int iterer=VRAI; \
\
NombreOccurence=1; \
\
while (iterer == VRAI) \
{ \
if (ACCES_CHAINE(ChaineA,index_recherche) == caractere_courant) \
{ \
if (NombreOccurenceCourant == NombreOccurence) \
{ \
index_caractere = index_recherche; \
iterer = FAUX; \
} \
else \
{ \
NombreOccurence++; \
} \
} \
else \
{ \
} \
\
if (index_recherche < BurrowsWheeler_INDEXN) \
{ \
index_recherche++; \
} \
else \
{ \
iterer = FAUX; \
} \
} \
} \
\
free(TransformationDeBurrowsWheeler_CaracteresNombreOccurence); \
free(TransformationDeBurrowsWheeler_ChainePermuteeTriee); \
}
#define TransformationDeBurrowsWheeler_DesinitialisationsTransformationInverse_02(ChaineA1,ChaineA2) \
{ \
}
/*************************************************************************************************************************************/
/* */
/* 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 TransformationDeBurrowsWheeler_Verifications(CHAR *ChaineA1,CHAR *ChaineA2)
{
int IndexCaractere;
for (IndexCaractere=INDEX0 ; IndexCaractere <= BurrowsWheeler_INDEXN ; IndexCaractere++)
{
if (ACCES_CHAINE(ChaineA1,IndexCaractere) != ACCES_CHAINE(ChaineA2,IndexCaractere))
{
fprintf(stderr
,"ERREUR(BurrowsWheeler) : chaine retablie ('0x%02x') # chaine a traiter ('0x%02x').\n"
,ACCES_CHAINE(ChaineA1,IndexCaractere)
,ACCES_CHAINE(ChaineA2,IndexCaractere)
);
}
else
{
}
}
}