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:
| M | tfd.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;
+}