// interdits.c
// << Algorithmique du texte >>
// Maxime Crochemore, Christophe Hancart et Thierry Lecroq
// Vuibert, 2001.
#include <stdio.h>
#include "chl.h"
#include "cellule.h"
#include "fifo.h"
#include "automate.h"
#include "couple.h"
Automate interdits(Automate Sy) {
Automate M;
Couple couple;
Etat p, pp, qp;
File L;
Lettre a;
int *visite;
visite = (int *)calloc(dernier(Sy)->nom + 1, sizeof(int));
if (visite == NULL) error("interdits");
M = nouvelAutomate();
L = fileVide();
visite[initial(Sy)->nom] = VRAI;
enfiler(L, nouveauCouple(initial(Sy), initial(M)));
while (!fileEstVide(L)) {
couple = (Couple)defilement(L);
p = couple->comp1;
pp = couple->comp2;
for (a = PREMIERELETTRE; a <= DERNIERELETTRE; ++a)
if (cible(p, a) == NULL &&
(p == initial(Sy) || cible(F(p), a) != NULL)) {
qp = nouvelEtat();
terminal(qp) = VRAI;
fixerCible(pp, a, qp);
}
else
if (cible(p, a) != NULL && !visite[cible(p, a)->nom]){
qp = nouvelEtat();
fixerCible(pp, a, qp);
visite[cible(p, a)->nom] = VRAI;
enfiler(L, nouveauCouple(cible(p, a), qp));
}
}
free(visite);
return(M);
}