trafi

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

commit 6df1fa60d5ea4a59b1fbfe42c3ac7f2de0c00285
parent 24fb428a7205a50411b77ba260ea26bdb3aa404c
Auteur: Loïc Daignault-Pichette <loic@asteride.xyz>
Date:   Thu,  9 Apr 2026 11:04:19 -0400

Donner une zone tampon au segmenteur

Il n’est plus risqué pour l’interpréteur de ne pas vérifier si base + c dépasse
les bornes du segmenteur, puisque qu’il est maintenant garanti que, pour toute
base valide et pour tout c d’un octet, base + c tombe dans les limites du
segmenteur.

Diffstat:
Mtfd.c | 13+++++++++++++
1 fichier modifié, 13 insertions(+), 0 suppressions(-)

diff --git a/tfd.c b/tfd.c @@ -10,6 +10,9 @@ #define TAMPON_LNGR_DEF 64 +/* Renvoie le maximum de deux nombres. */ +#define MAX(n1, n2) ((n1) > (n2) ? (n1) : (n2)) + /* Écrire la valeur val dans le tampon te, en préservant le boutisme de * l’hôte. ecrire_16() écrit deux octets et ecrire_32() en écrit 4. * Renvoie un pointer vers l’octet suivant le dernier écrit. */ @@ -159,6 +162,7 @@ segmenteur(struct tfm *tfm) size_t isegm; /* Indice dans le segmenteur. */ size_t ietat, ntrans, itrans; ssize_t base; + size_t bmax; /* Base maximale. */ unsigned char c; assert(tfm); @@ -179,6 +183,9 @@ segmenteur(struct tfm *tfm) assert(ipile == 0); pile[ipile][0] = 0; pile[ipile][1] = 0; + + bmax = 1; + do { /* Dépiler. */ ipile = tampex_dpl(pile); @@ -209,6 +216,7 @@ segmenteur(struct tfm *tfm) goto erreur3; segm[base + c][0] = 1; /* Réserver la paire. */ segm[base + c][1] = (isegm << 1) | 0x00; + bmax = MAX(isegm, bmax); if ((ipile = tampex_empl((void **)&pile)) < 0) goto erreur3; pile[ipile][0] = base + c; @@ -223,6 +231,11 @@ segmenteur(struct tfm *tfm) tampex_libr(finaux); tampex_libr(pile); + /* Faire que les données du transducteur ne puissent interférer avec + * l’interprétation du segmenteur en assurant que la base la plus haute + * soit suivie par au moins 255 paires dans le segmenteur. */ + tampex_minim((void **)&segm, bmax + 255); + /* Désactiver les paires vides. */ for (isegm = 0; tampex_dedans(segm, isegm); isegm++) if (segm[isegm][0] == 0)