trafi

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

commit c8beb6a10af5403928380d99252c0acf8a1bc55f
parent 2621a3f54ebd9036c7360f2cb3cad701cc8cc345
Auteur: Loïc Daignault-Pichette <loic@asteride.xyz>
Date:   Fri,  3 Apr 2026 17:48:51 -0400

Supprimer deux fonctions et en ajouter une

Les fonctions tampinf_plc() et tampinf_ajt() s’accordaient mal au nouvel
esprit de la bibliothèque tampinf. Elles ont été remplacées par
tampinf_minim(), qui assure qu’un tampinf puisse contenir un élément à
un certain index, en l’agrandissant s’il le faut.

Diffstat:
Mtampinf.c | 78+++++++++++++++++-------------------------------------------------------------
Mtampinf.h | 10+++-------
2 fichiers modifiés, 20 insertions(+), 68 suppressions(-)

diff --git a/tampinf.c b/tampinf.c @@ -42,11 +42,6 @@ typedef union entete { long alignement; } Entete; -/* Faire qu’un tampon soit au moins aussi grand que lngr. - * Prend pour acquis que la longueur du tampon est inférieure à lngr. - * Renvoie l’adresse du tampon, ou NULL en cas d’erreur. */ -static void *tampinf_agr(void *ti, size_t lngr); - void * tampinf_init(size_t lngr, size_t tll) { @@ -88,44 +83,32 @@ tampinf_libr(void *ti) } void * -tampinf_plc(void *ti, size_t i, size_t n, void *elem) +tampinf_minim(void *ti, size_t i) { - TAMPINF_COHERENT(ti); - assert(n > 0); - assert(elem); - - /* Agrandir le tampon s’il est trop petit. - * La taille minimale que le tampon devrait avoir est i + n. */ - if (ENTETE(ti)->s.lngr < i + n - && (ti = tampinf_agr(ti, i + n)) == NULL) - return NULL; - - memcpy((char *)ti + (i * ENTETE(ti)->s.tll), elem, - n * ENTETE(ti)->s.tll); - - /* Mettre à jour nelem s’il le faut. */ - if (i + n > ENTETE(ti)->s.nelem) - ENTETE(ti)->s.nelem = i + n; + size_t nlngr; /* Nouvelle longueur. */ + Entete *nent; /* Nouvelle entête. */ TAMPINF_COHERENT(ti); - return ti; -} + if (ENTETE(ti)->s.lngr > i) + return ti; -void * -tampinf_ajt(void *ti, size_t n, void *elem) -{ - TAMPINF_COHERENT(ti); - assert(n > 0); - assert(elem); + /* Doubler la longueur jusqu’à ce quelle soit supérieure ou égale à la + * longueur recherchée. */ + for (nlngr = ENTETE(ti)->s.lngr; nlngr <= i; nlngr *= 2) + ; - /* Placer elem à ti->nelem. */ - if ((ti = tampinf_plc(ti, ENTETE(ti)->s.nelem, n, elem)) == NULL) + /* Agrandir le tampon et en initialiser à zéro la nouvelle partie. */ + if ((nent = realloc(ENTETE(ti), + sizeof(Entete) + nlngr * ENTETE(ti)->s.tll)) == NULL) return NULL; + memset((char *)TAMPON(nent) + nent->s.lngr * nent->s.tll, 0, + (nlngr - nent->s.lngr) * nent->s.tll); + nent->s.lngr = nlngr; - TAMPINF_COHERENT(ti); + TAMPINF_COHERENT(TAMPON(nent)); - return ti; + return TAMPON(nent); } size_t @@ -153,30 +136,3 @@ tampinf_dedans(void *ti, size_t i) return 1; return 0; } - -static void * -tampinf_agr(void *ti, size_t lngr) -{ - size_t nlngr; /* Nouvelle longueur. */ - Entete *nent; /* Nouvelle entête. */ - - TAMPINF_COHERENT(ti); - assert(ENTETE(ti)->s.lngr < lngr); - - /* Doubler la longueur jusqu’à ce quelle soit supérieure ou égale à la - * longueur recherchée. */ - for (nlngr = ENTETE(ti)->s.lngr; nlngr < lngr; nlngr *= 2) - ; - - /* Agrandir le tampon et en initialiser à zéro la nouvelle partie. */ - if ((nent = realloc(ENTETE(ti), - sizeof(Entete) + nlngr * ENTETE(ti)->s.tll)) == NULL) - return NULL; - memset((char *)TAMPON(nent) + nent->s.lngr * nent->s.tll, 0, - (nlngr - nent->s.lngr) * nent->s.tll); - nent->s.lngr = nlngr; - - TAMPINF_COHERENT(TAMPON(nent)); - - return TAMPON(nent); -} diff --git a/tampinf.h b/tampinf.h @@ -25,13 +25,9 @@ void tampinf_reinit(void *ti); /* Libérer l’espace utilisé par le tampon ti. */ void tampinf_libr(void *ti); -/* Placer n éléments contenus dans elem à l’emplacement i dans le tampon ti. - * Renvoie i, ou -1 en cas d’erreur. */ -void *tampinf_plc(void *ti, size_t i, size_t n, void *elem); - -/* Ajouter au tampon ti n éléments contenus dans elem. - * Renvoie l’indice du nouvel élément, ou -1 en cas d’erreur. */ -void *tampinf_ajt(void *ti, size_t n, void *elem); +/* Assurer que le tampon ti puisse contenir un élément à l’index i. + * Renvoie l’adresse du tampon, ou NULL en cas d’erreur. */ +void *tampinf_minim(void *ti, size_t i); /* Obtenir le nombre d’éléments contenus dans le tampon ti. */ size_t tampinf_nelem(void *ti);