// automate-suff.c // << Algorithmique du texte >> // Maxime Crochemore, Christophe Hancart et Thierry Lecroq // Vuibert, 2001. #include <stdio.h> #include "chl.h" #include "automate-suff.h" static int compteur = 0; int *visite; Etat nouvelEtat() { Etat etat; etat = (Etat)malloc(sizeof(struct _etat)); if (etat == NULL) error("nouvelEtat"); etat->terminal = FAUX; etat->succ = NULL; etat->sortie = -1; // Merci à Johann Pelfrêne etat->suppleant = NULL; etat->nom = compteur++; return(etat); } void fixerCible(Etat etat, Etiquette a, Etat cible) { Succ succ; succ = (Succ)malloc(sizeof(struct _succ)); if (succ == NULL) error("fixerCible"); succ->etiquette = a; succ->cible = cible; succ->suivant = etat->succ; etat->succ = succ; cible->parent = etat; } void oterCible(Etat etat, Etiquette a) { Succ del, succ; // il existe une transition de etat par a succ = etat->succ; if (succ->etiquette.position == a.position && succ->etiquette.longueur == a.longueur) { etat->succ = succ->suivant; free(succ); } else { while (succ->suivant->etiquette.position != a.position || succ->suivant->etiquette.longueur != a.longueur) succ = succ->suivant; del = succ->suivant; succ->suivant = del->suivant; free(del); } } Etat cible(Etat etat, Etiquette a) { Succ succ; succ = etat->succ; while (succ != NULL) { if (succ->etiquette.position == a.position && succ->etiquette.longueur == a.longueur) return(succ->cible); else succ = succ->suivant; } return(NULL); } Etat cibleParUneLettre(Etat etat, Lettre a, Mot y) { Succ succ; succ = etat->succ; while (succ != NULL) { if (y[succ->etiquette.position] == a) return(succ->cible); else succ = succ->suivant; } return(NULL); } Etiquette etiq(Etat p, Etat q) { Succ succ; // il existe une transition de p a q succ = p->succ; while (VRAI) { if (succ->cible == q) return(succ->etiquette); else succ = succ->suivant; } } Automate nouvelAutomate() { Automate automate; automate = (Automate)malloc(sizeof(struct _automate)); if (automate == NULL) error("nouvelAutomate"); automate->initial = nouvelEtat(); automate->initial->parent = NULL; return(automate); } void ecrireEtat(Etat etat) { Succ succ; if (!visite[etat->nom]) { visite[etat->nom] = VRAI; printf("état %d sortie : %d", etat->nom, etat->sortie); if (terminal(etat)) printf(" terminal"); printf("\n"); succ = etat->succ; while (succ != NULL) { printf(" delta(%d, (%d,%d)) = %d\n", etat->nom, succ->etiquette.position, succ->etiquette.longueur, succ->cible->nom); ecrireEtat(succ->cible); succ = succ->suivant; } } } void ecrireAutomate(Automate automate) { visite = (int *)calloc(compteur, sizeof(int)); if (visite == NULL) error("ecrireAutomate"); ecrireEtat(initial(automate)); free(visite); }