trafi

Transducteurs finis
git clone git://git.asteride.xyz/trafi.git
Journaux | Fichiers | Références

commit f177c026e0aac4cf6d94bff67954b6277bd5a99e
parent 0967d88492c60e14aeb5be6282d0ea698c5b19fa
Auteur: Loïc Daignault-Pichette <loic@asteride.xyz>
Date:   Wed,  8 Apr 2026 22:28:38 -0400

Préparer la création du transducteur

Diffstat:
Mtfd.c | 31++++++++++++++++++++++++++++++-
1 fichier modifié, 30 insertions(+), 1 suppression(-)

diff --git a/tfd.c b/tfd.c @@ -43,6 +43,10 @@ static struct tfm *automate_symbs(struct tfm *tfm, uint32_t **finaux); * Renvoie un pointeur vers un tampex, ou NULL en cas d’erreur. */ static uint16_t *symboles_entree(struct tfm *tfm); +/* Créer le transducteur à parir d’un tfm. + * Renvoie un pointeur vers un tampex, ou NULL en cas d’erreur. */ +static void *transducteur(struct tfm *tfm); + int tfd_ecrire(FILE *f, struct tfm *tfm) { @@ -86,8 +90,10 @@ tfd_ecrire(FILE *f, struct tfm *tfm) if ((te = segmenteur(tfm)) == NULL) return -1; lngr = tampex_esp(te); - if (fwrite(te, 1, lngr, f) != lngr) + if (fwrite(te, 1, lngr, f) != lngr) { + tampex_libr(te); return -1; + } tampex_libr(te); pent = ecrire_32(pent, dec); pent = ecrire_32(pent, lngr); @@ -95,7 +101,16 @@ tfd_ecrire(FILE *f, struct tfm *tfm) dec += lngr; /* Écrire le transducteur. */ + if ((te = transducteur(tfm)) == NULL) + return -1; + lngr = tampex_esp(te); + if (fwrite(te, 1, lngr, f) != lngr) { + tampex_libr(te); + return -1; + } pent = ecrire_32(pent, dec); + pent = ecrire_32(pent, lngr); + tampex_libr(te); /* Écrire l’entête. */ if (fseek(f, 0, SEEK_SET) != 0) @@ -433,3 +448,17 @@ erreur1: tampex_libr(se); return NULL; } + +static void * +transducteur(struct tfm *tfm) +{ + uint16_t *trans; + + assert(tfm); + + /* Initialiser le transducteur. */ + if ((trans = tampex_init(TAMPON_LNGR_DEF, sizeof(uint16_t))) == NULL) + return NULL; + + return trans; +}