commit 278d54dbaaa1f10be29572997388e231464373b1
parent 74e8ad8e7f1602e4f118e4fedde48df7a6adac27
Auteur: Loïc Daignault-Pichette <loic@asteride.xyz>
Date: Tue, 7 Apr 2026 11:29:12 -0400
Peaufiner tfm et l’adapter à tampex
La fonction tfm_nelem() a été retirée: elle était inutilisée.
Diffstat:
| M | tfm.c | | | 64 | ++++++++++++++++++++-------------------------------------------- |
| M | tfm.h | | | 9 | ++++----- |
2 fichiers modifiés, 24 insertions(+), 49 suppressions(-)
diff --git a/tfm.c b/tfm.c
@@ -70,21 +70,17 @@ tfm_libr(struct tfm *tfm)
int
tfm_ajt(struct tfm *tfm, size_t es, size_t ed, ssize_t se, ssize_t ss)
{
- void *tetp; /* Tampinf temporaire. */
- size_t itrans; /* Identifiant de transition. */
+ ssize_t itrans; /* Identifiant de transition. */
TFM_COHERENT(tfm);
/* Assurer que l’état source existe. */
- if ((tetp = tampex_minim(tfm->etats, es)) == NULL)
+ if (tampex_minim((void **)&tfm->etats, es) < 0)
return -1;
- tfm->etats = tetp;
/* Ajouter une transitions. */
- itrans = tampex_nelem(tfm->trans);
- if ((tetp = tampex_minim(tfm->trans, itrans)) == NULL)
+ if ((itrans = tampex_empl((void **)&tfm->trans)) < 0)
return -1;
- tfm->trans = tetp;
/* Construire la nouvelle transition. */
tfm->trans[itrans].se = se;
@@ -106,33 +102,27 @@ tfm_symb_id(struct tfm *tfm, char *symb, size_t lngr)
{
size_t i;
ssize_t id;
- char *tip;
TFM_COHERENT(tfm);
assert(symb);
assert(lngr > 0);
-
- /* Valider la taille du symbole. */
- if (lngr > TFM_TLL_SYMB_MAX)
- return -1;
+ assert(lngr <= TFM_TLL_SYMB_MAX);
/* La longueur de l’identifiant doit pouvoir entrer dans un octets. */
assert(TFM_TLL_SYMB_MAX <= 0xFF);
- if ((id = tfm_symb_chercher(tfm->symbs, symb, lngr)) >= 0)
- goto fin;
-
- /* Le symbole n’a pas été trouvé: l’ajouter. */
- i = id = tampex_nelem(tfm->symbs);
- if ((tip = tampex_minim(tfm->symbs, i + lngr)) == NULL)
- return -1;
- tfm->symbs = tip;
- tfm->symbs[i++] = (unsigned char) lngr;
- memcpy(tfm->symbs + i, symb, lngr);
+ if ((id = tfm_symb_chercher(tfm->symbs, symb, lngr)) < 0) {
+ /* Le symbole n’a pas été trouvé: l’ajouter. */
+ i = id = tampex_nelem(tfm->symbs);
+ if (tampex_minim((void **)&tfm->symbs, i + lngr) < 0)
+ return -1;
+ tfm->symbs[i++] = lngr;
+ memcpy(tfm->symbs + i, symb, lngr);
+ }
-fin:
assert(id >= 0);
TFM_COHERENT(tfm);
+
return id;
}
@@ -146,7 +136,9 @@ tfm_symb_obt(struct tfm *tfm, size_t id, char *symb, size_t max)
assert(max > 0);
assert(tampex_dedans(tfm->symbs, id));
- lngr = *(unsigned char *)(tfm->symbs + id);
+ lngr = *(tfm->symbs + id);
+
+ assert(lngr != 0);
/* Le symbole doit rentrer dans le tampon. */
if (lngr > max)
@@ -184,48 +176,32 @@ tfm_parc_symbs(struct tfm *tfm, size_t *id, char *symb, size_t max)
int
tfm_mfinal(struct tfm *tfm, size_t ietat)
{
- struct etat *tetp;
-
TFM_COHERENT(tfm);
/* Obtenir, modifier, puis écrire l’état. */
- if ((tetp = tampex_minim(tfm->etats, ietat)) == NULL)
+ if (tampex_minim((void **)&tfm->etats, ietat) < 0)
return -1;
- tfm->etats = tetp;
tfm->etats[ietat].final = 1;
TFM_COHERENT(tfm);
+
return 0;
}
int
tfm_tfinal(struct tfm *tfm, size_t ietat)
{
- struct etat *tetp;
-
TFM_COHERENT(tfm);
- if ((tetp = tampex_minim(tfm->etats, ietat)) == NULL)
+ if (tampex_minim((void **)&tfm->etats, ietat) < 0)
return -1;
return tfm->etats[ietat].final;
}
-ssize_t
-tfm_ntrans(struct tfm *tfm, size_t ietat)
-{
- struct etat *tetp;
-
- TFM_COHERENT(tfm);
-
- if ((tetp = tampex_minim(tfm->etats, ietat)) == NULL)
- return -1;
- return tfm->etats[ietat].ntrans;
-}
-
static ssize_t
tfm_symb_chercher(char *ti, char *symb, size_t lngr)
{
- unsigned pos;
+ size_t pos;
unsigned char n;
assert(ti);
diff --git a/tfm.h b/tfm.h
@@ -63,12 +63,15 @@ void tfm_libr(struct tfm *tfm);
/* Ajouter au transducteur tfm une transition de l’état es à l’état ed avec les
* symboles d’entrée et de sortie se et ss.
* Renvoie 0, ou -1 en cas d’erreur. */
+
int tfm_ajt(struct tfm *tfm, size_t es, size_t ed, ssize_t se, ssize_t ss);
/* Obtenir l’identifiant d’un symbole symb de longueur lngr dans le
* transducteur tfm.
* Si le symbole est inconnu du transducteur, il y est ajouté de manière
- * transparente. Renvoie l’identifiant, ou -1 en cas d’erreur. */
+ * transparente.
+ * Renvoie l’identifiant, ou -1 en cas d’erreur.
+ * Prend pour acquis que lngr n’est pas plus grand que TFM_TLL_SYMB_MAX. */
ssize_t tfm_symb_id(struct tfm *tfm, char *symb, size_t lngr);
/* Placer le symbole du transducteur tfm correspondant à l’identifiant id dans
@@ -94,8 +97,4 @@ int tfm_mfinal(struct tfm *tfm, size_t ietat);
* Renvoie un booléen, ou -1 en cas d’erreur. */
int tfm_tfinal(struct tfm *tfm, size_t ietat);
-/* Obtenir le nombre de transitions sortantes de l’était ietat.
- * Renvoie ce nombre, ou -1 en cas d’erreur. */
-ssize_t tfm_ntrans(struct tfm *tfm, size_t ietat);
-
#endif