trafi

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

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:
Mtfm.c | 64++++++++++++++++++++--------------------------------------------
Mtfm.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